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.
Files changed (1247) hide show
  1. package/AGENTS.md +726 -0
  2. package/LICENSE +45 -0
  3. package/NOTICE +86 -0
  4. package/README.md +46 -0
  5. package/examples/README.md +36 -0
  6. package/examples/art-first-workflow/README.md +205 -0
  7. package/examples/atari2600/main.asm +143 -0
  8. package/examples/atari2600/templates/default.asm +183 -0
  9. package/examples/atari2600/templates/mini_invaders.asm +381 -0
  10. package/examples/atari2600/templates/music_demo.asm +322 -0
  11. package/examples/atari2600/templates/paddle.asm +345 -0
  12. package/examples/atari2600/templates/single_screen.asm +242 -0
  13. package/examples/atari7800/main.c +88 -0
  14. package/examples/atari7800/templates/default.c +183 -0
  15. package/examples/atari7800/templates/hello_sprite.c +141 -0
  16. package/examples/atari7800/templates/music_demo.c +123 -0
  17. package/examples/atari7800/templates/platformer.c +159 -0
  18. package/examples/atari7800/templates/puzzle.c +164 -0
  19. package/examples/atari7800/templates/racing.c +139 -0
  20. package/examples/atari7800/templates/shmup.c +148 -0
  21. package/examples/atari7800/templates/sports.c +207 -0
  22. package/examples/c64/main.c +63 -0
  23. package/examples/c64/templates/hello_sprite.c +117 -0
  24. package/examples/c64/templates/music_demo.c +131 -0
  25. package/examples/c64/templates/platformer.c +194 -0
  26. package/examples/c64/templates/puzzle.c +178 -0
  27. package/examples/c64/templates/racing.c +140 -0
  28. package/examples/c64/templates/shmup.c +201 -0
  29. package/examples/c64/templates/sports.c +109 -0
  30. package/examples/c64/templates/tile_engine.c +174 -0
  31. package/examples/gb/main.asm +106 -0
  32. package/examples/gb/main.c +49 -0
  33. package/examples/gb/templates/default.c +58 -0
  34. package/examples/gb/templates/hello_sprite.c +130 -0
  35. package/examples/gb/templates/music_demo.c +52 -0
  36. package/examples/gb/templates/platformer.c +178 -0
  37. package/examples/gb/templates/puzzle.c +217 -0
  38. package/examples/gb/templates/racing.c +158 -0
  39. package/examples/gb/templates/shmup.c +172 -0
  40. package/examples/gb/templates/sports.c +136 -0
  41. package/examples/gb/templates/tile_engine.c +280 -0
  42. package/examples/gba/templates/gba_hello.c +64 -0
  43. package/examples/gba/templates/maxmod_demo.c +105 -0
  44. package/examples/gba/templates/platformer.c +215 -0
  45. package/examples/gba/templates/puzzle.c +237 -0
  46. package/examples/gba/templates/racing.c +175 -0
  47. package/examples/gba/templates/shmup.c +197 -0
  48. package/examples/gba/templates/sports.c +177 -0
  49. package/examples/gba/templates/tonc_hello.c +72 -0
  50. package/examples/gba/templates/tonc_hello_sprite.c +109 -0
  51. package/examples/gbc/main.asm +123 -0
  52. package/examples/gbc/templates/default.c +61 -0
  53. package/examples/gbc/templates/hello_sprite.c +140 -0
  54. package/examples/gbc/templates/music_demo.c +63 -0
  55. package/examples/gbc/templates/platformer.c +181 -0
  56. package/examples/gbc/templates/puzzle.c +217 -0
  57. package/examples/gbc/templates/racing.c +164 -0
  58. package/examples/gbc/templates/shmup.c +188 -0
  59. package/examples/gbc/templates/sports.c +142 -0
  60. package/examples/gbc/templates/tile_engine.c +280 -0
  61. package/examples/genesis/main.s +161 -0
  62. package/examples/genesis/templates/hello_sprite.c +75 -0
  63. package/examples/genesis/templates/platformer.c +166 -0
  64. package/examples/genesis/templates/puzzle.c +240 -0
  65. package/examples/genesis/templates/racing.c +170 -0
  66. package/examples/genesis/templates/sgdk_hello.c +41 -0
  67. package/examples/genesis/templates/shmup.c +188 -0
  68. package/examples/genesis/templates/shmup_2p.c +244 -0
  69. package/examples/genesis/templates/sports.c +172 -0
  70. package/examples/genesis/templates/tile_engine.c +135 -0
  71. package/examples/genesis/templates/xgm2_demo.c +53 -0
  72. package/examples/genesis/templates/xgm2_demo_data.s +27 -0
  73. package/examples/gg/main.c +10 -0
  74. package/examples/gg/templates/default.c +156 -0
  75. package/examples/gg/templates/hello_sprite.c +90 -0
  76. package/examples/gg/templates/music_demo.c +156 -0
  77. package/examples/gg/templates/platformer.c +220 -0
  78. package/examples/gg/templates/puzzle.c +204 -0
  79. package/examples/gg/templates/racing.c +161 -0
  80. package/examples/gg/templates/shmup.c +188 -0
  81. package/examples/gg/templates/sports.c +137 -0
  82. package/examples/gg/templates/tile_engine.c +137 -0
  83. package/examples/lynx/main.c +4 -0
  84. package/examples/lynx/templates/default.c +41 -0
  85. package/examples/lynx/templates/hello_sprite.c +39 -0
  86. package/examples/lynx/templates/music_demo.c +37 -0
  87. package/examples/lynx/templates/platformer.c +72 -0
  88. package/examples/lynx/templates/puzzle.c +142 -0
  89. package/examples/lynx/templates/racing.c +94 -0
  90. package/examples/lynx/templates/shmup.c +132 -0
  91. package/examples/lynx/templates/sports.c +59 -0
  92. package/examples/nes/main.c +143 -0
  93. package/examples/nes/space-shooter/README.md +68 -0
  94. package/examples/nes/space-shooter/main.c +441 -0
  95. package/examples/nes/space-shooter/nes_runtime.c +347 -0
  96. package/examples/nes/space-shooter/nes_runtime.h +141 -0
  97. package/examples/nes/templates/default.c +41 -0
  98. package/examples/nes/templates/hello_sprite.c +104 -0
  99. package/examples/nes/templates/music_demo.c +80 -0
  100. package/examples/nes/templates/platformer.c +171 -0
  101. package/examples/nes/templates/puzzle.c +232 -0
  102. package/examples/nes/templates/racing.c +203 -0
  103. package/examples/nes/templates/shmup.c +228 -0
  104. package/examples/nes/templates/sports.c +205 -0
  105. package/examples/nes/templates/tile_engine.c +224 -0
  106. package/examples/porting-across-platforms/README.md +59 -0
  107. package/examples/sms/main.c +129 -0
  108. package/examples/sms/templates/default.c +110 -0
  109. package/examples/sms/templates/hello_sprite.c +90 -0
  110. package/examples/sms/templates/music_demo.c +151 -0
  111. package/examples/sms/templates/platformer.c +215 -0
  112. package/examples/sms/templates/puzzle.c +204 -0
  113. package/examples/sms/templates/racing.c +161 -0
  114. package/examples/sms/templates/shmup.c +167 -0
  115. package/examples/sms/templates/shmup_2p.c +219 -0
  116. package/examples/sms/templates/sports.c +147 -0
  117. package/examples/sms/templates/tile_engine.c +137 -0
  118. package/examples/snes/main.asm +70 -0
  119. package/examples/snes/templates/c-hello-data.asm +28 -0
  120. package/examples/snes/templates/c-hello.c +71 -0
  121. package/examples/snes/templates/default-data.asm +36 -0
  122. package/examples/snes/templates/default.c +74 -0
  123. package/examples/snes/templates/hello_sprite-data.asm +45 -0
  124. package/examples/snes/templates/hello_sprite.c +76 -0
  125. package/examples/snes/templates/music_demo-data.asm +20 -0
  126. package/examples/snes/templates/music_demo.c +83 -0
  127. package/examples/snes/templates/platformer-data.asm +27 -0
  128. package/examples/snes/templates/platformer.c +142 -0
  129. package/examples/snes/templates/puzzle-data.asm +14 -0
  130. package/examples/snes/templates/puzzle.c +199 -0
  131. package/examples/snes/templates/racing-data.asm +33 -0
  132. package/examples/snes/templates/racing.c +146 -0
  133. package/examples/snes/templates/shmup-data.asm +61 -0
  134. package/examples/snes/templates/shmup.c +199 -0
  135. package/examples/snes/templates/sports-data.asm +28 -0
  136. package/examples/snes/templates/sports.c +144 -0
  137. package/package.json +83 -0
  138. package/src/cli/smoke.js +283 -0
  139. package/src/cores/registry.js +95 -0
  140. package/src/host/LibretroHost.js +502 -0
  141. package/src/host/callbacks.js +444 -0
  142. package/src/host/chafa-render.js +170 -0
  143. package/src/host/coreLoader.js +57 -0
  144. package/src/host/cpu-state.js +422 -0
  145. package/src/host/dsp-state.js +188 -0
  146. package/src/host/framebuffer.js +115 -0
  147. package/src/host/gpgx-state.js +309 -0
  148. package/src/host/index.js +4 -0
  149. package/src/host/retroConstants.js +72 -0
  150. package/src/host/snes9x-state.js +35 -0
  151. package/src/host/types.js +280 -0
  152. package/src/mcp/disclosure.js +250 -0
  153. package/src/mcp/log.js +87 -0
  154. package/src/mcp/server.js +433 -0
  155. package/src/mcp/state.js +83 -0
  156. package/src/mcp/tools/address-to-symbol.js +151 -0
  157. package/src/mcp/tools/art-loaders.js +740 -0
  158. package/src/mcp/tools/assets.js +89 -0
  159. package/src/mcp/tools/audio.js +173 -0
  160. package/src/mcp/tools/cart-parts.js +649 -0
  161. package/src/mcp/tools/diff-roms.js +412 -0
  162. package/src/mcp/tools/disasm.js +980 -0
  163. package/src/mcp/tools/find-references.js +361 -0
  164. package/src/mcp/tools/font-map.js +353 -0
  165. package/src/mcp/tools/frame.js +249 -0
  166. package/src/mcp/tools/free-space.js +95 -0
  167. package/src/mcp/tools/index.js +351 -0
  168. package/src/mcp/tools/input-layout.js +215 -0
  169. package/src/mcp/tools/input.js +142 -0
  170. package/src/mcp/tools/lifecycle.js +110 -0
  171. package/src/mcp/tools/lospec.js +156 -0
  172. package/src/mcp/tools/memory.js +169 -0
  173. package/src/mcp/tools/metasprite-tools.js +261 -0
  174. package/src/mcp/tools/platform-docs.js +102 -0
  175. package/src/mcp/tools/platform-tools.js +1063 -0
  176. package/src/mcp/tools/platforms.js +86 -0
  177. package/src/mcp/tools/playtest.js +280 -0
  178. package/src/mcp/tools/preview-tile.js +360 -0
  179. package/src/mcp/tools/project.js +1885 -0
  180. package/src/mcp/tools/record.js +131 -0
  181. package/src/mcp/tools/rendering-context.js +700 -0
  182. package/src/mcp/tools/rom-id.js +256 -0
  183. package/src/mcp/tools/run-until.js +173 -0
  184. package/src/mcp/tools/snippets.js +235 -0
  185. package/src/mcp/tools/splice-chr.js +215 -0
  186. package/src/mcp/tools/sprite-pipeline.js +614 -0
  187. package/src/mcp/tools/state.js +99 -0
  188. package/src/mcp/tools/symbols.js +277 -0
  189. package/src/mcp/tools/tile-inspect.js +206 -0
  190. package/src/mcp/tools/toolchain.js +680 -0
  191. package/src/mcp/tools/watch-memory.js +212 -0
  192. package/src/mcp/tools/which-tiles.js +193 -0
  193. package/src/mcp/util.js +85 -0
  194. package/src/observer/bus.js +127 -0
  195. package/src/observer/livestream.html +589 -0
  196. package/src/observer/server.js +66 -0
  197. package/src/observer/tool-wrap.js +115 -0
  198. package/src/platforms/atari2600/MENTAL_MODEL.md +185 -0
  199. package/src/platforms/atari2600/TROUBLESHOOTING.md +155 -0
  200. package/src/platforms/atari2600/UPSTREAM_SOURCES.md +49 -0
  201. package/src/platforms/atari2600/lib/README.md +67 -0
  202. package/src/platforms/atari2600/lib/cc65-src/crt0.s +49 -0
  203. package/src/platforms/atari2600/lib/cc65-src/ctype.s +5 -0
  204. package/src/platforms/atari2600/lib/kernel_skeleton.asm +85 -0
  205. package/src/platforms/atari2600/lib/player_kernel.asm +87 -0
  206. package/src/platforms/atari2600/lib/playfield_kernel.asm +63 -0
  207. package/src/platforms/atari2600/lib/read_joystick.asm +76 -0
  208. package/src/platforms/atari2600/lib/score_kernel.asm +141 -0
  209. package/src/platforms/atari2600/lib/vcs_constants.h +97 -0
  210. package/src/platforms/atari2600/lib/vectors.asm +16 -0
  211. package/src/platforms/atari2600/tia.js +355 -0
  212. package/src/platforms/atari7800/MENTAL_MODEL.md +306 -0
  213. package/src/platforms/atari7800/TROUBLESHOOTING.md +195 -0
  214. package/src/platforms/atari7800/UPSTREAM_SOURCES.md +43 -0
  215. package/src/platforms/atari7800/lib/README.md +45 -0
  216. package/src/platforms/atari7800/lib/c/atari7800_music.c +215 -0
  217. package/src/platforms/atari7800/lib/c/atari7800_music.h +33 -0
  218. package/src/platforms/atari7800/lib/c/atari7800_sfx.c +74 -0
  219. package/src/platforms/atari7800/lib/c/atari7800_sfx.h +45 -0
  220. package/src/platforms/atari7800/lib/cc65-src/clock.s +69 -0
  221. package/src/platforms/atari7800/lib/cc65-src/clocks_per_sec.s +34 -0
  222. package/src/platforms/atari7800/lib/cc65-src/clrscr.s +27 -0
  223. package/src/platforms/atari7800/lib/cc65-src/conio.s +226 -0
  224. package/src/platforms/atari7800/lib/cc65-src/conio_font.s +278 -0
  225. package/src/platforms/atari7800/lib/cc65-src/cputc.s +139 -0
  226. package/src/platforms/atari7800/lib/cc65-src/crt0.s +71 -0
  227. package/src/platforms/atari7800/lib/cc65-src/ctype.s +5 -0
  228. package/src/platforms/atari7800/lib/cc65-src/exehdr.s +46 -0
  229. package/src/platforms/atari7800/lib/cc65-src/extra/mono.s +28 -0
  230. package/src/platforms/atari7800/lib/cc65-src/extzp.inc +15 -0
  231. package/src/platforms/atari7800/lib/cc65-src/extzp.s +15 -0
  232. package/src/platforms/atari7800/lib/cc65-src/get_tv.s +65 -0
  233. package/src/platforms/atari7800/lib/cc65-src/irq.s +36 -0
  234. package/src/platforms/atari7800/lib/cc65-src/joy/atari7800-stdjoy.s +197 -0
  235. package/src/platforms/atari7800/lib/cc65-src/joy_stat_stddrv.s +14 -0
  236. package/src/platforms/atari7800/lib/cc65-src/libref.s +8 -0
  237. package/src/platforms/atari7800/lib/cc65-src/mono_clrscr.s +27 -0
  238. package/src/platforms/atari7800/lib/cc65-src/mono_conio.s +231 -0
  239. package/src/platforms/atari7800/lib/cc65-src/mono_cputc.s +102 -0
  240. package/src/platforms/atari7800/lib/cc65-src/mono_font.s +2065 -0
  241. package/src/platforms/atari7800/lib/cc65-src/mono_setcursor.s +214 -0
  242. package/src/platforms/atari7800/lib/cc65-src/setcursor.s +214 -0
  243. package/src/platforms/atari7800/lib/cc65-src/textcolor.s +53 -0
  244. package/src/platforms/atari7800/lib/cc65-src/wherex.s +19 -0
  245. package/src/platforms/atari7800/lib/cc65-src/wherey.s +19 -0
  246. package/src/platforms/atari7800/lib/display_list.asm +53 -0
  247. package/src/platforms/atari7800/lib/maria_init.asm +48 -0
  248. package/src/platforms/atari7800/lib/maria_registers.h +61 -0
  249. package/src/platforms/atari7800/lib/palette_load.asm +53 -0
  250. package/src/platforms/atari7800/lib/read_pad.asm +57 -0
  251. package/src/platforms/atari7800/lib/vblank_wait.asm +16 -0
  252. package/src/platforms/atari7800/maria.js +220 -0
  253. package/src/platforms/c64/MENTAL_MODEL.md +175 -0
  254. package/src/platforms/c64/TROUBLESHOOTING.md +130 -0
  255. package/src/platforms/c64/UPSTREAM_SOURCES.md +35 -0
  256. package/src/platforms/c64/image-to-tilemap.js +190 -0
  257. package/src/platforms/c64/lib/README.md +52 -0
  258. package/src/platforms/c64/lib/basic_stub.s +25 -0
  259. package/src/platforms/c64/lib/c/c64_music.c +248 -0
  260. package/src/platforms/c64/lib/c/c64_music.h +36 -0
  261. package/src/platforms/c64/lib/c/c64_sfx.c +94 -0
  262. package/src/platforms/c64/lib/c/c64_sfx.h +37 -0
  263. package/src/platforms/c64/lib/c64_registers.h +108 -0
  264. package/src/platforms/c64/lib/cc65-src/_scrsize.s +12 -0
  265. package/src/platforms/c64/lib/cc65-src/acc_c128_speed.s +5 -0
  266. package/src/platforms/c64/lib/cc65-src/acc_c64dtv_speed.s +64 -0
  267. package/src/platforms/c64/lib/cc65-src/acc_c65_speed.s +69 -0
  268. package/src/platforms/c64/lib/cc65-src/acc_chameleon_speed.s +100 -0
  269. package/src/platforms/c64/lib/cc65-src/acc_detect_c128.s +33 -0
  270. package/src/platforms/c64/lib/cc65-src/acc_detect_c64dtv.s +44 -0
  271. package/src/platforms/c64/lib/cc65-src/acc_detect_c65.s +55 -0
  272. package/src/platforms/c64/lib/cc65-src/acc_detect_chameleon.s +39 -0
  273. package/src/platforms/c64/lib/cc65-src/acc_detect_scpu.s +34 -0
  274. package/src/platforms/c64/lib/cc65-src/acc_detect_turbomaster.s +45 -0
  275. package/src/platforms/c64/lib/cc65-src/acc_scpu_speed.s +59 -0
  276. package/src/platforms/c64/lib/cc65-src/acc_turbomaster_speed.s +56 -0
  277. package/src/platforms/c64/lib/cc65-src/bordercolor.s +17 -0
  278. package/src/platforms/c64/lib/cc65-src/break.s +108 -0
  279. package/src/platforms/c64/lib/cc65-src/cgetc.s +62 -0
  280. package/src/platforms/c64/lib/cc65-src/clrscr.s +11 -0
  281. package/src/platforms/c64/lib/cc65-src/color.s +24 -0
  282. package/src/platforms/c64/lib/cc65-src/conio.s +10 -0
  283. package/src/platforms/c64/lib/cc65-src/cputc.s +105 -0
  284. package/src/platforms/c64/lib/cc65-src/crt0.s +117 -0
  285. package/src/platforms/c64/lib/cc65-src/devnum.s +7 -0
  286. package/src/platforms/c64/lib/cc65-src/emd/c64-65816.s +377 -0
  287. package/src/platforms/c64/lib/cc65-src/emd/c64-c256k.s +508 -0
  288. package/src/platforms/c64/lib/cc65-src/emd/c64-dqbb.s +447 -0
  289. package/src/platforms/c64/lib/cc65-src/emd/c64-georam.s +355 -0
  290. package/src/platforms/c64/lib/cc65-src/emd/c64-isepic.s +276 -0
  291. package/src/platforms/c64/lib/cc65-src/emd/c64-kerberos.s +281 -0
  292. package/src/platforms/c64/lib/cc65-src/emd/c64-ram.s +270 -0
  293. package/src/platforms/c64/lib/cc65-src/emd/c64-ramcart.s +297 -0
  294. package/src/platforms/c64/lib/cc65-src/emd/c64-reu.s +286 -0
  295. package/src/platforms/c64/lib/cc65-src/emd/c64-rrr.s +363 -0
  296. package/src/platforms/c64/lib/cc65-src/emd/c64-vdc.s +405 -0
  297. package/src/platforms/c64/lib/cc65-src/emd/dtv-himem.s +251 -0
  298. package/src/platforms/c64/lib/cc65-src/extra/soft80.s +71 -0
  299. package/src/platforms/c64/lib/cc65-src/extra/soft80mono.s +74 -0
  300. package/src/platforms/c64/lib/cc65-src/extra/tgimousedata.s +21 -0
  301. package/src/platforms/c64/lib/cc65-src/get_ostype.s +43 -0
  302. package/src/platforms/c64/lib/cc65-src/get_tv.s +20 -0
  303. package/src/platforms/c64/lib/cc65-src/gettime.s +83 -0
  304. package/src/platforms/c64/lib/cc65-src/irq.s +49 -0
  305. package/src/platforms/c64/lib/cc65-src/joy/c64-hitjoy.s +218 -0
  306. package/src/platforms/c64/lib/cc65-src/joy/c64-numpad.s +155 -0
  307. package/src/platforms/c64/lib/cc65-src/joy/c64-ptvjoy.s +146 -0
  308. package/src/platforms/c64/lib/cc65-src/joy/c64-stdjoy.s +111 -0
  309. package/src/platforms/c64/lib/cc65-src/joy_stat_stddrv.s +14 -0
  310. package/src/platforms/c64/lib/cc65-src/joy_stddrv.s +14 -0
  311. package/src/platforms/c64/lib/cc65-src/kbhit.s +23 -0
  312. package/src/platforms/c64/lib/cc65-src/kbrepeat.s +14 -0
  313. package/src/platforms/c64/lib/cc65-src/kernal.s +53 -0
  314. package/src/platforms/c64/lib/cc65-src/kplot.s +22 -0
  315. package/src/platforms/c64/lib/cc65-src/libref.s +16 -0
  316. package/src/platforms/c64/lib/cc65-src/mainargs.s +137 -0
  317. package/src/platforms/c64/lib/cc65-src/mcbdefault.s +146 -0
  318. package/src/platforms/c64/lib/cc65-src/mcbspritedata.s +4 -0
  319. package/src/platforms/c64/lib/cc65-src/mou/c64-1351.s +467 -0
  320. package/src/platforms/c64/lib/cc65-src/mou/c64-inkwell.s +446 -0
  321. package/src/platforms/c64/lib/cc65-src/mou/c64-joy.s +451 -0
  322. package/src/platforms/c64/lib/cc65-src/mou/c64-pot.s +409 -0
  323. package/src/platforms/c64/lib/cc65-src/mouse_stat_stddrv.s +14 -0
  324. package/src/platforms/c64/lib/cc65-src/mouse_stddrv.s +14 -0
  325. package/src/platforms/c64/lib/cc65-src/mouseref.s +23 -0
  326. package/src/platforms/c64/lib/cc65-src/pencalib.c +94 -0
  327. package/src/platforms/c64/lib/cc65-src/randomize.s +18 -0
  328. package/src/platforms/c64/lib/cc65-src/revers.s +27 -0
  329. package/src/platforms/c64/lib/cc65-src/ser/c64-swlink.s +484 -0
  330. package/src/platforms/c64/lib/cc65-src/ser_stat_stddrv.s +14 -0
  331. package/src/platforms/c64/lib/cc65-src/ser_stddrv.s +13 -0
  332. package/src/platforms/c64/lib/cc65-src/settime.s +84 -0
  333. package/src/platforms/c64/lib/cc65-src/soft80.inc +46 -0
  334. package/src/platforms/c64/lib/cc65-src/soft80_cgetc.s +85 -0
  335. package/src/platforms/c64/lib/cc65-src/soft80_charset.s +182 -0
  336. package/src/platforms/c64/lib/cc65-src/soft80_color.s +159 -0
  337. package/src/platforms/c64/lib/cc65-src/soft80_conio.s +157 -0
  338. package/src/platforms/c64/lib/cc65-src/soft80_cpeekc.s +148 -0
  339. package/src/platforms/c64/lib/cc65-src/soft80_cpeekcolor.s +19 -0
  340. package/src/platforms/c64/lib/cc65-src/soft80_cpeekrevers.s +15 -0
  341. package/src/platforms/c64/lib/cc65-src/soft80_cpeeks.s +71 -0
  342. package/src/platforms/c64/lib/cc65-src/soft80_cputc.s +521 -0
  343. package/src/platforms/c64/lib/cc65-src/soft80_kclrscr.s +76 -0
  344. package/src/platforms/c64/lib/cc65-src/soft80_kplot.s +63 -0
  345. package/src/platforms/c64/lib/cc65-src/soft80_scrsize.s +14 -0
  346. package/src/platforms/c64/lib/cc65-src/soft80mono_cgetc.s +67 -0
  347. package/src/platforms/c64/lib/cc65-src/soft80mono_color.s +65 -0
  348. package/src/platforms/c64/lib/cc65-src/soft80mono_conio.s +168 -0
  349. package/src/platforms/c64/lib/cc65-src/soft80mono_cpeekcolor.s +17 -0
  350. package/src/platforms/c64/lib/cc65-src/soft80mono_cputc.s +204 -0
  351. package/src/platforms/c64/lib/cc65-src/soft80mono_kclrscr.s +63 -0
  352. package/src/platforms/c64/lib/cc65-src/soft80mono_kplot.s +52 -0
  353. package/src/platforms/c64/lib/cc65-src/status.s +15 -0
  354. package/src/platforms/c64/lib/cc65-src/sysuname.s +37 -0
  355. package/src/platforms/c64/lib/cc65-src/tgi/c64-hi.s +881 -0
  356. package/src/platforms/c64/lib/cc65-src/tgi_stat_stddrv.s +14 -0
  357. package/src/platforms/c64/lib/cc65-src/tgi_stddrv.s +13 -0
  358. package/src/platforms/c64/lib/cc65-src/tmcommon.s +67 -0
  359. package/src/platforms/c64/lib/cc65-src/waitvsync.s +18 -0
  360. package/src/platforms/c64/lib/read_joystick.s +28 -0
  361. package/src/platforms/c64/lib/sid_play.s +48 -0
  362. package/src/platforms/c64/lib/sprite_table.s +73 -0
  363. package/src/platforms/c64/lib/vic_init.s +47 -0
  364. package/src/platforms/c64/sid.js +128 -0
  365. package/src/platforms/c64/vic.js +273 -0
  366. package/src/platforms/common/default-palette.js +139 -0
  367. package/src/platforms/common/image-to-tiles.js +407 -0
  368. package/src/platforms/common/intent.js +111 -0
  369. package/src/platforms/common/metasprite-adapters.js +279 -0
  370. package/src/platforms/common/metasprite-codegen.js +192 -0
  371. package/src/platforms/common/metasprite-core.js +201 -0
  372. package/src/platforms/common/metasprite.js +89 -0
  373. package/src/platforms/common/platform-palette.js +137 -0
  374. package/src/platforms/common/registers.js +329 -0
  375. package/src/platforms/common/render-tiles.js +86 -0
  376. package/src/platforms/common/screenshot-sprite.js +153 -0
  377. package/src/platforms/common/tile-decode.js +149 -0
  378. package/src/platforms/gb/MENTAL_MODEL.md +252 -0
  379. package/src/platforms/gb/TROUBLESHOOTING.md +221 -0
  380. package/src/platforms/gb/UPSTREAM_SOURCES.md +43 -0
  381. package/src/platforms/gb/image-to-tilemap.js +173 -0
  382. package/src/platforms/gb/lib/README.md +115 -0
  383. package/src/platforms/gb/lib/c/LICENSE-HUGEDRIVER +25 -0
  384. package/src/platforms/gb/lib/c/README.md +120 -0
  385. package/src/platforms/gb/lib/c/SDCC_GOTCHAS.md +189 -0
  386. package/src/platforms/gb/lib/c/gb_crt0.s +163 -0
  387. package/src/platforms/gb/lib/c/gb_hardware.h +113 -0
  388. package/src/platforms/gb/lib/c/gb_runtime.c +284 -0
  389. package/src/platforms/gb/lib/c/gb_runtime.h +145 -0
  390. package/src/platforms/gb/lib/c/hUGEDriver.c +191 -0
  391. package/src/platforms/gb/lib/c/hUGEDriver.h +95 -0
  392. package/src/platforms/gb/lib/c/hUGEDriver.upstream.asm +1908 -0
  393. package/src/platforms/gb/lib/c/lcd_init.c +19 -0
  394. package/src/platforms/gb/lib/c/patch-header.js +154 -0
  395. package/src/platforms/gb/lib/c/song_data.c +88 -0
  396. package/src/platforms/gb/lib/c/unroll.h +52 -0
  397. package/src/platforms/gb/lib/c/wait_vblank.c +14 -0
  398. package/src/platforms/gb/lib/dma_oam.asm +51 -0
  399. package/src/platforms/gb/lib/header.asm +56 -0
  400. package/src/platforms/gb/lib/joypad_read.asm +47 -0
  401. package/src/platforms/gb/lib/lcd_init.asm +44 -0
  402. package/src/platforms/gb/lib/load_palette.asm +25 -0
  403. package/src/platforms/gb/lib/load_tiles.asm +29 -0
  404. package/src/platforms/gb/lib/vblank_wait.asm +31 -0
  405. package/src/platforms/gb/ppu.js +574 -0
  406. package/src/platforms/gba/MENTAL_MODEL.md +203 -0
  407. package/src/platforms/gba/TROUBLESHOOTING.md +250 -0
  408. package/src/platforms/gba/UPSTREAM_SOURCES.md +41 -0
  409. package/src/platforms/gba/lib/arm-archives/libc.a +0 -0
  410. package/src/platforms/gba/lib/arm-archives/libgcc.a +0 -0
  411. package/src/platforms/gba/lib/arm-archives/libnosys.a +0 -0
  412. package/src/platforms/gba/lib/c/gba_sfx.c +81 -0
  413. package/src/platforms/gba/lib/c/gba_sfx.h +48 -0
  414. package/src/platforms/gba/lib/libgba/crtbegin.o +0 -0
  415. package/src/platforms/gba/lib/libgba/crtend.o +0 -0
  416. package/src/platforms/gba/lib/libgba/crti.o +0 -0
  417. package/src/platforms/gba/lib/libgba/crtn.o +0 -0
  418. package/src/platforms/gba/lib/libgba/gba_cart.ld +319 -0
  419. package/src/platforms/gba/lib/libgba/gba_crt0.s +258 -0
  420. package/src/platforms/gba/lib/libgba/include/BoyScout.h +128 -0
  421. package/src/platforms/gba/lib/libgba/include/disc.h +36 -0
  422. package/src/platforms/gba/lib/libgba/include/disc_io.h +64 -0
  423. package/src/platforms/gba/lib/libgba/include/dldi.h +112 -0
  424. package/src/platforms/gba/lib/libgba/include/erapi.h +195 -0
  425. package/src/platforms/gba/lib/libgba/include/fade.h +76 -0
  426. package/src/platforms/gba/lib/libgba/include/gba.h +47 -0
  427. package/src/platforms/gba/lib/libgba/include/gba_affine.h +83 -0
  428. package/src/platforms/gba/lib/libgba/include/gba_base.h +122 -0
  429. package/src/platforms/gba/lib/libgba/include/gba_compression.h +66 -0
  430. package/src/platforms/gba/lib/libgba/include/gba_console.h +55 -0
  431. package/src/platforms/gba/lib/libgba/include/gba_dma.h +100 -0
  432. package/src/platforms/gba/lib/libgba/include/gba_input.h +127 -0
  433. package/src/platforms/gba/lib/libgba/include/gba_interrupt.h +146 -0
  434. package/src/platforms/gba/lib/libgba/include/gba_multiboot.h +72 -0
  435. package/src/platforms/gba/lib/libgba/include/gba_sio.h +124 -0
  436. package/src/platforms/gba/lib/libgba/include/gba_sound.h +356 -0
  437. package/src/platforms/gba/lib/libgba/include/gba_sprites.h +195 -0
  438. package/src/platforms/gba/lib/libgba/include/gba_systemcalls.h +194 -0
  439. package/src/platforms/gba/lib/libgba/include/gba_timers.h +63 -0
  440. package/src/platforms/gba/lib/libgba/include/gba_types.h +60 -0
  441. package/src/platforms/gba/lib/libgba/include/gba_video.h +307 -0
  442. package/src/platforms/gba/lib/libgba/include/mappy.h +72 -0
  443. package/src/platforms/gba/lib/libgba/include/mbv2.h +90 -0
  444. package/src/platforms/gba/lib/libgba/include/xcomms.h +93 -0
  445. package/src/platforms/gba/lib/libgba/include/xcomms_cmd.h +53 -0
  446. package/src/platforms/gba/lib/libgba/libgba.seed.a +0 -0
  447. package/src/platforms/gba/lib/libgba/libgba.seed.hash +1 -0
  448. package/src/platforms/gba/lib/libgba/src/AffineSet.c +42 -0
  449. package/src/platforms/gba/lib/libgba/src/ArcTan.s +41 -0
  450. package/src/platforms/gba/lib/libgba/src/BoyScout/BoyScout.c +1242 -0
  451. package/src/platforms/gba/lib/libgba/src/BoyScout/GBASoundRegs.h +200 -0
  452. package/src/platforms/gba/lib/libgba/src/Compression.c +84 -0
  453. package/src/platforms/gba/lib/libgba/src/CpuSet.c +41 -0
  454. package/src/platforms/gba/lib/libgba/src/Div.s +58 -0
  455. package/src/platforms/gba/lib/libgba/src/DivArm.s +50 -0
  456. package/src/platforms/gba/lib/libgba/src/InterruptDispatcher.s +113 -0
  457. package/src/platforms/gba/lib/libgba/src/IntrWait.c +35 -0
  458. package/src/platforms/gba/lib/libgba/src/MultiBoot.s +33 -0
  459. package/src/platforms/gba/lib/libgba/src/Reset.s +49 -0
  460. package/src/platforms/gba/lib/libgba/src/Sound.s +48 -0
  461. package/src/platforms/gba/lib/libgba/src/Sqrt.s +34 -0
  462. package/src/platforms/gba/lib/libgba/src/disc_io/disc.c +58 -0
  463. package/src/platforms/gba/lib/libgba/src/disc_io/dldi.c +189 -0
  464. package/src/platforms/gba/lib/libgba/src/disc_io/dldi_stub.s +78 -0
  465. package/src/platforms/gba/lib/libgba/src/disc_io/io_cf_common.c +260 -0
  466. package/src/platforms/gba/lib/libgba/src/disc_io/io_cf_common.h +72 -0
  467. package/src/platforms/gba/lib/libgba/src/disc_io/io_m3_common.c +60 -0
  468. package/src/platforms/gba/lib/libgba/src/disc_io/io_m3_common.h +48 -0
  469. package/src/platforms/gba/lib/libgba/src/disc_io/io_m3cf.c +83 -0
  470. package/src/platforms/gba/lib/libgba/src/disc_io/io_m3cf.h +45 -0
  471. package/src/platforms/gba/lib/libgba/src/disc_io/io_m3sd.c +508 -0
  472. package/src/platforms/gba/lib/libgba/src/disc_io/io_m3sd.h +45 -0
  473. package/src/platforms/gba/lib/libgba/src/disc_io/io_mpcf.c +87 -0
  474. package/src/platforms/gba/lib/libgba/src/disc_io/io_mpcf.h +42 -0
  475. package/src/platforms/gba/lib/libgba/src/disc_io/io_sc_common.c +47 -0
  476. package/src/platforms/gba/lib/libgba/src/disc_io/io_sc_common.h +43 -0
  477. package/src/platforms/gba/lib/libgba/src/disc_io/io_sccf.c +83 -0
  478. package/src/platforms/gba/lib/libgba/src/disc_io/io_sccf.h +45 -0
  479. package/src/platforms/gba/lib/libgba/src/disc_io/io_scsd.c +385 -0
  480. package/src/platforms/gba/lib/libgba/src/disc_io/io_scsd.h +48 -0
  481. package/src/platforms/gba/lib/libgba/src/disc_io/io_scsd_s.s +139 -0
  482. package/src/platforms/gba/lib/libgba/src/disc_io/io_sd_common.c +203 -0
  483. package/src/platforms/gba/lib/libgba/src/disc_io/io_sd_common.h +108 -0
  484. package/src/platforms/gba/lib/libgba/src/fade.c +185 -0
  485. package/src/platforms/gba/lib/libgba/src/input.c +127 -0
  486. package/src/platforms/gba/lib/libgba/src/interrupt.c +116 -0
  487. package/src/platforms/gba/lib/libgba/src/mappy_print.c +74 -0
  488. package/src/platforms/gba/lib/libgba/src/mb2print.c +69 -0
  489. package/src/platforms/gba/lib/libgba/src/mbv2.c +230 -0
  490. package/src/platforms/gba/lib/libgba/src/mbv2.txt +119 -0
  491. package/src/platforms/gba/lib/libgba/src/xcomms.c +203 -0
  492. package/src/platforms/gba/lib/libgba/src/xcomms_print.c +56 -0
  493. package/src/platforms/gba/lib/libgba/sysinclude/_ansi.h +82 -0
  494. package/src/platforms/gba/lib/libgba/sysinclude/_newlib_version.h +11 -0
  495. package/src/platforms/gba/lib/libgba/sysinclude/_syslist.h +41 -0
  496. package/src/platforms/gba/lib/libgba/sysinclude/alloca.h +21 -0
  497. package/src/platforms/gba/lib/libgba/sysinclude/ar.h +65 -0
  498. package/src/platforms/gba/lib/libgba/sysinclude/argz.h +33 -0
  499. package/src/platforms/gba/lib/libgba/sysinclude/assert.h +50 -0
  500. package/src/platforms/gba/lib/libgba/sysinclude/complex.h +150 -0
  501. package/src/platforms/gba/lib/libgba/sysinclude/cpio.h +30 -0
  502. package/src/platforms/gba/lib/libgba/sysinclude/ctype.h +183 -0
  503. package/src/platforms/gba/lib/libgba/sysinclude/devctl.h +78 -0
  504. package/src/platforms/gba/lib/libgba/sysinclude/dirent.h +85 -0
  505. package/src/platforms/gba/lib/libgba/sysinclude/elf.h +3147 -0
  506. package/src/platforms/gba/lib/libgba/sysinclude/envlock.h +15 -0
  507. package/src/platforms/gba/lib/libgba/sysinclude/envz.h +16 -0
  508. package/src/platforms/gba/lib/libgba/sysinclude/errno.h +11 -0
  509. package/src/platforms/gba/lib/libgba/sysinclude/fastmath.h +13 -0
  510. package/src/platforms/gba/lib/libgba/sysinclude/fcntl.h +1 -0
  511. package/src/platforms/gba/lib/libgba/sysinclude/fenv.h +42 -0
  512. package/src/platforms/gba/lib/libgba/sysinclude/float.h +631 -0
  513. package/src/platforms/gba/lib/libgba/sysinclude/fnmatch.h +55 -0
  514. package/src/platforms/gba/lib/libgba/sysinclude/ftw.h +66 -0
  515. package/src/platforms/gba/lib/libgba/sysinclude/getopt.h +185 -0
  516. package/src/platforms/gba/lib/libgba/sysinclude/glob.h +90 -0
  517. package/src/platforms/gba/lib/libgba/sysinclude/grp.h +86 -0
  518. package/src/platforms/gba/lib/libgba/sysinclude/iconv.h +63 -0
  519. package/src/platforms/gba/lib/libgba/sysinclude/ieeefp.h +295 -0
  520. package/src/platforms/gba/lib/libgba/sysinclude/inttypes.h +345 -0
  521. package/src/platforms/gba/lib/libgba/sysinclude/iso646.h +45 -0
  522. package/src/platforms/gba/lib/libgba/sysinclude/langinfo.h +332 -0
  523. package/src/platforms/gba/lib/libgba/sysinclude/libgen.h +37 -0
  524. package/src/platforms/gba/lib/libgba/sysinclude/limits.h +168 -0
  525. package/src/platforms/gba/lib/libgba/sysinclude/locale.h +96 -0
  526. package/src/platforms/gba/lib/libgba/sysinclude/machine/_arc4random.h +1 -0
  527. package/src/platforms/gba/lib/libgba/sysinclude/machine/_default_types.h +250 -0
  528. package/src/platforms/gba/lib/libgba/sysinclude/machine/_endian.h +39 -0
  529. package/src/platforms/gba/lib/libgba/sysinclude/machine/_time.h +3 -0
  530. package/src/platforms/gba/lib/libgba/sysinclude/machine/_types.h +8 -0
  531. package/src/platforms/gba/lib/libgba/sysinclude/machine/ansi.h +1 -0
  532. package/src/platforms/gba/lib/libgba/sysinclude/machine/endian.h +69 -0
  533. package/src/platforms/gba/lib/libgba/sysinclude/machine/fastmath.h +98 -0
  534. package/src/platforms/gba/lib/libgba/sysinclude/machine/ieee.h +127 -0
  535. package/src/platforms/gba/lib/libgba/sysinclude/machine/ieeefp.h +533 -0
  536. package/src/platforms/gba/lib/libgba/sysinclude/machine/malloc.h +8 -0
  537. package/src/platforms/gba/lib/libgba/sysinclude/machine/param.h +8 -0
  538. package/src/platforms/gba/lib/libgba/sysinclude/machine/setjmp-dj.h +43 -0
  539. package/src/platforms/gba/lib/libgba/sysinclude/machine/setjmp.h +524 -0
  540. package/src/platforms/gba/lib/libgba/sysinclude/machine/stdlib.h +8 -0
  541. package/src/platforms/gba/lib/libgba/sysinclude/machine/termios.h +1 -0
  542. package/src/platforms/gba/lib/libgba/sysinclude/machine/time.h +15 -0
  543. package/src/platforms/gba/lib/libgba/sysinclude/machine/types.h +13 -0
  544. package/src/platforms/gba/lib/libgba/sysinclude/malloc.h +173 -0
  545. package/src/platforms/gba/lib/libgba/sysinclude/math.h +645 -0
  546. package/src/platforms/gba/lib/libgba/sysinclude/memory.h +4 -0
  547. package/src/platforms/gba/lib/libgba/sysinclude/ndbm.h +91 -0
  548. package/src/platforms/gba/lib/libgba/sysinclude/newlib.h +427 -0
  549. package/src/platforms/gba/lib/libgba/sysinclude/paths.h +9 -0
  550. package/src/platforms/gba/lib/libgba/sysinclude/pthread.h +456 -0
  551. package/src/platforms/gba/lib/libgba/sysinclude/pwd.h +83 -0
  552. package/src/platforms/gba/lib/libgba/sysinclude/reent.h +190 -0
  553. package/src/platforms/gba/lib/libgba/sysinclude/regdef.h +7 -0
  554. package/src/platforms/gba/lib/libgba/sysinclude/regex.h +103 -0
  555. package/src/platforms/gba/lib/libgba/sysinclude/sched.h +112 -0
  556. package/src/platforms/gba/lib/libgba/sysinclude/search.h +64 -0
  557. package/src/platforms/gba/lib/libgba/sysinclude/setjmp.h +25 -0
  558. package/src/platforms/gba/lib/libgba/sysinclude/signal.h +35 -0
  559. package/src/platforms/gba/lib/libgba/sysinclude/spawn.h +111 -0
  560. package/src/platforms/gba/lib/libgba/sysinclude/ssp/ssp.h +76 -0
  561. package/src/platforms/gba/lib/libgba/sysinclude/ssp/stdio.h +101 -0
  562. package/src/platforms/gba/lib/libgba/sysinclude/ssp/stdlib.h +30 -0
  563. package/src/platforms/gba/lib/libgba/sysinclude/ssp/string.h +115 -0
  564. package/src/platforms/gba/lib/libgba/sysinclude/ssp/strings.h +55 -0
  565. package/src/platforms/gba/lib/libgba/sysinclude/ssp/unistd.h +93 -0
  566. package/src/platforms/gba/lib/libgba/sysinclude/ssp/wchar.h +97 -0
  567. package/src/platforms/gba/lib/libgba/sysinclude/stdarg.h +135 -0
  568. package/src/platforms/gba/lib/libgba/sysinclude/stdatomic.h +409 -0
  569. package/src/platforms/gba/lib/libgba/sysinclude/stdbool.h +51 -0
  570. package/src/platforms/gba/lib/libgba/sysinclude/stddef.h +463 -0
  571. package/src/platforms/gba/lib/libgba/sysinclude/stdint.h +466 -0
  572. package/src/platforms/gba/lib/libgba/sysinclude/stdio.h +807 -0
  573. package/src/platforms/gba/lib/libgba/sysinclude/stdio_ext.h +79 -0
  574. package/src/platforms/gba/lib/libgba/sysinclude/stdlib.h +345 -0
  575. package/src/platforms/gba/lib/libgba/sysinclude/string.h +183 -0
  576. package/src/platforms/gba/lib/libgba/sysinclude/strings.h +80 -0
  577. package/src/platforms/gba/lib/libgba/sysinclude/sys/_default_fcntl.h +241 -0
  578. package/src/platforms/gba/lib/libgba/sysinclude/sys/_intsup.h +199 -0
  579. package/src/platforms/gba/lib/libgba/sysinclude/sys/_locale.h +12 -0
  580. package/src/platforms/gba/lib/libgba/sysinclude/sys/_pthreadtypes.h +233 -0
  581. package/src/platforms/gba/lib/libgba/sysinclude/sys/_sigset.h +43 -0
  582. package/src/platforms/gba/lib/libgba/sysinclude/sys/_stdint.h +90 -0
  583. package/src/platforms/gba/lib/libgba/sysinclude/sys/_timespec.h +52 -0
  584. package/src/platforms/gba/lib/libgba/sysinclude/sys/_timeval.h +60 -0
  585. package/src/platforms/gba/lib/libgba/sysinclude/sys/_types.h +228 -0
  586. package/src/platforms/gba/lib/libgba/sysinclude/sys/_tz_structs.h +24 -0
  587. package/src/platforms/gba/lib/libgba/sysinclude/sys/cdefs.h +754 -0
  588. package/src/platforms/gba/lib/libgba/sysinclude/sys/config.h +314 -0
  589. package/src/platforms/gba/lib/libgba/sysinclude/sys/custom_file.h +2 -0
  590. package/src/platforms/gba/lib/libgba/sysinclude/sys/dir.h +10 -0
  591. package/src/platforms/gba/lib/libgba/sysinclude/sys/dirent.h +13 -0
  592. package/src/platforms/gba/lib/libgba/sysinclude/sys/endian.h +207 -0
  593. package/src/platforms/gba/lib/libgba/sysinclude/sys/errno.h +198 -0
  594. package/src/platforms/gba/lib/libgba/sysinclude/sys/fcntl.h +12 -0
  595. package/src/platforms/gba/lib/libgba/sysinclude/sys/features.h +551 -0
  596. package/src/platforms/gba/lib/libgba/sysinclude/sys/fenv.h +90 -0
  597. package/src/platforms/gba/lib/libgba/sysinclude/sys/file.h +2 -0
  598. package/src/platforms/gba/lib/libgba/sysinclude/sys/iconvnls.h +77 -0
  599. package/src/platforms/gba/lib/libgba/sysinclude/sys/iosupport.h +143 -0
  600. package/src/platforms/gba/lib/libgba/sysinclude/sys/lock.h +75 -0
  601. package/src/platforms/gba/lib/libgba/sysinclude/sys/param.h +35 -0
  602. package/src/platforms/gba/lib/libgba/sysinclude/sys/queue.h +919 -0
  603. package/src/platforms/gba/lib/libgba/sysinclude/sys/reent.h +913 -0
  604. package/src/platforms/gba/lib/libgba/sysinclude/sys/resource.h +24 -0
  605. package/src/platforms/gba/lib/libgba/sysinclude/sys/sched.h +69 -0
  606. package/src/platforms/gba/lib/libgba/sysinclude/sys/select.h +94 -0
  607. package/src/platforms/gba/lib/libgba/sysinclude/sys/signal.h +388 -0
  608. package/src/platforms/gba/lib/libgba/sysinclude/sys/stat.h +179 -0
  609. package/src/platforms/gba/lib/libgba/sysinclude/sys/statvfs.h +41 -0
  610. package/src/platforms/gba/lib/libgba/sysinclude/sys/stdio.h +27 -0
  611. package/src/platforms/gba/lib/libgba/sysinclude/sys/string.h +2 -0
  612. package/src/platforms/gba/lib/libgba/sysinclude/sys/syslimits.h +61 -0
  613. package/src/platforms/gba/lib/libgba/sysinclude/sys/time.h +448 -0
  614. package/src/platforms/gba/lib/libgba/sysinclude/sys/timeb.h +40 -0
  615. package/src/platforms/gba/lib/libgba/sysinclude/sys/times.h +32 -0
  616. package/src/platforms/gba/lib/libgba/sysinclude/sys/timespec.h +63 -0
  617. package/src/platforms/gba/lib/libgba/sysinclude/sys/tree.h +864 -0
  618. package/src/platforms/gba/lib/libgba/sysinclude/sys/types.h +228 -0
  619. package/src/platforms/gba/lib/libgba/sysinclude/sys/unistd.h +591 -0
  620. package/src/platforms/gba/lib/libgba/sysinclude/sys/utime.h +22 -0
  621. package/src/platforms/gba/lib/libgba/sysinclude/sys/wait.h +44 -0
  622. package/src/platforms/gba/lib/libgba/sysinclude/tar.h +43 -0
  623. package/src/platforms/gba/lib/libgba/sysinclude/termios.h +7 -0
  624. package/src/platforms/gba/lib/libgba/sysinclude/tgmath.h +127 -0
  625. package/src/platforms/gba/lib/libgba/sysinclude/threads.h +93 -0
  626. package/src/platforms/gba/lib/libgba/sysinclude/time.h +313 -0
  627. package/src/platforms/gba/lib/libgba/sysinclude/unctrl.h +42 -0
  628. package/src/platforms/gba/lib/libgba/sysinclude/unistd.h +6 -0
  629. package/src/platforms/gba/lib/libgba/sysinclude/utime.h +12 -0
  630. package/src/platforms/gba/lib/libgba/sysinclude/utmp.h +8 -0
  631. package/src/platforms/gba/lib/libgba/sysinclude/varargs.h +7 -0
  632. package/src/platforms/gba/lib/libgba/sysinclude/wchar.h +339 -0
  633. package/src/platforms/gba/lib/libgba/sysinclude/wctype.h +74 -0
  634. package/src/platforms/gba/lib/libgba/sysinclude/wordexp.h +53 -0
  635. package/src/platforms/gba/lib/libtonc/crtbegin.o +0 -0
  636. package/src/platforms/gba/lib/libtonc/crtend.o +0 -0
  637. package/src/platforms/gba/lib/libtonc/crti.o +0 -0
  638. package/src/platforms/gba/lib/libtonc/crtn.o +0 -0
  639. package/src/platforms/gba/lib/libtonc/gba_cart.ld +319 -0
  640. package/src/platforms/gba/lib/libtonc/gba_crt0.s +258 -0
  641. package/src/platforms/gba/lib/libtonc/include/tonc.h +72 -0
  642. package/src/platforms/gba/lib/libtonc/include/tonc_asminc.h +132 -0
  643. package/src/platforms/gba/lib/libtonc/include/tonc_bios.h +555 -0
  644. package/src/platforms/gba/lib/libtonc/include/tonc_core.h +573 -0
  645. package/src/platforms/gba/lib/libtonc/include/tonc_input.h +184 -0
  646. package/src/platforms/gba/lib/libtonc/include/tonc_irq.h +121 -0
  647. package/src/platforms/gba/lib/libtonc/include/tonc_legacy.h +481 -0
  648. package/src/platforms/gba/lib/libtonc/include/tonc_libgba.h +537 -0
  649. package/src/platforms/gba/lib/libtonc/include/tonc_math.h +692 -0
  650. package/src/platforms/gba/lib/libtonc/include/tonc_memdef.h +962 -0
  651. package/src/platforms/gba/lib/libtonc/include/tonc_memmap.h +583 -0
  652. package/src/platforms/gba/lib/libtonc/include/tonc_nocash.h +51 -0
  653. package/src/platforms/gba/lib/libtonc/include/tonc_oam.h +186 -0
  654. package/src/platforms/gba/lib/libtonc/include/tonc_surface.h +461 -0
  655. package/src/platforms/gba/lib/libtonc/include/tonc_text.h +270 -0
  656. package/src/platforms/gba/lib/libtonc/include/tonc_tte.h +748 -0
  657. package/src/platforms/gba/lib/libtonc/include/tonc_types.h +376 -0
  658. package/src/platforms/gba/lib/libtonc/include/tonc_video.h +615 -0
  659. package/src/platforms/gba/lib/libtonc/libtonc.seed.a +0 -0
  660. package/src/platforms/gba/lib/libtonc/libtonc.seed.hash +1 -0
  661. package/src/platforms/gba/lib/libtonc/src/asm/clr_blend_fast.s +72 -0
  662. package/src/platforms/gba/lib/libtonc/src/asm/clr_fade_fast.s +74 -0
  663. package/src/platforms/gba/lib/libtonc/src/asm/div_lut.s +54 -0
  664. package/src/platforms/gba/lib/libtonc/src/asm/sin_lut.s +90 -0
  665. package/src/platforms/gba/lib/libtonc/src/asm/tonc_bios.s +289 -0
  666. package/src/platforms/gba/lib/libtonc/src/asm/tonc_bios_ex.s +97 -0
  667. package/src/platforms/gba/lib/libtonc/src/asm/tonc_isr_master.s +92 -0
  668. package/src/platforms/gba/lib/libtonc/src/asm/tonc_isr_nest.s +98 -0
  669. package/src/platforms/gba/lib/libtonc/src/asm/tonc_memcpy.s +126 -0
  670. package/src/platforms/gba/lib/libtonc/src/asm/tonc_memset.s +123 -0
  671. package/src/platforms/gba/lib/libtonc/src/asm/tonc_nocash.s +73 -0
  672. package/src/platforms/gba/lib/libtonc/src/font/sys8.png +0 -0
  673. package/src/platforms/gba/lib/libtonc/src/font/sys8.s +46 -0
  674. package/src/platforms/gba/lib/libtonc/src/font/verdana10.png +0 -0
  675. package/src/platforms/gba/lib/libtonc/src/font/verdana10.s +293 -0
  676. package/src/platforms/gba/lib/libtonc/src/font/verdana9.png +0 -0
  677. package/src/platforms/gba/lib/libtonc/src/font/verdana9.s +167 -0
  678. package/src/platforms/gba/lib/libtonc/src/font/verdana9_b4.png +0 -0
  679. package/src/platforms/gba/lib/libtonc/src/font/verdana9_b4.s +545 -0
  680. package/src/platforms/gba/lib/libtonc/src/font/verdana9b.png +0 -0
  681. package/src/platforms/gba/lib/libtonc/src/font/verdana9b.s +167 -0
  682. package/src/platforms/gba/lib/libtonc/src/font/verdana9i.png +0 -0
  683. package/src/platforms/gba/lib/libtonc/src/font/verdana9i.s +167 -0
  684. package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_bitmap.c +289 -0
  685. package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_text.c +81 -0
  686. package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_text_bm.c +244 -0
  687. package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_text_map.c +122 -0
  688. package/src/platforms/gba/lib/libtonc/src/pre1.3/tonc_text_oam.c +113 -0
  689. package/src/platforms/gba/lib/libtonc/src/pre1.3/toncfont.s +43 -0
  690. package/src/platforms/gba/lib/libtonc/src/tonc_bg.c +61 -0
  691. package/src/platforms/gba/lib/libtonc/src/tonc_bg_affine.c +112 -0
  692. package/src/platforms/gba/lib/libtonc/src/tonc_bmp16.c +240 -0
  693. package/src/platforms/gba/lib/libtonc/src/tonc_bmp8.c +314 -0
  694. package/src/platforms/gba/lib/libtonc/src/tonc_color.c +368 -0
  695. package/src/platforms/gba/lib/libtonc/src/tonc_core.c +237 -0
  696. package/src/platforms/gba/lib/libtonc/src/tonc_input.c +118 -0
  697. package/src/platforms/gba/lib/libtonc/src/tonc_irq.c +271 -0
  698. package/src/platforms/gba/lib/libtonc/src/tonc_math.c +54 -0
  699. package/src/platforms/gba/lib/libtonc/src/tonc_oam.c +76 -0
  700. package/src/platforms/gba/lib/libtonc/src/tonc_obj_affine.c +146 -0
  701. package/src/platforms/gba/lib/libtonc/src/tonc_sbmp16.c +369 -0
  702. package/src/platforms/gba/lib/libtonc/src/tonc_sbmp8.c +405 -0
  703. package/src/platforms/gba/lib/libtonc/src/tonc_schr4c.c +588 -0
  704. package/src/platforms/gba/lib/libtonc/src/tonc_schr4r.c +462 -0
  705. package/src/platforms/gba/lib/libtonc/src/tonc_surface.c +105 -0
  706. package/src/platforms/gba/lib/libtonc/src/tonc_video.c +33 -0
  707. package/src/platforms/gba/lib/libtonc/src/tte/ase_drawg.c +83 -0
  708. package/src/platforms/gba/lib/libtonc/src/tte/bmp16_drawg.c +72 -0
  709. package/src/platforms/gba/lib/libtonc/src/tte/bmp16_drawg_b1cs.c +92 -0
  710. package/src/platforms/gba/lib/libtonc/src/tte/bmp8_drawg.c +71 -0
  711. package/src/platforms/gba/lib/libtonc/src/tte/bmp8_drawg_b1cs.c +104 -0
  712. package/src/platforms/gba/lib/libtonc/src/tte/bmp8_drawg_b1cts_fast.s +115 -0
  713. package/src/platforms/gba/lib/libtonc/src/tte/chr4c_drawg_b1cts.c +76 -0
  714. package/src/platforms/gba/lib/libtonc/src/tte/chr4c_drawg_b1cts_fast.s +128 -0
  715. package/src/platforms/gba/lib/libtonc/src/tte/chr4c_drawg_b4cts.c +67 -0
  716. package/src/platforms/gba/lib/libtonc/src/tte/chr4c_drawg_b4cts_fast.s +127 -0
  717. package/src/platforms/gba/lib/libtonc/src/tte/chr4r_drawg_b1cts.c +80 -0
  718. package/src/platforms/gba/lib/libtonc/src/tte/chr4r_drawg_b1cts_fast.s +145 -0
  719. package/src/platforms/gba/lib/libtonc/src/tte/obj_drawg.c +61 -0
  720. package/src/platforms/gba/lib/libtonc/src/tte/se_drawg.c +110 -0
  721. package/src/platforms/gba/lib/libtonc/src/tte/tte_init_ase.c +87 -0
  722. package/src/platforms/gba/lib/libtonc/src/tte/tte_init_bmp.c +118 -0
  723. package/src/platforms/gba/lib/libtonc/src/tte/tte_init_chr4c.c +86 -0
  724. package/src/platforms/gba/lib/libtonc/src/tte/tte_init_chr4r.c +87 -0
  725. package/src/platforms/gba/lib/libtonc/src/tte/tte_init_obj.c +84 -0
  726. package/src/platforms/gba/lib/libtonc/src/tte/tte_init_se.c +96 -0
  727. package/src/platforms/gba/lib/libtonc/src/tte/tte_iohook.c +264 -0
  728. package/src/platforms/gba/lib/libtonc/src/tte/tte_main.c +756 -0
  729. package/src/platforms/gba/lib/libtonc/src/tte/tte_types.s +119 -0
  730. package/src/platforms/gba/lib/maxmod/LICENSE-MAXMOD +23 -0
  731. package/src/platforms/gba/lib/maxmod/asm_include/mp_defs.inc +117 -0
  732. package/src/platforms/gba/lib/maxmod/asm_include/mp_format_mas.inc +108 -0
  733. package/src/platforms/gba/lib/maxmod/asm_include/mp_macros.inc +195 -0
  734. package/src/platforms/gba/lib/maxmod/asm_include/mp_mas.inc +40 -0
  735. package/src/platforms/gba/lib/maxmod/asm_include/mp_mas_structs.inc +189 -0
  736. package/src/platforms/gba/lib/maxmod/asm_include/mp_mixer_ds.inc +46 -0
  737. package/src/platforms/gba/lib/maxmod/asm_include/mp_mixer_gba.inc +42 -0
  738. package/src/platforms/gba/lib/maxmod/asm_include/swi_gba.inc +23 -0
  739. package/src/platforms/gba/lib/maxmod/include/maxmod.h +412 -0
  740. package/src/platforms/gba/lib/maxmod/include/mm_types.h +333 -0
  741. package/src/platforms/gba/lib/maxmod/maxmod.seed.a +0 -0
  742. package/src/platforms/gba/lib/maxmod/maxmod.seed.hash +1 -0
  743. package/src/platforms/gba/lib/maxmod/music/chiptune.xm +0 -0
  744. package/src/platforms/gba/lib/maxmod/music/chiptune_soundbank.bin +0 -0
  745. package/src/platforms/gba/lib/maxmod/music/chiptune_soundbank.h +4 -0
  746. package/src/platforms/gba/lib/maxmod/music/make_chiptune_xm.js +203 -0
  747. package/src/platforms/gba/lib/maxmod/source/mm_effect.s +767 -0
  748. package/src/platforms/gba/lib/maxmod/source/mm_main.s +115 -0
  749. package/src/platforms/gba/lib/maxmod/source/mm_mas.s +4990 -0
  750. package/src/platforms/gba/lib/maxmod/source/mm_mas_arm.s +612 -0
  751. package/src/platforms/gba/lib/maxmod/source_gba/mm_init_default.s +98 -0
  752. package/src/platforms/gba/lib/maxmod/source_gba/mm_main_gba.s +292 -0
  753. package/src/platforms/gba/lib/maxmod/source_gba/mm_mixer_gba.s +1367 -0
  754. package/src/platforms/gba/lib/sysbase/gba_iosupport.c +138 -0
  755. package/src/platforms/gbc/MENTAL_MODEL.md +165 -0
  756. package/src/platforms/gbc/TROUBLESHOOTING.md +142 -0
  757. package/src/platforms/gbc/UPSTREAM_SOURCES.md +60 -0
  758. package/src/platforms/gbc/lib/c/LICENSE-HUGEDRIVER +25 -0
  759. package/src/platforms/gbc/lib/c/README.md +120 -0
  760. package/src/platforms/gbc/lib/c/SDCC_GOTCHAS.md +189 -0
  761. package/src/platforms/gbc/lib/c/gb_crt0.s +163 -0
  762. package/src/platforms/gbc/lib/c/gb_hardware.h +113 -0
  763. package/src/platforms/gbc/lib/c/gb_runtime.c +284 -0
  764. package/src/platforms/gbc/lib/c/gb_runtime.h +145 -0
  765. package/src/platforms/gbc/lib/c/hUGEDriver.c +191 -0
  766. package/src/platforms/gbc/lib/c/hUGEDriver.h +95 -0
  767. package/src/platforms/gbc/lib/c/hUGEDriver.upstream.asm +1908 -0
  768. package/src/platforms/gbc/lib/c/lcd_init.c +19 -0
  769. package/src/platforms/gbc/lib/c/patch-header.js +154 -0
  770. package/src/platforms/gbc/lib/c/song_data.c +88 -0
  771. package/src/platforms/gbc/lib/c/unroll.h +52 -0
  772. package/src/platforms/gbc/lib/c/wait_vblank.c +14 -0
  773. package/src/platforms/genesis/MENTAL_MODEL.md +223 -0
  774. package/src/platforms/genesis/TROUBLESHOOTING.md +193 -0
  775. package/src/platforms/genesis/UPSTREAM_SOURCES.md +52 -0
  776. package/src/platforms/genesis/image-to-tilemap.js +333 -0
  777. package/src/platforms/genesis/lib/README.md +157 -0
  778. package/src/platforms/genesis/lib/c/crtbegin.o +0 -0
  779. package/src/platforms/genesis/lib/c/crtend.o +0 -0
  780. package/src/platforms/genesis/lib/c/genesis.ld +44 -0
  781. package/src/platforms/genesis/lib/c/genesis_sfx.c +51 -0
  782. package/src/platforms/genesis/lib/c/genesis_sfx.h +49 -0
  783. package/src/platforms/genesis/lib/c/libc.a +0 -0
  784. package/src/platforms/genesis/lib/c/libgcc.a +0 -0
  785. package/src/platforms/genesis/lib/c/libm.a +0 -0
  786. package/src/platforms/genesis/lib/c/sega.s +71 -0
  787. package/src/platforms/genesis/lib/header.s +96 -0
  788. package/src/platforms/genesis/lib/nmi_safe.s +79 -0
  789. package/src/platforms/genesis/lib/pad_read.s +104 -0
  790. package/src/platforms/genesis/lib/sgdk/COPYING.RUNTIME +73 -0
  791. package/src/platforms/genesis/lib/sgdk/LICENSE +12 -0
  792. package/src/platforms/genesis/lib/sgdk/include/asm.h +52 -0
  793. package/src/platforms/genesis/lib/sgdk/include/asm_mac.i +9 -0
  794. package/src/platforms/genesis/lib/sgdk/include/bmp.h +690 -0
  795. package/src/platforms/genesis/lib/sgdk/include/config.h +208 -0
  796. package/src/platforms/genesis/lib/sgdk/include/dma.h +542 -0
  797. package/src/platforms/genesis/lib/sgdk/include/ext/console.h +387 -0
  798. package/src/platforms/genesis/lib/sgdk/include/ext/everdrive.h +116 -0
  799. package/src/platforms/genesis/lib/sgdk/include/ext/fat16.h +84 -0
  800. package/src/platforms/genesis/lib/sgdk/include/ext/flash-save/flash.h +164 -0
  801. package/src/platforms/genesis/lib/sgdk/include/ext/flash-save/saveman.h +177 -0
  802. package/src/platforms/genesis/lib/sgdk/include/ext/link_cable.h +316 -0
  803. package/src/platforms/genesis/lib/sgdk/include/ext/minimusic/minimus.h +29 -0
  804. package/src/platforms/genesis/lib/sgdk/include/ext/mw/16c550.h +221 -0
  805. package/src/platforms/genesis/lib/sgdk/include/ext/mw/comm.h +93 -0
  806. package/src/platforms/genesis/lib/sgdk/include/ext/mw/gamejolt.h +541 -0
  807. package/src/platforms/genesis/lib/sgdk/include/ext/mw/jsmn.h +471 -0
  808. package/src/platforms/genesis/lib/sgdk/include/ext/mw/json.h +122 -0
  809. package/src/platforms/genesis/lib/sgdk/include/ext/mw/lsd.h +172 -0
  810. package/src/platforms/genesis/lib/sgdk/include/ext/mw/megawifi.h +984 -0
  811. package/src/platforms/genesis/lib/sgdk/include/ext/mw/mw-msg.h +392 -0
  812. package/src/platforms/genesis/lib/sgdk/include/ext/mw/ssf_ed_pro.h +38 -0
  813. package/src/platforms/genesis/lib/sgdk/include/ext/mw/ssf_ed_x7.h +73 -0
  814. package/src/platforms/genesis/lib/sgdk/include/ext/serial/buffer.h +8 -0
  815. package/src/platforms/genesis/lib/sgdk/include/ext/serial/serial.h +133 -0
  816. package/src/platforms/genesis/lib/sgdk/include/ext/stb/stb_sprintf.h +1864 -0
  817. package/src/platforms/genesis/lib/sgdk/include/genesis.h +92 -0
  818. package/src/platforms/genesis/lib/sgdk/include/joy.h +482 -0
  819. package/src/platforms/genesis/lib/sgdk/include/kdebug.h +21 -0
  820. package/src/platforms/genesis/lib/sgdk/include/map.h +409 -0
  821. package/src/platforms/genesis/lib/sgdk/include/mapper.h +186 -0
  822. package/src/platforms/genesis/lib/sgdk/include/maths.h +1071 -0
  823. package/src/platforms/genesis/lib/sgdk/include/maths3D.h +480 -0
  824. package/src/platforms/genesis/lib/sgdk/include/memory.h +346 -0
  825. package/src/platforms/genesis/lib/sgdk/include/memory_base.h +37 -0
  826. package/src/platforms/genesis/lib/sgdk/include/object.h +171 -0
  827. package/src/platforms/genesis/lib/sgdk/include/pal.h +500 -0
  828. package/src/platforms/genesis/lib/sgdk/include/pool.h +171 -0
  829. package/src/platforms/genesis/lib/sgdk/include/psg.h +153 -0
  830. package/src/platforms/genesis/lib/sgdk/include/snd/pcm/snd_dpcm2.h +79 -0
  831. package/src/platforms/genesis/lib/sgdk/include/snd/pcm/snd_pcm.h +98 -0
  832. package/src/platforms/genesis/lib/sgdk/include/snd/pcm/snd_pcm4.h +125 -0
  833. package/src/platforms/genesis/lib/sgdk/include/snd/pcm/tab_vol.h +6 -0
  834. package/src/platforms/genesis/lib/sgdk/include/snd/smp_null.h +6 -0
  835. package/src/platforms/genesis/lib/sgdk/include/snd/smp_null_dpcm.h +6 -0
  836. package/src/platforms/genesis/lib/sgdk/include/snd/sound.h +70 -0
  837. package/src/platforms/genesis/lib/sgdk/include/snd/xgm.h +399 -0
  838. package/src/platforms/genesis/lib/sgdk/include/snd/xgm2.h +389 -0
  839. package/src/platforms/genesis/lib/sgdk/include/snd/z80_def.i80 +41 -0
  840. package/src/platforms/genesis/lib/sgdk/include/snd/z80_fct.i80 +83 -0
  841. package/src/platforms/genesis/lib/sgdk/include/snd/z80_mac.i80 +1476 -0
  842. package/src/platforms/genesis/lib/sgdk/include/sprite_eng.h +1095 -0
  843. package/src/platforms/genesis/lib/sgdk/include/sprite_eng_legacy.h +1030 -0
  844. package/src/platforms/genesis/lib/sgdk/include/sram.h +110 -0
  845. package/src/platforms/genesis/lib/sgdk/include/string.h +349 -0
  846. package/src/platforms/genesis/lib/sgdk/include/sys.h +511 -0
  847. package/src/platforms/genesis/lib/sgdk/include/tab_cnv.h +19 -0
  848. package/src/platforms/genesis/lib/sgdk/include/task.h +77 -0
  849. package/src/platforms/genesis/lib/sgdk/include/task_cst.h +33 -0
  850. package/src/platforms/genesis/lib/sgdk/include/timer.h +132 -0
  851. package/src/platforms/genesis/lib/sgdk/include/tools.h +450 -0
  852. package/src/platforms/genesis/lib/sgdk/include/types.h +320 -0
  853. package/src/platforms/genesis/lib/sgdk/include/vdp.h +1150 -0
  854. package/src/platforms/genesis/lib/sgdk/include/vdp_bg.h +723 -0
  855. package/src/platforms/genesis/lib/sgdk/include/vdp_pal.h +101 -0
  856. package/src/platforms/genesis/lib/sgdk/include/vdp_spr.h +448 -0
  857. package/src/platforms/genesis/lib/sgdk/include/vdp_tile.h +1136 -0
  858. package/src/platforms/genesis/lib/sgdk/include/vram.h +270 -0
  859. package/src/platforms/genesis/lib/sgdk/include/ym2612.h +87 -0
  860. package/src/platforms/genesis/lib/sgdk/include/z80_ctrl.h +420 -0
  861. package/src/platforms/genesis/lib/sgdk/libmd.seed.a +0 -0
  862. package/src/platforms/genesis/lib/sgdk/libmd.seed.hash +1 -0
  863. package/src/platforms/genesis/lib/sgdk/md.ld +120 -0
  864. package/src/platforms/genesis/lib/sgdk/music/demo.vgm +0 -0
  865. package/src/platforms/genesis/lib/sgdk/music/demo.xgc +0 -0
  866. package/src/platforms/genesis/lib/sgdk/music/demo.xgm +0 -0
  867. package/src/platforms/genesis/lib/sgdk/res/image/font_default.png +0 -0
  868. package/src/platforms/genesis/lib/sgdk/res/image/sgdk_logo.png +0 -0
  869. package/src/platforms/genesis/lib/sgdk/res/libres.h +10 -0
  870. package/src/platforms/genesis/lib/sgdk/res/libres.res +5 -0
  871. package/src/platforms/genesis/lib/sgdk/res/libres.s +166 -0
  872. package/src/platforms/genesis/lib/sgdk/res/sound/stop_xgm.bin +0 -0
  873. package/src/platforms/genesis/lib/sgdk/rom_header.c +33 -0
  874. package/src/platforms/genesis/lib/sgdk/sega.preprocessed.s +364 -0
  875. package/src/platforms/genesis/lib/sgdk/sega.s +365 -0
  876. package/src/platforms/genesis/lib/sgdk/src/bmp.c +1539 -0
  877. package/src/platforms/genesis/lib/sgdk/src/bmp_a.s +3477 -0
  878. package/src/platforms/genesis/lib/sgdk/src/boot/rom_header.c +33 -0
  879. package/src/platforms/genesis/lib/sgdk/src/boot/sega.s +365 -0
  880. package/src/platforms/genesis/lib/sgdk/src/dma.c +782 -0
  881. package/src/platforms/genesis/lib/sgdk/src/dma_a.s +23 -0
  882. package/src/platforms/genesis/lib/sgdk/src/error_a.s +376 -0
  883. package/src/platforms/genesis/lib/sgdk/src/ext/console.c +490 -0
  884. package/src/platforms/genesis/lib/sgdk/src/ext/everdrive.c +285 -0
  885. package/src/platforms/genesis/lib/sgdk/src/ext/fat16.c +610 -0
  886. package/src/platforms/genesis/lib/sgdk/src/ext/flash-save/README.md +112 -0
  887. package/src/platforms/genesis/lib/sgdk/src/ext/flash-save/flash.c +300 -0
  888. package/src/platforms/genesis/lib/sgdk/src/ext/flash-save/saveman.c +641 -0
  889. package/src/platforms/genesis/lib/sgdk/src/ext/link_cable.c +1758 -0
  890. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/CHANGELOG.md +31 -0
  891. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/LICENSE.txt +17 -0
  892. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/README.md +18 -0
  893. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/data.z80 +148 -0
  894. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/define.z80 +173 -0
  895. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/doc/api-c.md +80 -0
  896. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/doc/format.md +132 -0
  897. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/doc/teradrive.md +33 -0
  898. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/fm.z80 +363 -0
  899. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/main.z80 +433 -0
  900. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/minimus.c +129 -0
  901. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/minimus_drv.s80 +17 -0
  902. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/psg.z80 +231 -0
  903. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/track.z80 +398 -0
  904. package/src/platforms/genesis/lib/sgdk/src/ext/minimusic/util.z80 +98 -0
  905. package/src/platforms/genesis/lib/sgdk/src/ext/mw/16c550.c +84 -0
  906. package/src/platforms/genesis/lib/sgdk/src/ext/mw/README.md +849 -0
  907. package/src/platforms/genesis/lib/sgdk/src/ext/mw/comm.c +141 -0
  908. package/src/platforms/genesis/lib/sgdk/src/ext/mw/gamejolt.c +758 -0
  909. package/src/platforms/genesis/lib/sgdk/src/ext/mw/json.c +153 -0
  910. package/src/platforms/genesis/lib/sgdk/src/ext/mw/lsd.c +364 -0
  911. package/src/platforms/genesis/lib/sgdk/src/ext/mw/megawifi.c +1501 -0
  912. package/src/platforms/genesis/lib/sgdk/src/ext/mw/ssf_ed_pro.c +98 -0
  913. package/src/platforms/genesis/lib/sgdk/src/ext/mw/ssf_ed_x7.c +67 -0
  914. package/src/platforms/genesis/lib/sgdk/src/ext/serial/buffer.c +69 -0
  915. package/src/platforms/genesis/lib/sgdk/src/ext/serial/serial.c +158 -0
  916. package/src/platforms/genesis/lib/sgdk/src/joy.c +1361 -0
  917. package/src/platforms/genesis/lib/sgdk/src/kdebug.s +109 -0
  918. package/src/platforms/genesis/lib/sgdk/src/map.c +1915 -0
  919. package/src/platforms/genesis/lib/sgdk/src/mapper.c +280 -0
  920. package/src/platforms/genesis/lib/sgdk/src/maths.c +878 -0
  921. package/src/platforms/genesis/lib/sgdk/src/maths3D.c +480 -0
  922. package/src/platforms/genesis/lib/sgdk/src/maths3D_a.s +205 -0
  923. package/src/platforms/genesis/lib/sgdk/src/memory.c +760 -0
  924. package/src/platforms/genesis/lib/sgdk/src/memory_a.s +306 -0
  925. package/src/platforms/genesis/lib/sgdk/src/object.c +111 -0
  926. package/src/platforms/genesis/lib/sgdk/src/pal.c +484 -0
  927. package/src/platforms/genesis/lib/sgdk/src/pool.c +234 -0
  928. package/src/platforms/genesis/lib/sgdk/src/psg.c +82 -0
  929. package/src/platforms/genesis/lib/sgdk/src/snd/drv_null.s80 +27 -0
  930. package/src/platforms/genesis/lib/sgdk/src/snd/drv_xgm.s80 +3037 -0
  931. package/src/platforms/genesis/lib/sgdk/src/snd/pcm/drv_dpcm2.s80 +984 -0
  932. package/src/platforms/genesis/lib/sgdk/src/snd/pcm/drv_pcm.s80 +592 -0
  933. package/src/platforms/genesis/lib/sgdk/src/snd/pcm/drv_pcm4.s80 +699 -0
  934. package/src/platforms/genesis/lib/sgdk/src/snd/pcm/snd_dpcm2.c +172 -0
  935. package/src/platforms/genesis/lib/sgdk/src/snd/pcm/snd_pcm.c +152 -0
  936. package/src/platforms/genesis/lib/sgdk/src/snd/pcm/snd_pcm4.c +213 -0
  937. package/src/platforms/genesis/lib/sgdk/src/snd/pcm/tab_vol.c +277 -0
  938. package/src/platforms/genesis/lib/sgdk/src/snd/smp_null.s +22 -0
  939. package/src/platforms/genesis/lib/sgdk/src/snd/smp_null_dpcm.s +15 -0
  940. package/src/platforms/genesis/lib/sgdk/src/snd/sound.c +33 -0
  941. package/src/platforms/genesis/lib/sgdk/src/snd/xgm.c +683 -0
  942. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2.s80 +993 -0
  943. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_fct.i80 +611 -0
  944. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_mac.i80 +133 -0
  945. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_pcm_fct.i80 +114 -0
  946. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_pcm_mac.i80 +1444 -0
  947. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_psg_fct.i80 +491 -0
  948. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_psg_mac.i80 +43 -0
  949. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_ym_fct.i80 +1664 -0
  950. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2/drv_xgm2_ym_mac.i80 +295 -0
  951. package/src/platforms/genesis/lib/sgdk/src/snd/xgm2.c +1083 -0
  952. package/src/platforms/genesis/lib/sgdk/src/sprite_eng.c +2256 -0
  953. package/src/platforms/genesis/lib/sgdk/src/sprite_eng_legacy.c +2309 -0
  954. package/src/platforms/genesis/lib/sgdk/src/sram.c +30 -0
  955. package/src/platforms/genesis/lib/sgdk/src/sram_a.s +41 -0
  956. package/src/platforms/genesis/lib/sgdk/src/string.c +720 -0
  957. package/src/platforms/genesis/lib/sgdk/src/sys.c +1053 -0
  958. package/src/platforms/genesis/lib/sgdk/src/sys_a.s +74 -0
  959. package/src/platforms/genesis/lib/sgdk/src/tab_cnv.c +129 -0
  960. package/src/platforms/genesis/lib/sgdk/src/tab_log10.c +8201 -0
  961. package/src/platforms/genesis/lib/sgdk/src/tab_log2.c +8201 -0
  962. package/src/platforms/genesis/lib/sgdk/src/tab_sin.c +2058 -0
  963. package/src/platforms/genesis/lib/sgdk/src/tab_sqrt.c +8201 -0
  964. package/src/platforms/genesis/lib/sgdk/src/task.s +148 -0
  965. package/src/platforms/genesis/lib/sgdk/src/timer.c +201 -0
  966. package/src/platforms/genesis/lib/sgdk/src/tools.c +1299 -0
  967. package/src/platforms/genesis/lib/sgdk/src/tools_a.s +979 -0
  968. package/src/platforms/genesis/lib/sgdk/src/types.c +18 -0
  969. package/src/platforms/genesis/lib/sgdk/src/vdp.c +1060 -0
  970. package/src/platforms/genesis/lib/sgdk/src/vdp_bg.c +511 -0
  971. package/src/platforms/genesis/lib/sgdk/src/vdp_spr.c +322 -0
  972. package/src/platforms/genesis/lib/sgdk/src/vdp_tile.c +1011 -0
  973. package/src/platforms/genesis/lib/sgdk/src/vdp_tile_a.s +68 -0
  974. package/src/platforms/genesis/lib/sgdk/src/vram.c +273 -0
  975. package/src/platforms/genesis/lib/sgdk/src/ym2612.c +175 -0
  976. package/src/platforms/genesis/lib/sgdk/src/z80_ctrl.c +334 -0
  977. package/src/platforms/genesis/lib/sprite_table.s +129 -0
  978. package/src/platforms/genesis/lib/vblank_wait.s +73 -0
  979. package/src/platforms/genesis/lib/vdp_init.s +85 -0
  980. package/src/platforms/genesis/lib/wram.s +88 -0
  981. package/src/platforms/genesis/lib/z80_bootstrap.s +102 -0
  982. package/src/platforms/genesis/vdp.js +495 -0
  983. package/src/platforms/gg/MENTAL_MODEL.md +155 -0
  984. package/src/platforms/gg/TROUBLESHOOTING.md +91 -0
  985. package/src/platforms/gg/UPSTREAM_SOURCES.md +36 -0
  986. package/src/platforms/gg/lib/c/gg_crt0.s +112 -0
  987. package/src/platforms/gg/lib/c/gg_hw.h +62 -0
  988. package/src/platforms/gg/lib/c/gg_music.c +155 -0
  989. package/src/platforms/gg/lib/c/gg_music.h +89 -0
  990. package/src/platforms/gg/lib/c/gg_sfx.c +82 -0
  991. package/src/platforms/gg/lib/c/gg_sfx.h +40 -0
  992. package/src/platforms/gg/lib/c/joypad_read.c +22 -0
  993. package/src/platforms/gg/lib/c/load_palette.c +20 -0
  994. package/src/platforms/gg/lib/c/load_tiles.c +32 -0
  995. package/src/platforms/gg/lib/c/sprite_table.c +60 -0
  996. package/src/platforms/gg/lib/c/vblank_wait.c +10 -0
  997. package/src/platforms/gg/lib/c/vdp_init.c +58 -0
  998. package/src/platforms/index.js +7 -0
  999. package/src/platforms/lynx/MENTAL_MODEL.md +231 -0
  1000. package/src/platforms/lynx/TROUBLESHOOTING.md +105 -0
  1001. package/src/platforms/lynx/UPSTREAM_SOURCES.md +66 -0
  1002. package/src/platforms/lynx/lib/c/lynx_music.c +63 -0
  1003. package/src/platforms/lynx/lib/c/lynx_music.h +16 -0
  1004. package/src/platforms/lynx/lib/c/lynx_sfx.c +147 -0
  1005. package/src/platforms/lynx/lib/c/lynx_sfx.h +59 -0
  1006. package/src/platforms/lynx/lib/cc65-src/bllhdr.s +18 -0
  1007. package/src/platforms/lynx/lib/cc65-src/bootldr.s +195 -0
  1008. package/src/platforms/lynx/lib/cc65-src/cgetc.s +69 -0
  1009. package/src/platforms/lynx/lib/cc65-src/clock.s +87 -0
  1010. package/src/platforms/lynx/lib/cc65-src/crt0.s +135 -0
  1011. package/src/platforms/lynx/lib/cc65-src/defdir.s +29 -0
  1012. package/src/platforms/lynx/lib/cc65-src/eeprom.s +255 -0
  1013. package/src/platforms/lynx/lib/cc65-src/eeprom46.s +204 -0
  1014. package/src/platforms/lynx/lib/cc65-src/eeprom66.s +227 -0
  1015. package/src/platforms/lynx/lib/cc65-src/eeprom86.s +236 -0
  1016. package/src/platforms/lynx/lib/cc65-src/exec.s +34 -0
  1017. package/src/platforms/lynx/lib/cc65-src/exehdr.s +27 -0
  1018. package/src/platforms/lynx/lib/cc65-src/extzp.inc +23 -0
  1019. package/src/platforms/lynx/lib/cc65-src/extzp.s +30 -0
  1020. package/src/platforms/lynx/lib/cc65-src/irq.s +45 -0
  1021. package/src/platforms/lynx/lib/cc65-src/joy/lynx-stdjoy.s +93 -0
  1022. package/src/platforms/lynx/lib/cc65-src/joy_stat_stddrv.s +14 -0
  1023. package/src/platforms/lynx/lib/cc65-src/kbhit.s +56 -0
  1024. package/src/platforms/lynx/lib/cc65-src/libref.s +9 -0
  1025. package/src/platforms/lynx/lib/cc65-src/load.s +41 -0
  1026. package/src/platforms/lynx/lib/cc65-src/lseek.s +58 -0
  1027. package/src/platforms/lynx/lib/cc65-src/lynx-cart.s +98 -0
  1028. package/src/platforms/lynx/lib/cc65-src/lynx-snd.s +1270 -0
  1029. package/src/platforms/lynx/lib/cc65-src/mainargs.s +24 -0
  1030. package/src/platforms/lynx/lib/cc65-src/open.s +136 -0
  1031. package/src/platforms/lynx/lib/cc65-src/oserror.s +14 -0
  1032. package/src/platforms/lynx/lib/cc65-src/read.s +44 -0
  1033. package/src/platforms/lynx/lib/cc65-src/ser/lynx-comlynx.s +404 -0
  1034. package/src/platforms/lynx/lib/cc65-src/ser_stat_stddrv.s +14 -0
  1035. package/src/platforms/lynx/lib/cc65-src/sysuname.s +39 -0
  1036. package/src/platforms/lynx/lib/cc65-src/tgi/lynx-160-102-16.s +1075 -0
  1037. package/src/platforms/lynx/lib/cc65-src/tgi_colors.s +9 -0
  1038. package/src/platforms/lynx/lib/cc65-src/tgi_irq.s +11 -0
  1039. package/src/platforms/lynx/lib/cc65-src/tgi_stat_stddrv.s +14 -0
  1040. package/src/platforms/lynx/lib/cc65-src/tgi_stddrv.s +13 -0
  1041. package/src/platforms/lynx/lib/cc65-src/uploader.s +81 -0
  1042. package/src/platforms/nes/MENTAL_MODEL.md +301 -0
  1043. package/src/platforms/nes/TROUBLESHOOTING.md +321 -0
  1044. package/src/platforms/nes/UPSTREAM_SOURCES.md +31 -0
  1045. package/src/platforms/nes/image-to-chr.js +195 -0
  1046. package/src/platforms/nes/image-to-tilemap.js +415 -0
  1047. package/src/platforms/nes/lib/README.md +40 -0
  1048. package/src/platforms/nes/lib/asm/LICENSE-FAMITONE +40 -0
  1049. package/src/platforms/nes/lib/asm/chr_ram_header.s +32 -0
  1050. package/src/platforms/nes/lib/asm/famitone2.s +1258 -0
  1051. package/src/platforms/nes/lib/asm/famitone_bridge.s +50 -0
  1052. package/src/platforms/nes/lib/asm/music_data.s +238 -0
  1053. package/src/platforms/nes/lib/c/chr_ram_runtime_hello_sprite.c +81 -0
  1054. package/src/platforms/nes/lib/c/chr_ram_runtime_hud_row.c +101 -0
  1055. package/src/platforms/nes/lib/c/nes_runtime.c +347 -0
  1056. package/src/platforms/nes/lib/c/nes_runtime.h +153 -0
  1057. package/src/platforms/nes/lib/c/nmi_handler.c +51 -0
  1058. package/src/platforms/nes/lib/c/nmi_trampoline.s +25 -0
  1059. package/src/platforms/nes/lib/cc65-src/Makefile.inc +9 -0
  1060. package/src/platforms/nes/lib/cc65-src/_scrsize.s +24 -0
  1061. package/src/platforms/nes/lib/cc65-src/cclear.s +29 -0
  1062. package/src/platforms/nes/lib/cc65-src/chline.s +31 -0
  1063. package/src/platforms/nes/lib/cc65-src/clock.s +31 -0
  1064. package/src/platforms/nes/lib/cc65-src/clrscr.s +72 -0
  1065. package/src/platforms/nes/lib/cc65-src/color.s +68 -0
  1066. package/src/platforms/nes/lib/cc65-src/cpeekc.s +37 -0
  1067. package/src/platforms/nes/lib/cc65-src/cpeekcolor.s +8 -0
  1068. package/src/platforms/nes/lib/cc65-src/cpeekrevers.s +37 -0
  1069. package/src/platforms/nes/lib/cc65-src/cputc.s +95 -0
  1070. package/src/platforms/nes/lib/cc65-src/crt0.s +180 -0
  1071. package/src/platforms/nes/lib/cc65-src/cvline.s +31 -0
  1072. package/src/platforms/nes/lib/cc65-src/get_tv.s +37 -0
  1073. package/src/platforms/nes/lib/cc65-src/gotox.s +21 -0
  1074. package/src/platforms/nes/lib/cc65-src/gotoxy.s +22 -0
  1075. package/src/platforms/nes/lib/cc65-src/gotoy.s +22 -0
  1076. package/src/platforms/nes/lib/cc65-src/irq.s +19 -0
  1077. package/src/platforms/nes/lib/cc65-src/joy/nes-stdjoy.s +102 -0
  1078. package/src/platforms/nes/lib/cc65-src/joy_stat_stddrv.s +14 -0
  1079. package/src/platforms/nes/lib/cc65-src/libref.s +9 -0
  1080. package/src/platforms/nes/lib/cc65-src/mainargs.s +24 -0
  1081. package/src/platforms/nes/lib/cc65-src/neschar.s +4616 -0
  1082. package/src/platforms/nes/lib/cc65-src/ppu.s +158 -0
  1083. package/src/platforms/nes/lib/cc65-src/ppubuf.s +117 -0
  1084. package/src/platforms/nes/lib/cc65-src/randomize.s +18 -0
  1085. package/src/platforms/nes/lib/cc65-src/revers.s +27 -0
  1086. package/src/platforms/nes/lib/cc65-src/setcursor.s +37 -0
  1087. package/src/platforms/nes/lib/cc65-src/sysuname.s +39 -0
  1088. package/src/platforms/nes/lib/cc65-src/tgi/nes-64-56-2.s +480 -0
  1089. package/src/platforms/nes/lib/cc65-src/tgi_stat_stddrv.s +14 -0
  1090. package/src/platforms/nes/lib/cc65-src/tgi_stddrv.s +13 -0
  1091. package/src/platforms/nes/lib/cc65-src/waitvsync.s +18 -0
  1092. package/src/platforms/nes/lib/cc65-src/wherex.s +19 -0
  1093. package/src/platforms/nes/lib/cc65-src/wherey.s +19 -0
  1094. package/src/platforms/nes/lib/clear_nametable.s +38 -0
  1095. package/src/platforms/nes/lib/clear_oam.s +18 -0
  1096. package/src/platforms/nes/lib/load_palette.s +31 -0
  1097. package/src/platforms/nes/lib/nmi_safe.s +65 -0
  1098. package/src/platforms/nes/lib/oam_dma.s +16 -0
  1099. package/src/platforms/nes/lib/read_pad.s +46 -0
  1100. package/src/platforms/nes/lib/reset.s +46 -0
  1101. package/src/platforms/nes/lib/sprite_table_populate.s +75 -0
  1102. package/src/platforms/nes/lib/wait_vblank.s +12 -0
  1103. package/src/platforms/nes/palette.js +39 -0
  1104. package/src/platforms/nes/ppu.js +372 -0
  1105. package/src/platforms/sms/MENTAL_MODEL.md +267 -0
  1106. package/src/platforms/sms/TROUBLESHOOTING.md +124 -0
  1107. package/src/platforms/sms/UPSTREAM_SOURCES.md +29 -0
  1108. package/src/platforms/sms/image-to-tilemap.js +260 -0
  1109. package/src/platforms/sms/lib/README.md +117 -0
  1110. package/src/platforms/sms/lib/c/joypad_read.c +33 -0
  1111. package/src/platforms/sms/lib/c/load_palette.c +24 -0
  1112. package/src/platforms/sms/lib/c/load_tiles.c +32 -0
  1113. package/src/platforms/sms/lib/c/sms_crt0.s +101 -0
  1114. package/src/platforms/sms/lib/c/sms_hw.h +53 -0
  1115. package/src/platforms/sms/lib/c/sms_music.c +178 -0
  1116. package/src/platforms/sms/lib/c/sms_music.h +50 -0
  1117. package/src/platforms/sms/lib/c/sms_sfx.c +82 -0
  1118. package/src/platforms/sms/lib/c/sms_sfx.h +40 -0
  1119. package/src/platforms/sms/lib/c/sprite_table.c +60 -0
  1120. package/src/platforms/sms/lib/c/vblank_wait.c +10 -0
  1121. package/src/platforms/sms/lib/c/vdp_init.c +58 -0
  1122. package/src/platforms/sms/lib/header.s +33 -0
  1123. package/src/platforms/sms/lib/joypad_read.s +40 -0
  1124. package/src/platforms/sms/lib/load_palette.s +30 -0
  1125. package/src/platforms/sms/lib/load_tiles.s +50 -0
  1126. package/src/platforms/sms/lib/sprite_table.s +44 -0
  1127. package/src/platforms/sms/lib/vblank_wait.s +36 -0
  1128. package/src/platforms/sms/lib/vdp_init.s +47 -0
  1129. package/src/platforms/sms/vdp.js +530 -0
  1130. package/src/platforms/snes/MENTAL_MODEL.md +275 -0
  1131. package/src/platforms/snes/TROUBLESHOOTING.md +208 -0
  1132. package/src/platforms/snes/UPSTREAM_SOURCES.md +50 -0
  1133. package/src/platforms/snes/brr.js +208 -0
  1134. package/src/platforms/snes/image-to-tilemap.js +227 -0
  1135. package/src/platforms/snes/lib/audio/apu_blob.asm +228 -0
  1136. package/src/platforms/snes/lib/audio/apu_blob.bin +0 -0
  1137. package/src/platforms/snes/lib/audio/explosion.brr +0 -0
  1138. package/src/platforms/snes/lib/audio/sample_bank.bin +0 -0
  1139. package/src/platforms/snes/lib/audio/shoot.brr +0 -0
  1140. package/src/platforms/snes/lib/audio/spc_driver.asm +241 -0
  1141. package/src/platforms/snes/lib/audio_pipeline.asm +62 -0
  1142. package/src/platforms/snes/lib/c/crt0.asm +125 -0
  1143. package/src/platforms/snes/lib/c/hdr.asm +50 -0
  1144. package/src/platforms/snes/lib/c/snes_sfx.c +116 -0
  1145. package/src/platforms/snes/lib/c/snes_sfx.h +96 -0
  1146. package/src/platforms/snes/lib/c/snes_sfx_data.asm +25 -0
  1147. package/src/platforms/snes/lib/cgram_upload.asm +43 -0
  1148. package/src/platforms/snes/lib/lorom_header.asm +47 -0
  1149. package/src/platforms/snes/lib/lorom_multibank.asm +66 -0
  1150. package/src/platforms/snes/lib/nmi_safe.asm +77 -0
  1151. package/src/platforms/snes/lib/oam_upload.asm +45 -0
  1152. package/src/platforms/snes/lib/pad_read.asm +64 -0
  1153. package/src/platforms/snes/lib/pvsneslib/LICENSE +21 -0
  1154. package/src/platforms/snes/lib/pvsneslib/include/ctype.h +6 -0
  1155. package/src/platforms/snes/lib/pvsneslib/include/float.h +4 -0
  1156. package/src/platforms/snes/lib/pvsneslib/include/hdr.asm +47 -0
  1157. package/src/platforms/snes/lib/pvsneslib/include/limits.h +13 -0
  1158. package/src/platforms/snes/lib/pvsneslib/include/math.h +10 -0
  1159. package/src/platforms/snes/lib/pvsneslib/include/setjmp.h +4 -0
  1160. package/src/platforms/snes/lib/pvsneslib/include/snes/background.h +396 -0
  1161. package/src/platforms/snes/lib/pvsneslib/include/snes/console.h +188 -0
  1162. package/src/platforms/snes/lib/pvsneslib/include/snes/dma.h +381 -0
  1163. package/src/platforms/snes/lib/pvsneslib/include/snes/input.h +289 -0
  1164. package/src/platforms/snes/lib/pvsneslib/include/snes/interrupt.h +264 -0
  1165. package/src/platforms/snes/lib/pvsneslib/include/snes/libversion.h +10 -0
  1166. package/src/platforms/snes/lib/pvsneslib/include/snes/lzss.h +43 -0
  1167. package/src/platforms/snes/lib/pvsneslib/include/snes/map.h +113 -0
  1168. package/src/platforms/snes/lib/pvsneslib/include/snes/object.h +234 -0
  1169. package/src/platforms/snes/lib/pvsneslib/include/snes/pixel.h +53 -0
  1170. package/src/platforms/snes/lib/pvsneslib/include/snes/scores.h +66 -0
  1171. package/src/platforms/snes/lib/pvsneslib/include/snes/snestypes.h +65 -0
  1172. package/src/platforms/snes/lib/pvsneslib/include/snes/sound.h +245 -0
  1173. package/src/platforms/snes/lib/pvsneslib/include/snes/sprite.h +456 -0
  1174. package/src/platforms/snes/lib/pvsneslib/include/snes/video.h +465 -0
  1175. package/src/platforms/snes/lib/pvsneslib/include/snes.h +190 -0
  1176. package/src/platforms/snes/lib/pvsneslib/include/stdarg.h +28 -0
  1177. package/src/platforms/snes/lib/pvsneslib/include/stdbool.h +53 -0
  1178. package/src/platforms/snes/lib/pvsneslib/include/stddef.h +27 -0
  1179. package/src/platforms/snes/lib/pvsneslib/include/stdint.h +7 -0
  1180. package/src/platforms/snes/lib/pvsneslib/include/stdio.h +9 -0
  1181. package/src/platforms/snes/lib/pvsneslib/include/stdlib.h +13 -0
  1182. package/src/platforms/snes/lib/pvsneslib/include/string.h +19 -0
  1183. package/src/platforms/snes/lib/pvsneslib/include/strings.h +5 -0
  1184. package/src/platforms/snes/lib/pvsneslib/source/Makefile +87 -0
  1185. package/src/platforms/snes/lib/pvsneslib/source/backgrounds.asm +834 -0
  1186. package/src/platforms/snes/lib/pvsneslib/source/consoles.asm +1028 -0
  1187. package/src/platforms/snes/lib/pvsneslib/source/crt0_snes.asm +329 -0
  1188. package/src/platforms/snes/lib/pvsneslib/source/dmas.asm +1275 -0
  1189. package/src/platforms/snes/lib/pvsneslib/source/hdr.asm +56 -0
  1190. package/src/platforms/snes/lib/pvsneslib/source/input.asm +445 -0
  1191. package/src/platforms/snes/lib/pvsneslib/source/libc.asm +485 -0
  1192. package/src/platforms/snes/lib/pvsneslib/source/libc_c.c +1214 -0
  1193. package/src/platforms/snes/lib/pvsneslib/source/libm.asm +510 -0
  1194. package/src/platforms/snes/lib/pvsneslib/source/libtcc.asm +374 -0
  1195. package/src/platforms/snes/lib/pvsneslib/source/lzsss.asm +256 -0
  1196. package/src/platforms/snes/lib/pvsneslib/source/maps.asm +1078 -0
  1197. package/src/platforms/snes/lib/pvsneslib/source/objects.asm +2881 -0
  1198. package/src/platforms/snes/lib/pvsneslib/source/scores.asm +226 -0
  1199. package/src/platforms/snes/lib/pvsneslib/source/sm_spc.asm +187 -0
  1200. package/src/platforms/snes/lib/pvsneslib/source/snesmodwla.asm +1186 -0
  1201. package/src/platforms/snes/lib/pvsneslib/source/sounds.asm +273 -0
  1202. package/src/platforms/snes/lib/pvsneslib/source/sprites.asm +3946 -0
  1203. package/src/platforms/snes/lib/pvsneslib/source/vblank.asm +917 -0
  1204. package/src/platforms/snes/lib/pvsneslib/source/videos.asm +1137 -0
  1205. package/src/platforms/snes/lib/reset_init.asm +31 -0
  1206. package/src/platforms/snes/lib/sprite_table_populate.asm +122 -0
  1207. package/src/platforms/snes/lib/vram_dma_upload.asm +42 -0
  1208. package/src/platforms/snes/ppu.js +606 -0
  1209. package/src/playtest/playtest.js +612 -0
  1210. package/src/rom-id/identifier.js +421 -0
  1211. package/src/rom-id/patch.js +217 -0
  1212. package/src/toolchains/_worker/pool.js +253 -0
  1213. package/src/toolchains/_worker/run.js +78 -0
  1214. package/src/toolchains/_worker/wasm-worker.js +233 -0
  1215. package/src/toolchains/arm-none-eabi-gcc/gcc.js +208 -0
  1216. package/src/toolchains/asar/asar.js +542 -0
  1217. package/src/toolchains/assemble-snippet.js +256 -0
  1218. package/src/toolchains/cc65/cc65.js +395 -0
  1219. package/src/toolchains/cc65/da65.js +119 -0
  1220. package/src/toolchains/cc65/dbgparse.js +274 -0
  1221. package/src/toolchains/cc65/preset-resolver.js +59 -0
  1222. package/src/toolchains/cc65/presets/nes/chr-ram-runtime.cfg +79 -0
  1223. package/src/toolchains/cc65/presets/nes/chr-ram-runtime.crt0.s +178 -0
  1224. package/src/toolchains/cc65/presets/nes/chr-ram.cfg +76 -0
  1225. package/src/toolchains/cc65/presets/nes/chr-ram.crt0.s +106 -0
  1226. package/src/toolchains/common/ar.js +121 -0
  1227. package/src/toolchains/common/sdk-cache.js +116 -0
  1228. package/src/toolchains/common/symbols.js +139 -0
  1229. package/src/toolchains/dasm/dasm.js +96 -0
  1230. package/src/toolchains/gba-c/gba-c.js +832 -0
  1231. package/src/toolchains/genesis-c/README.md +61 -0
  1232. package/src/toolchains/genesis-c/genesis-c.js +598 -0
  1233. package/src/toolchains/index.js +727 -0
  1234. package/src/toolchains/m68k-elf-gcc/gcc.js +220 -0
  1235. package/src/toolchains/m68kdasm.js +438 -0
  1236. package/src/toolchains/parse-errors.js +258 -0
  1237. package/src/toolchains/registry.js +67 -0
  1238. package/src/toolchains/rgbds/rgbds.js +144 -0
  1239. package/src/toolchains/sdcc/preflight-lint.js +295 -0
  1240. package/src/toolchains/sdcc/sdcc.js +519 -0
  1241. package/src/toolchains/sjasm/sjasm.js +85 -0
  1242. package/src/toolchains/sm83dasm.js +194 -0
  1243. package/src/toolchains/snes-c/snes-c.js +409 -0
  1244. package/src/toolchains/tcc816/tcc816.js +79 -0
  1245. package/src/toolchains/vasm68k/vasm68k.js +138 -0
  1246. package/src/toolchains/wladx/wladx.js +120 -0
  1247. package/src/toolchains/z80dasm.js +303 -0
@@ -0,0 +1,2309 @@
1
+ #include "config.h"
2
+ #include "types.h"
3
+
4
+ #if LEGACY_SPRITE_ENGINE
5
+
6
+ #include "sprite_eng_legacy.h"
7
+
8
+ #include "sys.h"
9
+ #include "vdp.h"
10
+ #include "vdp_spr.h"
11
+ #include "dma.h"
12
+ #include "memory.h"
13
+ #include "pool.h"
14
+ #include "vram.h"
15
+ #include "tools.h"
16
+ #include "mapper.h"
17
+
18
+ #include "kdebug.h"
19
+ #include "string.h"
20
+ #include "timer.h"
21
+
22
+
23
+ //#define SPR_DEBUG
24
+ //#define SPR_PROFIL
25
+
26
+ #ifdef SPR_PROFIL
27
+ #define START_PROFIL s32 prof = getSubTick();
28
+ #define END_PROFIL(x) profil_time[x] += getSubTick() - prof;
29
+ #else
30
+ #define START_PROFIL
31
+ #define END_PROFIL(x)
32
+ #endif // SPR_PROFIL
33
+
34
+ // first hardware sprite is reserved (used internally for sorting)
35
+ #define MAX_SPRITE (80 - 1)
36
+
37
+ // internals
38
+ #define VISIBILITY_ON 0xFFFF
39
+ #define VISIBILITY_OFF 0x0000
40
+
41
+ #define ALLOCATED 0x8000
42
+
43
+ #define NEED_ST_POS_UPDATE 0x0001
44
+ #define NEED_ST_ALL_UPDATE 0x0002
45
+ #define NEED_ST_UPDATE 0x0003
46
+ #define NEED_VISIBILITY_UPDATE 0x0004
47
+ #define NEED_FRAME_UPDATE 0x0008
48
+ #define NEED_TILES_UPLOAD 0x0010
49
+
50
+ #define NEED_UPDATE 0x001F
51
+
52
+ #define STATE_ANIMATION_DONE 0x0020
53
+
54
+
55
+ // shared from vdp_spr.c unit
56
+ extern void logVDPSprite(u16 index);
57
+ // shared from vdp.c unit
58
+ extern void updateUserTileMaxIndex();
59
+
60
+
61
+ // forward
62
+ static Sprite* allocateSprite(u16 head);
63
+ static bool releaseSprite(Sprite* sprite);
64
+
65
+ static void setVDPSpriteIndex(Sprite* sprite, u16 ind, u16 num);
66
+ static u16 updateVisibility(Sprite* sprite, u16 status);
67
+ static u16 setVisibility(Sprite* sprite, u16 visibility);
68
+ static u16 updateFrame(Sprite* sprite, u16 status);
69
+
70
+ static void updateSpriteTableAll(Sprite* sprite);
71
+ static void updateSpriteTablePos(Sprite* sprite);
72
+ static void updateSpriteTableHide(Sprite* sprite);
73
+
74
+ static void loadTiles(Sprite* sprite);
75
+ static Sprite* sortSprite(Sprite* sprite);
76
+ static void moveAfter(Sprite* pos, Sprite* sprite);
77
+ static u16 getSpriteIndex(Sprite* sprite);
78
+ static void logSprite(Sprite* sprite);
79
+
80
+ // starter VDP sprite - never visible (used for sprite sorting)
81
+ static VDPSprite* starter;
82
+
83
+ // pool of Sprite objects
84
+ Pool* spritesPool;
85
+
86
+ // pointer on first and last active sprite in the linked list
87
+ Sprite* firstSprite;
88
+ Sprite* lastSprite;
89
+
90
+ // VRAM region allocated for the Sprite Engine
91
+ static VRAMRegion vram;
92
+
93
+ // size of VRAM allocated for Sprite Engine
94
+ u16 spriteVramSize;
95
+
96
+ #ifdef SPR_PROFIL
97
+
98
+ #define PROFIL_ALLOCATE_SPRITE 0
99
+ #define PROFIL_RELEASE_SPRITE 1
100
+ #define PROFIL_ADD_SPRITE 2
101
+ #define PROFIL_REMOVE_SPRITE 3
102
+ #define PROFIL_SET_DEF 4
103
+ #define PROFIL_SET_ATTRIBUTE 5
104
+ #define PROFIL_SET_ANIM_FRAME 6
105
+ #define PROFIL_SET_VRAM_OR_SPRIND 7
106
+ #define PROFIL_SET_VISIBILITY 8
107
+ #define PROFIL_CLEAR 9
108
+ #define PROFIL_UPDATE 10
109
+ #define PROFIL_UPDATE_VISIBILITY 11
110
+ #define PROFIL_SET_VIS_INT 12
111
+ #define PROFIL_UPDATE_FRAME 13
112
+ #define PROFIL_UPDATE_VDPSPRIND 14
113
+ #define PROFIL_UPDATE_VISTABLE 15
114
+ #define PROFIL_UPDATE_SPRITE_TABLE 16
115
+ #define PROFIL_LOADTILES 17
116
+ #define PROFIL_SORT 18
117
+ #define PROFIL_VRAM_DEFRAG 19
118
+
119
+ static u32 profil_time[20];
120
+ #endif
121
+
122
+
123
+ NO_INLINE void SPR_initEx(u16 vramSize)
124
+ {
125
+ // end it first (if initialized)
126
+ SPR_end();
127
+
128
+ // create sprites object pool
129
+ spritesPool = POOL_create(MAX_SPRITE, sizeof(Sprite));
130
+
131
+ // store allocated VRAM size to let SGDK know about it
132
+ spriteVramSize = vramSize ? vramSize : 420;
133
+ // and create a VRAM region for sprite tile allocation
134
+ VRAM_createRegion(&vram, TILE_SPRITE_INDEX, spriteVramSize);
135
+
136
+ // need to update user tile max index
137
+ updateUserTileMaxIndex();
138
+
139
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_INFO)
140
+ KLog("Sprite engine initialized !");
141
+ KLog_U2_(" VRAM region: [", TILE_SPRITE_INDEX, " - ", TILE_SPRITE_INDEX + (spriteVramSize - 1), "]");
142
+ #endif // LIB_DEBUG
143
+
144
+ // reset
145
+ SPR_reset();
146
+ }
147
+
148
+ void SPR_init()
149
+ {
150
+ SPR_initEx(420);
151
+ }
152
+
153
+ NO_INLINE void SPR_end()
154
+ {
155
+ if (SPR_isInitialized())
156
+ {
157
+ // reset and clear VDP sprite
158
+ VDP_resetSprites();
159
+ VDP_updateSprites(1, DMA_QUEUE_COPY);
160
+
161
+ // release memory
162
+ POOL_destroy(spritesPool);
163
+ spritesPool = NULL;
164
+ VRAM_releaseRegion(&vram);
165
+ spriteVramSize = 0;
166
+
167
+ // need to update user tile max index
168
+ updateUserTileMaxIndex();
169
+
170
+ // try to pack memory free blocks (before to avoid memory fragmentation)
171
+ MEM_pack();
172
+
173
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_INFO)
174
+ KLog("Sprite engine ended !");
175
+ #endif
176
+ }
177
+ }
178
+
179
+ bool SPR_isInitialized()
180
+ {
181
+ return (spritesPool != NULL);
182
+ }
183
+
184
+ void SPR_reset()
185
+ {
186
+ // release all and clear sprites data
187
+ POOL_reset(spritesPool, TRUE);
188
+
189
+ // no active sprites
190
+ firstSprite = NULL;
191
+ lastSprite = NULL;
192
+
193
+ // clear VRAM region
194
+ VRAM_clearRegion(&vram);
195
+ // reset VDP sprite (allocation and display)
196
+ VDP_resetSprites();
197
+
198
+ // we reserve sprite 0 for sorting (cannot be used for display)
199
+ starter = &vdpSpriteCache[VDP_allocateSprites(1)];
200
+ // hide it (should be already done by VDP_resetSprites)
201
+ starter->y = 0;
202
+
203
+ #ifdef SPR_PROFIL
204
+ memset(profil_time, 0, sizeof(profil_time));
205
+ #endif // SPR_PROFIL
206
+
207
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_INFO)
208
+ KLog("Sprite engine reset");
209
+ KLog_U1(" VRAM region free: ", VRAM_getFree(&vram));
210
+ KLog_U1(" Available VDP sprites: ", VDP_getAvailableSprites());
211
+ #endif // LIB_DEBUG
212
+ }
213
+
214
+
215
+ static Sprite* allocateSprite(u16 head)
216
+ {
217
+ Sprite* result;
218
+
219
+ // allocate
220
+ result = POOL_allocate(spritesPool);
221
+ // enough sprite remaining ?
222
+ if (result == NULL)
223
+ {
224
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
225
+ KLog("allocateSprite(): failed - no more available sprite !");
226
+ #endif
227
+
228
+ return NULL;
229
+ }
230
+
231
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_INFO)
232
+ kprintf("allocateSprite(): success - allocating sprite at pos %d", POOL_find(spritesPool, result));
233
+ #endif // LIB_DEBUG
234
+
235
+ if (head)
236
+ {
237
+ // add the new sprite at the beginning of the chained list
238
+ if (firstSprite) firstSprite->prev = result;
239
+ result->prev = NULL;
240
+ result->next = firstSprite;
241
+ // update first and last sprite
242
+ if (lastSprite == NULL) lastSprite = result;
243
+ firstSprite = result;
244
+ }
245
+ else
246
+ {
247
+ // add the new sprite at the end of the chained list
248
+ if (lastSprite) lastSprite->next = result;
249
+ result->prev = lastSprite;
250
+ result->next = NULL;
251
+ // update first and last sprite
252
+ if (firstSprite == NULL) firstSprite = result;
253
+ lastSprite = result;
254
+ }
255
+
256
+ // mark as allocated --> this is done after allocate call, not needed here
257
+ // result->status = ALLOCATED;
258
+
259
+ return result;
260
+ }
261
+
262
+ static bool releaseSprite(Sprite* sprite)
263
+ {
264
+ START_PROFIL
265
+
266
+ // really allocated ?
267
+ if (sprite->status & ALLOCATED)
268
+ {
269
+ Sprite* prev;
270
+ Sprite* next;
271
+ VDPSprite* lastVDPSprite;
272
+
273
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_INFO)
274
+ kprintf("releaseSprite: success - released sprite at pos %d", POOL_find(spritesPool, sprite));
275
+ #endif // LIB_DEBUG
276
+
277
+ // release sprite (we don't need stack coherency here as we don't use stack iteration)
278
+ POOL_release(spritesPool, sprite, FALSE);
279
+
280
+ // remove sprite from chained list
281
+ prev = sprite->prev;
282
+ next = sprite->next;
283
+
284
+ // get the last VDP sprite to link from
285
+ if (prev)
286
+ {
287
+ lastVDPSprite = prev->lastVDPSprite;
288
+ prev->next = next;
289
+ }
290
+ else
291
+ {
292
+ lastVDPSprite = starter;
293
+ // update first sprite
294
+ firstSprite = next;
295
+ }
296
+ // get the next VDP Sprite index to link to
297
+ if (next)
298
+ {
299
+ lastVDPSprite->link = next->VDPSpriteIndex;
300
+ next->prev = prev;
301
+ }
302
+ else
303
+ {
304
+ lastVDPSprite->link = 0;
305
+ // update last sprite
306
+ lastSprite = prev;
307
+ }
308
+
309
+ // not anymore allocated
310
+ sprite->status &= ~ALLOCATED;
311
+
312
+ END_PROFIL(PROFIL_RELEASE_SPRITE)
313
+
314
+ return TRUE;
315
+ }
316
+
317
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
318
+ kprintf("SPR_internalReleaseSprite: failed - sprite at address %p is not allocated !", sprite);
319
+ #endif // LIB_DEBUG
320
+
321
+ END_PROFIL(PROFIL_RELEASE_SPRITE)
322
+
323
+ return FALSE;
324
+ }
325
+
326
+ static bool isSpriteValid(Sprite* sprite, char* methodName)
327
+ {
328
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
329
+ if (!(sprite->status & ALLOCATED))
330
+ {
331
+ kprintf("%s: error - sprite at address %p is invalid (not allocated) !", methodName, sprite);
332
+ return FALSE;
333
+ }
334
+ #endif
335
+
336
+ return TRUE;
337
+ }
338
+
339
+ Sprite* NO_INLINE SPR_addSpriteEx(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut, u16 spriteIndex, u16 flag)
340
+ {
341
+ START_PROFIL
342
+
343
+ s16 ind;
344
+ Sprite* sprite;
345
+
346
+ // allocate new sprite
347
+ sprite = allocateSprite(flag & SPR_FLAG_INSERT_HEAD);
348
+
349
+ // can't allocate --> return NULL
350
+ if (!sprite)
351
+ {
352
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
353
+ KDebug_Alert("SPR_addSpriteEx failed: max sprite number reached !");
354
+ #endif
355
+
356
+ return NULL;
357
+ }
358
+
359
+ sprite->status = ALLOCATED | (flag & SPR_FLAG_MASK);
360
+
361
+ #ifdef SPR_DEBUG
362
+ KLog_U2("SPR_addSpriteEx: added sprite #", getSpriteIndex(sprite), " - internal position = ", sprite - spritesBank);
363
+ #endif // SPR_DEBUG
364
+
365
+ // auto visibility ?
366
+ if (flag & SPR_FLAG_AUTO_VISIBILITY) sprite->visibility = 0;
367
+ // otherwise we set it to visible by default
368
+ else sprite->visibility = VISIBILITY_ON;
369
+ // initialized with specified flag
370
+ sprite->definition = spriteDef;
371
+ sprite->onFrameChange = NULL;
372
+
373
+ // FIXME: not needed
374
+ // sprite->animation = NULL;
375
+ sprite->frame = NULL;
376
+
377
+ sprite->animInd = -1;
378
+ sprite->frameInd = -1;
379
+ // sprite->seqInd = -1;
380
+
381
+ sprite->x = x + 0x80;
382
+ sprite->y = y + 0x80;
383
+ // depending sprite position (first or last) we set its default depth
384
+ if (flag & SPR_FLAG_INSERT_HEAD) sprite->depth = SPR_MIN_DEPTH;
385
+ else sprite->depth = SPR_MAX_DEPTH;
386
+
387
+ const u16 numVDPSprite = spriteDef->maxNumSprite;
388
+
389
+ // default on sprite init
390
+ sprite->lastNumSprite = numVDPSprite;
391
+ sprite->spriteToHide = 0;
392
+
393
+ // auto VDP sprite alloc enabled ?
394
+ if (flag & SPR_FLAG_AUTO_SPRITE_ALLOC)
395
+ {
396
+ // allocate VDP sprite
397
+ ind = VDP_allocateSprites(numVDPSprite);
398
+ // not enough --> release sprite and return NULL
399
+ if (ind == -1)
400
+ {
401
+ releaseSprite(sprite);
402
+ return NULL;
403
+ }
404
+
405
+ #ifdef SPR_DEBUG
406
+ KLog_U3(" allocated ", numVDPSprite, " VDP sprite(s) at ", ind, ", remaining VDP sprite = ", VDP_getAvailableSprites());
407
+ #endif // SPR_DEBUG
408
+ }
409
+ // use given sprite index
410
+ else ind = spriteIndex;
411
+
412
+ // set the VDP Sprite index for this sprite and do attached operation
413
+ setVDPSpriteIndex(sprite, ind, numVDPSprite);
414
+
415
+ // auto VRAM alloc enabled ?
416
+ if (flag & SPR_FLAG_AUTO_VRAM_ALLOC)
417
+ {
418
+ // allocate VRAM
419
+ ind = VRAM_alloc(&vram, spriteDef->maxNumTile);
420
+ // not enough --> release sprite and return NULL
421
+ if (ind < 0)
422
+ {
423
+ // release allocated VDP sprites
424
+ if (flag & SPR_FLAG_AUTO_SPRITE_ALLOC)
425
+ VDP_releaseSprites(sprite->VDPSpriteIndex, numVDPSprite);
426
+
427
+ releaseSprite(sprite);
428
+ return NULL;
429
+ }
430
+
431
+ // set VRAM index and preserve specific attributs from parameter
432
+ sprite->attribut = ind | (attribut & TILE_ATTR_MASK);
433
+
434
+ #ifdef SPR_DEBUG
435
+ KLog_U3(" allocated ", spriteDef->maxNumTile, " tiles in VRAM at ", ind, ", remaining VRAM: ", VRAM_getFree(&vram));
436
+ #endif // SPR_DEBUG
437
+ }
438
+ // just use the given attribut
439
+ else sprite->attribut = attribut;
440
+
441
+ // set anim and frame to 0 (important to do it after sprite->attribut has been set)
442
+ SPR_setAnimAndFrame(sprite, 0, 0);
443
+
444
+ END_PROFIL(PROFIL_ADD_SPRITE)
445
+
446
+ return sprite;
447
+ }
448
+
449
+ Sprite* SPR_addSprite(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut)
450
+ {
451
+ return SPR_addSpriteEx(spriteDef, x, y, attribut, 0,
452
+ SPR_FLAG_AUTO_VRAM_ALLOC | SPR_FLAG_AUTO_SPRITE_ALLOC | SPR_FLAG_AUTO_TILE_UPLOAD);
453
+ }
454
+
455
+ Sprite* SPR_addSpriteExSafe(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut, u16 spriteIndex, u16 flag)
456
+ {
457
+ Sprite* result = SPR_addSpriteEx(spriteDef, x, y, attribut, spriteIndex, flag);
458
+
459
+ // allocation failed ?
460
+ if (result == NULL)
461
+ {
462
+ // try to defragment VRAM, it can help
463
+ SPR_defragVRAM();
464
+ // VRAM is now defragmented, so allocation should pass this time
465
+ result = SPR_addSpriteEx(spriteDef, x, y, attribut, spriteIndex, flag);
466
+ }
467
+
468
+ return result;
469
+ }
470
+
471
+ Sprite* SPR_addSpriteSafe(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut)
472
+ {
473
+ Sprite* result = SPR_addSprite(spriteDef, x, y, attribut);
474
+
475
+ // allocation failed ?
476
+ if (result == NULL)
477
+ {
478
+ // try to defragment VRAM, it can help
479
+ SPR_defragVRAM();
480
+ // VRAM is now defragmented, so allocation should pass this time
481
+ result = SPR_addSprite(spriteDef, x, y, attribut);
482
+ }
483
+
484
+ return result;
485
+ }
486
+
487
+ void SPR_releaseSprite(Sprite* sprite)
488
+ {
489
+ START_PROFIL
490
+
491
+ #ifdef SPR_DEBUG
492
+ KLog_U2("SPR_releaseSprite: releasing sprite #", getSpriteIndex(sprite), " - internal position = ", sprite - spritesBank);
493
+ #endif // SPR_DEBUG
494
+
495
+ // release sprite
496
+ if (!releaseSprite(sprite))
497
+ {
498
+ END_PROFIL(PROFIL_REMOVE_SPRITE)
499
+
500
+ return;
501
+ }
502
+
503
+ u16 status = sprite->status;
504
+
505
+ // auto VDP sprite alloc enabled --> release VDP sprite(s)
506
+ if (status & SPR_FLAG_AUTO_SPRITE_ALLOC)
507
+ {
508
+ VDP_releaseSprites(sprite->VDPSpriteIndex, sprite->definition->maxNumSprite);
509
+
510
+ #ifdef SPR_DEBUG
511
+ KLog_U3(" released ", sprite->definition->maxNumSprite, " VDP sprite(s) at ", sprite->VDPSpriteIndex, ", remaining VDP sprite = ", VDP_getAvailableSprites());
512
+ #endif // SPR_DEBUG
513
+ }
514
+ // auto VRAM alloc enabled --> release VRAM area allocated for this sprite
515
+ if (status & SPR_FLAG_AUTO_VRAM_ALLOC)
516
+ {
517
+ VRAM_free(&vram, sprite->attribut & TILE_INDEX_MASK);
518
+
519
+ #ifdef SPR_DEBUG
520
+ KLog_U3(" released ", sprite->definition->maxNumTile, " tiles in VRAM at ", sprite->attribut & TILE_INDEX_MASK, ", remaining VRAM: ", VRAM_getFree(&vram));
521
+ #endif // SPR_DEBUG
522
+ }
523
+
524
+ END_PROFIL(PROFIL_REMOVE_SPRITE)
525
+ }
526
+
527
+ u16 SPR_getNumActiveSprite()
528
+ {
529
+ return POOL_getNumAllocated(spritesPool);
530
+ }
531
+
532
+ NO_INLINE void SPR_defragVRAM()
533
+ {
534
+ START_PROFIL
535
+
536
+ Sprite* sprite;
537
+
538
+ // release VRAM region
539
+ VRAM_releaseRegion(&vram);
540
+ // pack
541
+ MEM_pack();
542
+ // and re-create it
543
+ VRAM_createRegion(&vram, TILE_SPRITE_INDEX, spriteVramSize);
544
+
545
+ // iterate over all sprites to re-allocate auto allocated VRAM
546
+ sprite = firstSprite;
547
+ while(sprite)
548
+ {
549
+ u16 status = sprite->status;
550
+
551
+ // sprite is using auto VRAM allocation ?
552
+ if (status & SPR_FLAG_AUTO_VRAM_ALLOC)
553
+ {
554
+ // re-allocate VRAM for this sprite (can't fail here)
555
+ const u16 ind = VRAM_alloc(&vram, sprite->definition->maxNumTile);
556
+ const u16 attr = sprite->attribut;
557
+
558
+ // VRAM allocation changed ?
559
+ if ((attr & ~TILE_ATTR_MASK) != ind)
560
+ {
561
+ // set VRAM index and preserve previous attributs
562
+ sprite->attribut = ind | (attr & TILE_ATTR_MASK);
563
+
564
+ // need to update VDP sprite table
565
+ status |= NEED_ST_ALL_UPDATE;
566
+ // auto tile upload enabled ? --> need to re upload tile to new location
567
+ if (status & SPR_FLAG_AUTO_TILE_UPLOAD)
568
+ status |= NEED_TILES_UPLOAD;
569
+
570
+ sprite->status = status;
571
+ }
572
+ }
573
+
574
+ // next sprite
575
+ sprite = sprite->next;
576
+ }
577
+
578
+ END_PROFIL(PROFIL_VRAM_DEFRAG)
579
+ }
580
+
581
+ static u16 getTilesetIndex(TileSet** tilesets, u16* indexes, TileSet* tileset, u16 index)
582
+ {
583
+ TileSet** t = tilesets;
584
+ u16* i = indexes;
585
+
586
+ // try fo find if tileset already exist
587
+ while(*t)
588
+ {
589
+ // find the tileset, return its index
590
+ if (*t == tileset) return *i;
591
+ // next
592
+ t++; i++;
593
+ }
594
+
595
+ // set new tileset index
596
+ *t = tileset;
597
+ *i = index;
598
+
599
+ return index;
600
+ }
601
+
602
+ NO_INLINE u16** SPR_loadAllFrames(const SpriteDefinition* sprDef, u16 index, u16* totalNumTile)
603
+ {
604
+ u16 numFrameTot = 0;
605
+ u16 numTileTot = 0;
606
+ Animation** anim = sprDef->animations;
607
+ const u16 numAnimation = sprDef->numAnimation;
608
+
609
+ for(u16 indAnim = 0; indAnim < numAnimation; indAnim++)
610
+ {
611
+ AnimationFrame** frame = (*anim)->frames;
612
+ const u16 numFrame = (*anim)->numFrame;
613
+
614
+ for(u16 indFrame = 0; indFrame < numFrame; indFrame++)
615
+ {
616
+ numTileTot += (*frame)->tileset->numTile;
617
+ frame++;
618
+ }
619
+
620
+ numFrameTot += numFrame;
621
+ anim++;
622
+ }
623
+
624
+ // allocate result table indexes[numAnim][numFrame]
625
+ u16** indexes = MEM_alloc((numAnimation * sizeof(u16*)) + (numFrameTot * sizeof(u16)));
626
+ // used to detect duplicate
627
+ TileSet** tilesets = MEM_alloc(numFrameTot * sizeof(TileSet*));
628
+ u16* tilesetIndexes = MEM_alloc(numFrameTot * sizeof(u16));
629
+
630
+ // not enough memory
631
+ if ((tilesets == NULL) || (tilesetIndexes == NULL) || (indexes == NULL))
632
+ {
633
+ if (totalNumTile) *totalNumTile = 0;
634
+ if (tilesets) MEM_free(tilesets);
635
+ if (tilesetIndexes) MEM_free(tilesetIndexes);
636
+ if (indexes) MEM_free(indexes);
637
+
638
+ return NULL;
639
+ }
640
+
641
+ // clear tilesets table
642
+ memset(tilesets, 0, numFrameTot * sizeof(TileSet*));
643
+
644
+ // store pointer
645
+ u16** result = indexes;
646
+ // init frames indexes pointer
647
+ u16* indFrames = (u16*) (indexes + numAnimation);
648
+
649
+ // start index
650
+ u16 tileInd = index;
651
+ anim = sprDef->animations;
652
+
653
+ for(u16 indAnim = 0; indAnim < numAnimation; indAnim++)
654
+ {
655
+ // store frames indexes pointer for this animation
656
+ *indexes++ = indFrames;
657
+
658
+ AnimationFrame** frame = (*anim)->frames;
659
+ const u16 numFrame = (*anim)->numFrame;
660
+
661
+ for(u16 indFrame = 0; indFrame < numFrame; indFrame++)
662
+ {
663
+ const TileSet* tileset = (*frame)->tileset;
664
+ const u16 ind = getTilesetIndex(tilesets, tilesetIndexes, (TileSet*) tileset, tileInd);
665
+
666
+ // new tileset ?
667
+ if (ind == tileInd)
668
+ {
669
+ // load tileset
670
+ VDP_loadTileSet(tileset, tileInd, DMA);
671
+ // next tileset
672
+ tileInd += tileset->numTile;
673
+ }
674
+ // store frame tile index
675
+ *indFrames++ = ind;
676
+ // next frame
677
+ frame++;
678
+ }
679
+
680
+ anim++;
681
+ }
682
+
683
+ // store total num tile (discarding duplicated tilesets)
684
+ if (totalNumTile) *totalNumTile = (tileInd - index);
685
+
686
+ MEM_free(tilesets);
687
+ MEM_free(tilesetIndexes);
688
+ MEM_pack();
689
+
690
+ return result;
691
+ }
692
+
693
+
694
+ NO_INLINE bool SPR_setDefinition(Sprite* sprite, const SpriteDefinition* spriteDef)
695
+ {
696
+ START_PROFIL
697
+
698
+ #ifdef SPR_DEBUG
699
+ KLog_U1("SPR_setDefinition: #", getSpriteIndex(sprite));
700
+ #endif // SPR_DEBUG
701
+
702
+ if (!isSpriteValid(sprite, "SPR_setDefinition"))
703
+ return FALSE;
704
+
705
+ // nothing to do...
706
+ if (sprite->definition == spriteDef) return TRUE;
707
+
708
+ u16 status = sprite->status;
709
+ const u16 oldNumSprite = sprite->definition->maxNumSprite;
710
+ const u16 newNumSprite = spriteDef->maxNumSprite;
711
+
712
+ // definition changed --> re-init that
713
+ sprite->lastNumSprite = newNumSprite;
714
+ sprite->spriteToHide = 0;
715
+
716
+ // auto VDP sprite alloc enabled and sprite number changed ? --> realloc VDP sprite(s)
717
+ if ((status & SPR_FLAG_AUTO_SPRITE_ALLOC) && (oldNumSprite != newNumSprite))
718
+ {
719
+ // we release previous allocated VDP sprite(s)
720
+ VDP_releaseSprites(sprite->VDPSpriteIndex, oldNumSprite);
721
+
722
+ #ifdef SPR_DEBUG
723
+ KLog_U3(" released ", oldNumSprite, " VDP sprite(s) at ", sprite->VDPSpriteIndex, ", remaining VDP sprite = ", VDP_getAvailableSprites());
724
+ #endif // SPR_DEBUG
725
+
726
+ // then we allocate the VDP sprite(s) for the new definition
727
+ const s16 ind = VDP_allocateSprites(newNumSprite);
728
+ // not enough --> return error
729
+ if (ind == -1) return FALSE;
730
+
731
+ // set the VDP Sprite index for this sprite and do attached operation
732
+ setVDPSpriteIndex(sprite, ind, newNumSprite);
733
+
734
+ #ifdef SPR_DEBUG
735
+ KLog_U3(" allocated ", newNumSprite, " VDP sprite(s) at ", ind, ", remaining VDP sprite = ", VDP_getAvailableSprites());
736
+ #endif // SPR_DEBUG
737
+ }
738
+
739
+ const u16 newNumTile = spriteDef->maxNumTile;
740
+
741
+ // auto VRAM alloc enabled --> realloc VRAM tile area
742
+ if ((status & SPR_FLAG_AUTO_VRAM_ALLOC) && (sprite->definition->maxNumTile != newNumTile))
743
+ {
744
+ // we release previous allocated VRAM
745
+ VRAM_free(&vram, sprite->attribut & TILE_INDEX_MASK);
746
+
747
+ #ifdef SPR_DEBUG
748
+ KLog_U3(" released ", sprite->definition->maxNumTile, " tiles in VRAM at ", sprite->attribut & TILE_INDEX_MASK, ", remaining VRAM: ", VRAM_getFree(&vram));
749
+ #endif // SPR_DEBUG
750
+
751
+ // allocate VRAM
752
+ const s16 ind = VRAM_alloc(&vram, newNumTile);
753
+ // not enough --> return error
754
+ if (ind < 0) return FALSE;
755
+
756
+ // preserve the attributes and just overwrite VRAM index (set frame will rebuild everything)
757
+ sprite->attribut = (sprite->attribut & TILE_ATTR_MASK) | ind;
758
+
759
+ #ifdef SPR_DEBUG
760
+ KLog_U3(" allocated ", spriteDef->maxNumTile, " tiles in VRAM at ", ind, ", remaining VRAM: ", VRAM_getFree(&vram));
761
+ #endif // SPR_DEBUG
762
+ }
763
+
764
+ sprite->definition = spriteDef;
765
+ // FIXME: not needed
766
+ // sprite->animation = NULL;
767
+ sprite->frame = NULL;
768
+ sprite->animInd = -1;
769
+ sprite->frameInd = -1;
770
+ // sprite->seqInd = -1;
771
+
772
+ // set anim and frame to 0
773
+ SPR_setAnimAndFrame(sprite, 0, 0);
774
+
775
+ END_PROFIL(PROFIL_SET_DEF)
776
+
777
+ return TRUE;
778
+ }
779
+
780
+ s16 SPR_getPositionX(Sprite* sprite)
781
+ {
782
+ return sprite->x - 0x80;
783
+ }
784
+
785
+ s16 SPR_getPositionY(Sprite* sprite)
786
+ {
787
+ return sprite->y - 0x80;
788
+ }
789
+
790
+ void SPR_setPosition(Sprite* sprite, s16 x, s16 y)
791
+ {
792
+ START_PROFIL
793
+
794
+ const s16 newx = x + 0x80;
795
+ const s16 newy = y + 0x80;
796
+
797
+ #ifdef SPR_DEBUG
798
+ KLog_U3("SPR_setPosition: #", getSpriteIndex(sprite), " X=", newx, " Y=", newy);
799
+ #endif // SPR_DEBUG
800
+
801
+ if (!isSpriteValid(sprite, "SPR_setPosition"))
802
+ return;
803
+
804
+ if ((sprite->x != newx) || (sprite->y != newy))
805
+ {
806
+ u16 status = sprite->status;
807
+
808
+ sprite->x = newx;
809
+ sprite->y = newy;
810
+
811
+ // need to recompute visibility if auto visibility is enabled
812
+ if (status & SPR_FLAG_AUTO_VISIBILITY)
813
+ status |= NEED_VISIBILITY_UPDATE;
814
+
815
+ sprite->status = status | NEED_ST_POS_UPDATE;
816
+ }
817
+
818
+ END_PROFIL(PROFIL_SET_ATTRIBUTE)
819
+ }
820
+
821
+ void SPR_setHFlip(Sprite* sprite, bool value)
822
+ {
823
+ START_PROFIL
824
+
825
+ if (!isSpriteValid(sprite, "SPR_setHFlip"))
826
+ return;
827
+
828
+ u16 attr = sprite->attribut;
829
+
830
+ if (attr & TILE_ATTR_HFLIP_MASK)
831
+ {
832
+ // H flip removed
833
+ if (!value)
834
+ {
835
+ // update attribut
836
+ sprite->attribut = attr & ~TILE_ATTR_HFLIP_MASK;
837
+
838
+ #ifdef SPR_DEBUG
839
+ KLog_U1_("SPR_setHFlip: #", getSpriteIndex(sprite), " removed HFlip");
840
+ #endif // SPR_DEBUG
841
+
842
+ // need to recompute visibility if auto visibility is enabled
843
+ if (sprite->status & SPR_FLAG_AUTO_VISIBILITY)
844
+ sprite->status |= NEED_VISIBILITY_UPDATE | NEED_ST_ALL_UPDATE;
845
+ else
846
+ sprite->status |= NEED_ST_ALL_UPDATE;
847
+ }
848
+ }
849
+ else
850
+ {
851
+ // H flip set
852
+ if (value)
853
+ {
854
+ // update attribut
855
+ sprite->attribut = attr | TILE_ATTR_HFLIP_MASK;
856
+
857
+ #ifdef SPR_DEBUG
858
+ KLog_U1_("SPR_setHFlip: #", getSpriteIndex(sprite), " added HFlip");
859
+ #endif // SPR_DEBUG
860
+
861
+ // need to recompute visibility if auto visibility is enabled
862
+ if (sprite->status & SPR_FLAG_AUTO_VISIBILITY)
863
+ sprite->status |= NEED_VISIBILITY_UPDATE | NEED_ST_ALL_UPDATE;
864
+ else
865
+ sprite->status |= NEED_ST_ALL_UPDATE;
866
+ }
867
+ }
868
+
869
+ END_PROFIL(PROFIL_SET_ATTRIBUTE)
870
+ }
871
+
872
+ void SPR_setVFlip(Sprite* sprite, bool value)
873
+ {
874
+ START_PROFIL
875
+
876
+ if (!isSpriteValid(sprite, "SPR_setVFlip"))
877
+ return;
878
+
879
+ u16 attr = sprite->attribut;
880
+
881
+ if (attr & TILE_ATTR_VFLIP_MASK)
882
+ {
883
+ // V flip removed
884
+ if (!value)
885
+ {
886
+ // update attribut
887
+ sprite->attribut = attr & ~TILE_ATTR_VFLIP_MASK;
888
+
889
+ #ifdef SPR_DEBUG
890
+ KLog_U1_("SPR_setVFlip: #", getSpriteIndex(sprite), " removed VFlip");
891
+ #endif // SPR_DEBUG
892
+
893
+ // need to recompute visibility if auto visibility is enabled
894
+ if (sprite->status & SPR_FLAG_AUTO_VISIBILITY)
895
+ sprite->status |= NEED_VISIBILITY_UPDATE | NEED_ST_ALL_UPDATE;
896
+ else
897
+ sprite->status |= NEED_ST_ALL_UPDATE;
898
+ }
899
+ }
900
+ else
901
+ {
902
+ // V flip set
903
+ if (value)
904
+ {
905
+ // update attribut
906
+ sprite->attribut = attr | TILE_ATTR_VFLIP_MASK;
907
+
908
+ #ifdef SPR_DEBUG
909
+ KLog_U1_("SPR_setVFlip: #", getSpriteIndex(sprite), " added VFlip");
910
+ #endif // SPR_DEBUG
911
+
912
+ // need to recompute visibility if auto visibility is enabled
913
+ if (sprite->status & SPR_FLAG_AUTO_VISIBILITY)
914
+ sprite->status |= NEED_VISIBILITY_UPDATE | NEED_ST_ALL_UPDATE;
915
+ else
916
+ sprite->status |= NEED_ST_ALL_UPDATE;
917
+ }
918
+ }
919
+
920
+ END_PROFIL(PROFIL_SET_ATTRIBUTE)
921
+ }
922
+
923
+ void SPR_setPriority(Sprite* sprite, bool value)
924
+ {
925
+ START_PROFIL
926
+
927
+ if (!isSpriteValid(sprite, "SPR_setPriority"))
928
+ return;
929
+
930
+ const u16 attr = sprite->attribut;
931
+
932
+ if (attr & TILE_ATTR_PRIORITY_MASK)
933
+ {
934
+ // priority removed
935
+ if (!value)
936
+ {
937
+ sprite->attribut = attr & (~TILE_ATTR_PRIORITY_MASK);
938
+ sprite->status |= NEED_ST_ALL_UPDATE;
939
+
940
+ #ifdef SPR_DEBUG
941
+ KLog_U1_("SPR_setPriority: #", getSpriteIndex(sprite), " removed priority");
942
+ #endif // SPR_DEBUG
943
+ }
944
+ }
945
+ else
946
+ {
947
+ // priority set
948
+ if (value)
949
+ {
950
+ sprite->attribut = attr | TILE_ATTR_PRIORITY_MASK;
951
+ sprite->status |= NEED_ST_ALL_UPDATE;
952
+
953
+ #ifdef SPR_DEBUG
954
+ KLog_U1_("SPR_setPriority: #", getSpriteIndex(sprite), " added priority");
955
+ #endif // SPR_DEBUG
956
+ }
957
+ }
958
+
959
+ END_PROFIL(PROFIL_SET_ATTRIBUTE)
960
+ }
961
+
962
+ void SPR_setPalette(Sprite* sprite, u16 value)
963
+ {
964
+ START_PROFIL
965
+
966
+ if (!isSpriteValid(sprite, "SPR_setPalette"))
967
+ return;
968
+
969
+ const u16 oldAttribut = sprite->attribut;
970
+ const u16 newAttribut = (oldAttribut & (~TILE_ATTR_PALETTE_MASK)) | (value << TILE_ATTR_PALETTE_SFT);
971
+
972
+ if (oldAttribut != newAttribut)
973
+ {
974
+ sprite->attribut = newAttribut;
975
+ // need to update VDP sprite attribut field only
976
+ sprite->status |= NEED_ST_ALL_UPDATE;
977
+
978
+ #ifdef SPR_DEBUG
979
+ KLog_U2("SPR_setPalette: #", getSpriteIndex(sprite), " palette=", value);
980
+ #endif // SPR_DEBUG
981
+ }
982
+
983
+ END_PROFIL(PROFIL_SET_ATTRIBUTE)
984
+ }
985
+
986
+ void SPR_setDepth(Sprite* sprite, s16 value)
987
+ {
988
+ START_PROFIL
989
+
990
+ if (!isSpriteValid(sprite, "SPR_setDepth"))
991
+ return;
992
+
993
+ // depth changed ?
994
+ if (sprite->depth != value)
995
+ {
996
+ #ifdef SPR_DEBUG
997
+ KLog_U2("SPR_setDepth: #", getSpriteIndex(sprite), " Depth=", value);
998
+ #endif // SPR_DEBUG
999
+
1000
+ // set depth and sort sprite (need to be done immediately to get consistent sort)
1001
+ sprite->depth = value;
1002
+ sortSprite(sprite);
1003
+ }
1004
+
1005
+ END_PROFIL(PROFIL_SET_ATTRIBUTE)
1006
+ }
1007
+
1008
+ void SPR_setZ(Sprite* sprite, s16 value)
1009
+ {
1010
+ SPR_setDepth(sprite, value);
1011
+ }
1012
+
1013
+ void SPR_setAlwaysOnTop(Sprite* sprite)
1014
+ {
1015
+ SPR_setDepth(sprite, SPR_MIN_DEPTH);
1016
+ }
1017
+
1018
+ void SPR_setAlwaysAtBottom(Sprite* sprite)
1019
+ {
1020
+ SPR_setDepth(sprite, SPR_MAX_DEPTH);
1021
+ }
1022
+
1023
+ void SPR_setAnimAndFrame(Sprite* sprite, s16 anim, s16 frame)
1024
+ {
1025
+ START_PROFIL
1026
+
1027
+ if (!isSpriteValid(sprite, "SPR_setAnimAndFrame"))
1028
+ return;
1029
+
1030
+ if ((sprite->animInd != anim) || (sprite->frameInd != frame))
1031
+ {
1032
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
1033
+ if (anim >= (s16) sprite->definition->numAnimation)
1034
+ {
1035
+ kprintf("SPR_setAnimAndFrame: error - trying to use non existing animation #%d on definition=%p - num animation = %d", anim, sprite->definition, sprite->definition->numAnimation);
1036
+ return;
1037
+ }
1038
+ #endif // LIB_DEBUG
1039
+
1040
+ Animation* animation = sprite->definition->animations[anim];
1041
+
1042
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
1043
+ if (frame >= (s16) animation->numFrame)
1044
+ {
1045
+ kprintf("SPR_setAnimAndFrame: error - trying to use non existing frame #%d for animation %d on definition=%p - num frame = %d", frame, anim, sprite->definition, animation->numFrame);
1046
+ return;
1047
+ }
1048
+ #endif // LIB_DEBUG
1049
+
1050
+ sprite->animInd = anim;
1051
+ sprite->frameInd = frame;
1052
+ sprite->animation = animation;
1053
+
1054
+ // set timer to 0 to prevent auto animation to change frame in between
1055
+ if (sprite->timer > 0)
1056
+ sprite->timer = 0;
1057
+
1058
+ #ifdef SPR_DEBUG
1059
+ KLog_U3("SPR_setAnimAndFrame: #", getSpriteIndex(sprite), " anim=", anim, " frame=", frame);
1060
+ #endif // SPR_DEBUG
1061
+
1062
+ sprite->status |= NEED_FRAME_UPDATE;
1063
+ }
1064
+
1065
+ END_PROFIL(PROFIL_SET_ANIM_FRAME)
1066
+ }
1067
+
1068
+ void SPR_setAnim(Sprite* sprite, s16 anim)
1069
+ {
1070
+ START_PROFIL
1071
+
1072
+ if (!isSpriteValid(sprite, "SPR_setAnim"))
1073
+ return;
1074
+
1075
+ if (sprite->animInd != anim)
1076
+ {
1077
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
1078
+ if (anim >= (s16) sprite->definition->numAnimation)
1079
+ {
1080
+ kprintf("SPR_setAnim: error - trying to use non existing animation #%d on definition=%p - num animation = %d", anim, sprite->definition, sprite->definition->numAnimation);
1081
+ return;
1082
+ }
1083
+ #endif // LIB_DEBUG
1084
+
1085
+ sprite->animInd = anim;
1086
+ // first frame by default
1087
+ sprite->frameInd = 0;
1088
+ sprite->animation = sprite->definition->animations[anim];
1089
+
1090
+ // set timer to 0 to prevent auto animation to change frame in between
1091
+ if (sprite->timer > 0)
1092
+ sprite->timer = 0;
1093
+
1094
+ #ifdef SPR_DEBUG
1095
+ KLog_U2_("SPR_setAnim: #", getSpriteIndex(sprite), " anim=", anim, " frame=0");
1096
+ #endif // SPR_DEBUG
1097
+
1098
+ sprite->status |= NEED_FRAME_UPDATE;
1099
+ }
1100
+
1101
+ END_PROFIL(PROFIL_SET_ANIM_FRAME)
1102
+ }
1103
+
1104
+ void SPR_setFrame(Sprite* sprite, s16 frame)
1105
+ {
1106
+ START_PROFIL
1107
+
1108
+ if (!isSpriteValid(sprite, "SPR_setFrame"))
1109
+ return;
1110
+
1111
+ if (sprite->frameInd != frame)
1112
+ {
1113
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
1114
+ if (frame >= (s16) sprite->animation->numFrame)
1115
+ {
1116
+ kprintf("SPR_setFrame: error - trying to use non existing frame #%d for animation %d on definition=%p - num frame = %d", frame, sprite->animInd, sprite->definition, sprite->animation->numFrame);
1117
+ return;
1118
+ }
1119
+ #endif // LIB_DEBUG
1120
+
1121
+ sprite->frameInd = frame;
1122
+
1123
+ // set timer to 0 to prevent auto animation to change frame in between
1124
+ if (sprite->timer > 0)
1125
+ sprite->timer = 0;
1126
+
1127
+ #ifdef SPR_DEBUG
1128
+ KLog_U2("SPR_setFrame: #", getSpriteIndex(sprite), " frame=", frame);
1129
+ #endif // SPR_DEBUG
1130
+
1131
+ sprite->status |= NEED_FRAME_UPDATE;
1132
+ }
1133
+
1134
+ END_PROFIL(PROFIL_SET_ANIM_FRAME)
1135
+ }
1136
+
1137
+ void SPR_nextFrame(Sprite* sprite)
1138
+ {
1139
+ START_PROFIL
1140
+
1141
+ if (!isSpriteValid(sprite, "SPR_nextFrame"))
1142
+ return;
1143
+
1144
+ const Animation *anim = sprite->animation;
1145
+ u16 frameInd = sprite->frameInd + 1;
1146
+
1147
+ if (frameInd >= anim->numFrame)
1148
+ {
1149
+ // no loop ?
1150
+ if (sprite->status & SPR_FLAG_DISABLE_ANIMATION_LOOP)
1151
+ {
1152
+ // can quit now
1153
+ END_PROFIL(PROFIL_SET_ANIM_FRAME)
1154
+ return;
1155
+ }
1156
+
1157
+ // loop
1158
+ frameInd = anim->loop;
1159
+ // set animation done state (allows SPR_isAnimationDone(..) to correctly report state when called from frame change callback)
1160
+ sprite->status |= STATE_ANIMATION_DONE;
1161
+ }
1162
+
1163
+ // set new frame
1164
+ SPR_setFrame(sprite, frameInd);
1165
+
1166
+ END_PROFIL(PROFIL_SET_ANIM_FRAME)
1167
+ }
1168
+
1169
+ void SPR_setAutoAnimation(Sprite* sprite, bool value)
1170
+ {
1171
+ // for debug
1172
+ if (!isSpriteValid(sprite, "SPR_setAutoAnimation"))
1173
+ return;
1174
+
1175
+ if (value)
1176
+ {
1177
+ // currently disabled ? --> reset timer to current frame timer
1178
+ if (sprite->timer == -1)
1179
+ sprite->timer = sprite->frame->timer;
1180
+ }
1181
+ else
1182
+ {
1183
+ // disable it
1184
+ sprite->timer = -1;
1185
+ }
1186
+
1187
+ #ifdef SPR_DEBUG
1188
+ KLog_U2("SPR_setAutoAnimation: #", getSpriteIndex(sprite), " AutoAnimation=", value);
1189
+ #endif // SPR_DEBUG
1190
+ }
1191
+
1192
+ bool SPR_getAutoAnimation(Sprite* sprite)
1193
+ {
1194
+ // for debug
1195
+ if (!isSpriteValid(sprite, "SPR_getAutoAnimation"))
1196
+ return FALSE;
1197
+
1198
+ return (sprite->timer != -1)?TRUE:FALSE;
1199
+ }
1200
+
1201
+ void SPR_setAnimationLoop(Sprite* sprite, bool value)
1202
+ {
1203
+ // for debug
1204
+ if (!isSpriteValid(sprite, "SPR_setAnimationLoop"))
1205
+ return;
1206
+
1207
+ if (value) sprite->status &= ~SPR_FLAG_DISABLE_ANIMATION_LOOP;
1208
+ else sprite->status |= SPR_FLAG_DISABLE_ANIMATION_LOOP;
1209
+
1210
+ #ifdef SPR_DEBUG
1211
+ KLog_U2("SPR_setAnimationLoop: #", getSpriteIndex(sprite), " loop=", value);
1212
+ #endif // SPR_DEBUG
1213
+ }
1214
+
1215
+ bool SPR_isAnimationDone(Sprite* sprite)
1216
+ {
1217
+ // for debug
1218
+ if (!isSpriteValid(sprite, "SPR_isAnimationDone"))
1219
+ return FALSE;
1220
+
1221
+ // check for animation done state (mainly used for frame change callback) or
1222
+ return (sprite->status & STATE_ANIMATION_DONE) ||
1223
+ // if we are on last tick from last frame (if auto animation is disabled then only test for last frame)
1224
+ ((sprite->frameInd == (sprite->animation->numFrame - 1)) && ((sprite->timer == 1) || (sprite->timer == -1)));
1225
+ }
1226
+
1227
+
1228
+ bool SPR_setVRAMTileIndex(Sprite* sprite, s16 value)
1229
+ {
1230
+ START_PROFIL
1231
+
1232
+ if (!isSpriteValid(sprite, "SPR_setVRAMTileIndex"))
1233
+ return FALSE;
1234
+
1235
+ s16 newInd;
1236
+ u16 status = sprite->status;
1237
+ u16 oldAttribut = sprite->attribut;
1238
+
1239
+ if (status & SPR_FLAG_AUTO_VRAM_ALLOC)
1240
+ {
1241
+ // pass to manual allocation
1242
+ if (value != -1)
1243
+ {
1244
+ // remove auto vram alloc flag
1245
+ status &= ~SPR_FLAG_AUTO_VRAM_ALLOC;
1246
+ // release allocated VRAM first
1247
+ VRAM_free(&vram, oldAttribut & TILE_INDEX_MASK);
1248
+ // set fixed VRAM index
1249
+ newInd = value;
1250
+
1251
+ #ifdef SPR_DEBUG
1252
+ KLog_U2("SPR_setVRAMTileIndex: #", getSpriteIndex(sprite), " passed to manual allocation, VRAM index =", value);
1253
+ KLog_U3(" released ", sprite->definition->maxNumTile, " tiles in VRAM at ", sprite->attribut & TILE_INDEX_MASK, ", remaining VRAM: ", VRAM_getFree(&vram));
1254
+ #endif // SPR_DEBUG
1255
+ }
1256
+ // nothing to do --> just return TRUE
1257
+ else
1258
+ {
1259
+ END_PROFIL(PROFIL_SET_VRAM_OR_SPRIND)
1260
+
1261
+ return TRUE;
1262
+ }
1263
+ }
1264
+ else
1265
+ {
1266
+ // pass to auto allocation
1267
+ if (value == -1)
1268
+ {
1269
+ // set auto vram alloc flag
1270
+ status |= SPR_FLAG_AUTO_VRAM_ALLOC;
1271
+ // allocate VRAM
1272
+ newInd = VRAM_alloc(&vram, sprite->definition->maxNumTile);
1273
+
1274
+ #ifdef SPR_DEBUG
1275
+ KLog_U1_("SPR_setVRAMTileIndex: #", getSpriteIndex(sprite), " passed to auto allocation");
1276
+ KLog_U3(" allocated ", sprite->definition->maxNumTile, " tiles in VRAM at ", newInd, ", remaining VRAM: ", VRAM_getFree(&vram));
1277
+ #endif // SPR_DEBUG
1278
+
1279
+ // can't allocate ?
1280
+ if (newInd < 0)
1281
+ {
1282
+ // save status and return FALSE
1283
+ sprite->status = status;
1284
+
1285
+ END_PROFIL(PROFIL_SET_VRAM_OR_SPRIND)
1286
+
1287
+ return FALSE;
1288
+ }
1289
+ }
1290
+ // just use the new value for index
1291
+ else newInd = value;
1292
+ }
1293
+
1294
+ // VRAM tile index changed ?
1295
+ if ((oldAttribut & TILE_INDEX_MASK) != (u16) newInd)
1296
+ {
1297
+ sprite->attribut = (oldAttribut & TILE_ATTR_MASK) | newInd;
1298
+ // need to update sprite table
1299
+ status |= NEED_ST_ALL_UPDATE;
1300
+ // auto tile upload enabled ? --> need to re upload tile to new location
1301
+ if (status & SPR_FLAG_AUTO_TILE_UPLOAD)
1302
+ status |= NEED_TILES_UPLOAD;
1303
+ }
1304
+
1305
+ // save status
1306
+ sprite->status = status;
1307
+
1308
+ END_PROFIL(PROFIL_SET_VRAM_OR_SPRIND)
1309
+
1310
+ return TRUE;
1311
+ }
1312
+
1313
+ bool SPR_setSpriteTableIndex(Sprite* sprite, s16 value)
1314
+ {
1315
+ START_PROFIL
1316
+
1317
+ if (!isSpriteValid(sprite, "SPR_setSpriteTableIndex"))
1318
+ return FALSE;
1319
+
1320
+ s16 newInd;
1321
+ u16 status = sprite->status;
1322
+ u16 num = sprite->definition->maxNumSprite;
1323
+
1324
+ if (status & SPR_FLAG_AUTO_SPRITE_ALLOC)
1325
+ {
1326
+ // pass to manual allocation
1327
+ if (value != -1)
1328
+ {
1329
+ // remove auto VDP sprite alloc flag
1330
+ status &= ~SPR_FLAG_AUTO_SPRITE_ALLOC;
1331
+ // release allocated VDP sprite
1332
+ VDP_releaseSprites(sprite->VDPSpriteIndex, num);
1333
+ // set manually the VDP sprite index
1334
+ newInd = value;
1335
+
1336
+ #ifdef SPR_DEBUG
1337
+ KLog_U2("SPR_setSpriteTableIndex: #", getSpriteIndex(sprite), " passed to manual allocation, VDP Sprite index =", value);
1338
+ KLog_U3(" released ", num, " VDP sprite(s) at ", sprite->VDPSpriteIndex, ", remaining VDP sprite = ", VDP_getAvailableSprites());
1339
+ #endif // SPR_DEBUG
1340
+ }
1341
+ // nothing to do --> return TRUE
1342
+ else
1343
+ {
1344
+ END_PROFIL(PROFIL_SET_VRAM_OR_SPRIND)
1345
+
1346
+ return TRUE;
1347
+ }
1348
+ }
1349
+ else
1350
+ {
1351
+ // pass to auto allocation
1352
+ if (value == -1)
1353
+ {
1354
+ // set auto VDP sprite alloc flag
1355
+ status |= SPR_FLAG_AUTO_SPRITE_ALLOC;
1356
+ // allocate VDP sprite
1357
+ newInd = VDP_allocateSprites(num);
1358
+
1359
+ #ifdef SPR_DEBUG
1360
+ KLog_U1_("SPR_setSpriteTableIndex: #", getSpriteIndex(sprite), " passed to auto allocation");
1361
+ KLog_U3(" allocated ", num, " VDP sprite(s) at ", newInd, ", remaining VDP sprite = ", VDP_getAvailableSprites());
1362
+ #endif // SPR_DEBUG
1363
+
1364
+ // can't allocate ?
1365
+ if (newInd < 0)
1366
+ {
1367
+ // save status and return FALSE
1368
+ sprite->status = status;
1369
+
1370
+ END_PROFIL(PROFIL_SET_VRAM_OR_SPRIND)
1371
+
1372
+ return FALSE;
1373
+ }
1374
+ }
1375
+ // just use the new value for index
1376
+ else newInd = value;
1377
+ }
1378
+
1379
+ // VDP sprite index changed ?
1380
+ if (sprite->VDPSpriteIndex != (u16) newInd)
1381
+ {
1382
+ // set the VDP Sprite index for this sprite and do attached operation
1383
+ setVDPSpriteIndex(sprite, newInd, num);
1384
+ // need to update complete sprite table infos
1385
+ status |= NEED_ST_ALL_UPDATE;
1386
+ }
1387
+
1388
+ // save status
1389
+ sprite->status = status;
1390
+
1391
+ END_PROFIL(PROFIL_SET_VRAM_OR_SPRIND)
1392
+
1393
+ return TRUE;
1394
+ }
1395
+
1396
+ void SPR_setAutoTileUpload(Sprite* sprite, bool value)
1397
+ {
1398
+ if (!isSpriteValid(sprite, "SPR_setAutoTileUpload"))
1399
+ return;
1400
+
1401
+ if (value) sprite->status |= SPR_FLAG_AUTO_TILE_UPLOAD;
1402
+ else sprite->status &= ~SPR_FLAG_AUTO_TILE_UPLOAD;
1403
+ }
1404
+
1405
+ void SPR_setDelayedFrameUpdate(Sprite* sprite, bool value)
1406
+ {
1407
+ if (!isSpriteValid(sprite, "SPR_setDelayedFrameUpdate"))
1408
+ return;
1409
+
1410
+ if (value) sprite->status &= ~SPR_FLAG_DISABLE_DELAYED_FRAME_UPDATE;
1411
+ else sprite->status |= SPR_FLAG_DISABLE_DELAYED_FRAME_UPDATE;
1412
+ }
1413
+
1414
+ void SPR_setFrameChangeCallback(Sprite* sprite, FrameChangeCallback* callback)
1415
+ {
1416
+ if (!isSpriteValid(sprite, "SPR_setFrameChangeCallback"))
1417
+ return;
1418
+
1419
+ sprite->onFrameChange = callback;
1420
+ }
1421
+
1422
+ SpriteVisibility SPR_getVisibility(Sprite* sprite)
1423
+ {
1424
+ u16 status = sprite->status;
1425
+
1426
+ if (status & SPR_FLAG_AUTO_VISIBILITY)
1427
+ {
1428
+ if (status & SPR_FLAG_FAST_AUTO_VISIBILITY) return AUTO_FAST;
1429
+ else return AUTO_SLOW;
1430
+ }
1431
+
1432
+ if (sprite->visibility) return VISIBLE;
1433
+ else return HIDDEN;
1434
+ }
1435
+
1436
+ bool SPR_isVisible(Sprite* sprite, bool recompute)
1437
+ {
1438
+ if (!isSpriteValid(sprite, "SPR_isVisible"))
1439
+ return FALSE;
1440
+
1441
+ if (recompute)
1442
+ {
1443
+ u16 status = sprite->status;
1444
+
1445
+ // update visibility if needed
1446
+ if (status & NEED_VISIBILITY_UPDATE)
1447
+ {
1448
+ // frame update need to be done first
1449
+ if (status & NEED_FRAME_UPDATE)
1450
+ status = updateFrame(sprite, status);
1451
+ // then do visibility update
1452
+ sprite->status = updateVisibility(sprite, status);
1453
+ }
1454
+ }
1455
+
1456
+ return (sprite->visibility) ? TRUE : FALSE;
1457
+ }
1458
+
1459
+ void SPR_setVisibility(Sprite* sprite, SpriteVisibility value)
1460
+ {
1461
+ START_PROFIL
1462
+
1463
+ if (!isSpriteValid(sprite, "SPR_setVisibility"))
1464
+ return;
1465
+
1466
+ u16 status = sprite->status;
1467
+
1468
+ if (status & SPR_FLAG_AUTO_VISIBILITY)
1469
+ {
1470
+ switch(value)
1471
+ {
1472
+ case VISIBLE:
1473
+ status &= ~(SPR_FLAG_AUTO_VISIBILITY | SPR_FLAG_FAST_AUTO_VISIBILITY | NEED_VISIBILITY_UPDATE);
1474
+ status |= setVisibility(sprite, VISIBILITY_ON);
1475
+ break;
1476
+
1477
+ case HIDDEN:
1478
+ status &= ~(SPR_FLAG_AUTO_VISIBILITY | SPR_FLAG_FAST_AUTO_VISIBILITY | NEED_VISIBILITY_UPDATE);
1479
+ status |= setVisibility(sprite, VISIBILITY_OFF);
1480
+ break;
1481
+
1482
+ case AUTO_FAST:
1483
+ // passed from slow to fast visibility compute method
1484
+ if (!(status & SPR_FLAG_FAST_AUTO_VISIBILITY))
1485
+ status |= SPR_FLAG_FAST_AUTO_VISIBILITY | NEED_VISIBILITY_UPDATE;
1486
+ break;
1487
+
1488
+ case AUTO_SLOW:
1489
+ // passed from fast to slow visibility compute method
1490
+ if (status & SPR_FLAG_FAST_AUTO_VISIBILITY)
1491
+ {
1492
+ status &= ~SPR_FLAG_FAST_AUTO_VISIBILITY;
1493
+ status |= NEED_VISIBILITY_UPDATE;
1494
+ }
1495
+ break;
1496
+ }
1497
+ }
1498
+ else
1499
+ {
1500
+ switch(value)
1501
+ {
1502
+ case VISIBLE:
1503
+ status |= setVisibility(sprite, VISIBILITY_ON);
1504
+ break;
1505
+
1506
+ case HIDDEN:
1507
+ status |= setVisibility(sprite, VISIBILITY_OFF);
1508
+ break;
1509
+
1510
+ case AUTO_FAST:
1511
+ status |= SPR_FLAG_AUTO_VISIBILITY | SPR_FLAG_FAST_AUTO_VISIBILITY | NEED_VISIBILITY_UPDATE;
1512
+ break;
1513
+
1514
+ case AUTO_SLOW:
1515
+ status |= SPR_FLAG_AUTO_VISIBILITY | NEED_VISIBILITY_UPDATE;
1516
+ break;
1517
+ }
1518
+ }
1519
+
1520
+ // update status
1521
+ sprite->status = status;
1522
+
1523
+ END_PROFIL(PROFIL_SET_VISIBILITY)
1524
+ }
1525
+
1526
+
1527
+ void SPR_clear()
1528
+ {
1529
+ START_PROFIL
1530
+
1531
+ // save starter link
1532
+ u8 linkSave = starter->link;
1533
+
1534
+ VDP_clearSprites();
1535
+ VDP_updateSprites(1, DMA_QUEUE_COPY);
1536
+
1537
+ // restore starter link
1538
+ starter->link = linkSave;
1539
+
1540
+ END_PROFIL(PROFIL_CLEAR)
1541
+ }
1542
+
1543
+ NO_INLINE void SPR_update()
1544
+ {
1545
+ START_PROFIL
1546
+
1547
+ Sprite* sprite;
1548
+
1549
+ #ifdef SPR_DEBUG
1550
+ KLog_U1("----------------- SPR_update: sprite number = ", SPR_getNumActiveSprite());
1551
+ #endif // SPR_DEBUG
1552
+
1553
+ #ifdef SPR_DEBUG
1554
+ KLog_U1_(" Send sprites to DMA queue: ", highestVDPSpriteIndex + 1, " sprite(s) sent");
1555
+ #endif // SPR_DEBUG
1556
+
1557
+ const u16 sprNum = highestVDPSpriteIndex + 1;
1558
+ // send sprites to VRAM using DMA queue (better to do it before sprite tiles upload to avoid being ignored by DMA queue)
1559
+ void* vdpSpriteTableCopy = DMA_allocateAndQueueDma(DMA_VRAM, VDP_SPRITE_TABLE, (sizeof(VDPSprite) * sprNum) / 2, 2);
1560
+
1561
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
1562
+ // DMA temporary buffer is full ? --> can't do sprite update
1563
+ if (!vdpSpriteTableCopy)
1564
+ {
1565
+ KLog("SPR_update(): failed... DMA data buffer is full.");
1566
+ return;
1567
+ }
1568
+ #endif // LIB_DEBUG
1569
+
1570
+ // iterate over all sprites
1571
+ sprite = firstSprite;
1572
+ while(sprite)
1573
+ {
1574
+ s16 timer = sprite->timer;
1575
+
1576
+ #ifdef SPR_DEBUG
1577
+ char str1[32];
1578
+ char str2[8];
1579
+
1580
+ intToHex(sprite->visibility, str2, 4);
1581
+ strcpy(str1, " visibility = ");
1582
+ strcat(str1, str2);
1583
+
1584
+ KLog_U2_(" processing sprite pos #", getSpriteIndex(sprite), " - timer = ", timer, str1);
1585
+ #endif // SPR_DEBUG
1586
+
1587
+ // handle frame animation
1588
+ if (timer > 0)
1589
+ {
1590
+ // timer elapsed --> next frame
1591
+ if (--timer == 0) SPR_nextFrame(sprite);
1592
+ // just update remaining timer
1593
+ else sprite->timer = timer;
1594
+ }
1595
+
1596
+ u16 status = sprite->status;
1597
+
1598
+ // trivial optimization
1599
+ if (status & NEED_UPDATE)
1600
+ {
1601
+ // ! order is important !
1602
+ if (status & NEED_FRAME_UPDATE)
1603
+ status = updateFrame(sprite, status);
1604
+ if (status & NEED_VISIBILITY_UPDATE)
1605
+ status = updateVisibility(sprite, status);
1606
+
1607
+ // sprite not visible ?
1608
+ if (!sprite->visibility)
1609
+ {
1610
+ // need to update its visibility (done via pos Y) ?
1611
+ if (status & NEED_ST_POS_UPDATE)
1612
+ {
1613
+ // hide sprite
1614
+ updateSpriteTableHide(sprite);
1615
+ status &= ~NEED_ST_POS_UPDATE;
1616
+ }
1617
+ }
1618
+ // only if sprite is visible
1619
+ else
1620
+ {
1621
+ if (status & NEED_TILES_UPLOAD)
1622
+ loadTiles(sprite);
1623
+
1624
+ if (status & NEED_ST_ALL_UPDATE)
1625
+ updateSpriteTableAll(sprite);
1626
+ else if (status & NEED_ST_POS_UPDATE)
1627
+ updateSpriteTablePos(sprite);
1628
+
1629
+ // tiles upload and sprite table done
1630
+ status &= ~(NEED_TILES_UPLOAD | NEED_ST_UPDATE);
1631
+ }
1632
+
1633
+ // processes done !
1634
+ sprite->status = status;
1635
+ }
1636
+
1637
+ // next sprite
1638
+ sprite = sprite->next;
1639
+ }
1640
+
1641
+ // TODO: maybe prevent using SPR_xxx methods between SPR_update() and SYS_doVBlankProcess() call
1642
+ // so we don't need to do a copy of vdpSpriteCache here
1643
+
1644
+ // VDP sprite cache is now updated, copy it to the temporary cache copy we got from DMA queue buffer
1645
+ memcpy(vdpSpriteTableCopy, vdpSpriteCache, sizeof(VDPSprite) * sprNum);
1646
+
1647
+ END_PROFIL(PROFIL_UPDATE)
1648
+ }
1649
+
1650
+
1651
+ void SPR_logProfil()
1652
+ {
1653
+ #ifdef SPR_PROFIL
1654
+ KLog("SPR Engine profiling ------------------------------------------------------");
1655
+ KLog_U2x(4, "Alloc=", profil_time[PROFIL_ALLOCATE_SPRITE], " Release=", profil_time[PROFIL_RELEASE_SPRITE]);
1656
+ KLog_U2x(4, "Add=", profil_time[PROFIL_ADD_SPRITE], " Remove=", profil_time[PROFIL_REMOVE_SPRITE]);
1657
+ KLog_U2x(4, "Set Def.=", profil_time[PROFIL_SET_DEF], " Set Attr.=", profil_time[PROFIL_SET_ATTRIBUTE]);
1658
+ KLog_U2x(4, "Set Anim & Frame=", profil_time[PROFIL_SET_ANIM_FRAME], " Set VRAM & Sprite Ind=", profil_time[PROFIL_SET_VRAM_OR_SPRIND]);
1659
+ KLog_U2x(4, "Set Visibility=", profil_time[PROFIL_SET_VISIBILITY], " Clear=", profil_time[PROFIL_CLEAR]);
1660
+ KLog_U1x(4, "Sort Sprite list=", profil_time[PROFIL_SORT]);
1661
+ KLog_U1x_(4, " Update all=", profil_time[PROFIL_UPDATE], " -------------");
1662
+ KLog_U2x(4, "Update visibility=", profil_time[PROFIL_UPDATE_VISIBILITY], " Update frame=", profil_time[PROFIL_UPDATE_FRAME]);
1663
+ KLog_U2x(4, "Update vdp_spr_ind=", profil_time[PROFIL_UPDATE_VDPSPRIND], " Update vis spr table=", profil_time[PROFIL_UPDATE_VISTABLE]);
1664
+ KLog_U2x(4, "Update Sprite Table=", profil_time[PROFIL_UPDATE_SPRITE_TABLE], " Load Tiles=", profil_time[PROFIL_LOADTILES]);
1665
+
1666
+ // reset profil counters
1667
+ memset(profil_time, 0, sizeof(profil_time));
1668
+ #endif // SPR_PROFIL
1669
+ }
1670
+
1671
+ void SPR_logSprites()
1672
+ {
1673
+ Sprite* sprite = firstSprite;
1674
+
1675
+ KLog_U1_("Num sprite = ", SPR_getNumActiveSprite(), " -----------------------------");
1676
+ while(sprite)
1677
+ {
1678
+ logSprite(sprite);
1679
+ sprite = sprite->next;
1680
+ }
1681
+ }
1682
+
1683
+
1684
+ static void setVDPSpriteIndex(Sprite* sprite, u16 ind, u16 num)
1685
+ {
1686
+ START_PROFIL
1687
+
1688
+ Sprite* spr;
1689
+ VDPSprite* vdpSprite;
1690
+ u16 i;
1691
+
1692
+ #ifdef SPR_DEBUG
1693
+ KLog_U2("setVDPSpriteIndex: sprite #", getSpriteIndex(sprite), " new VDP Sprite index = ", ind);
1694
+ #endif // SPR_DEBUG
1695
+
1696
+ sprite->VDPSpriteIndex = ind;
1697
+
1698
+ // we don't need to hide sprite by default anymore as we take care of it with 'lastNumSprite' field
1699
+ // // hide all sprites by default and get last sprite
1700
+ // vdpSprite = &vdpSpriteCache[ind];
1701
+ // vdpSprite->y = 0;
1702
+ //
1703
+ // i = num - 1;
1704
+ // while(i--)
1705
+ // {
1706
+ // vdpSprite = &vdpSpriteCache[vdpSprite->link];
1707
+ // vdpSprite->y = 0;
1708
+ // }
1709
+
1710
+ // get the last vdpSprite
1711
+ vdpSprite = &vdpSpriteCache[ind];
1712
+ i = num - 1;
1713
+ while(i--) vdpSprite = &vdpSpriteCache[vdpSprite->link];
1714
+
1715
+ // adjust VDP sprites links
1716
+ spr = sprite->prev;
1717
+ // do we have a previous sprite ? --> set its next link to current sprite index
1718
+ if (spr) spr->lastVDPSprite->link = ind;
1719
+ // othrwise we set started link
1720
+ else starter->link = ind;
1721
+
1722
+ spr = sprite->next;
1723
+ // do we have a next sprite ? --> set link on next sprite
1724
+ if (spr) vdpSprite->link = spr->VDPSpriteIndex;
1725
+ // last sprite
1726
+ else vdpSprite->link = 0;
1727
+
1728
+ // set last VDP sprite pointer for this sprite
1729
+ sprite->lastVDPSprite = vdpSprite;
1730
+
1731
+ #ifdef SPR_DEBUG
1732
+ KLog_U1(" last VDP sprite = ", sprite->lastVDPSprite - vdpSpriteCache);
1733
+ #endif // SPR_DEBUG
1734
+
1735
+ END_PROFIL(PROFIL_UPDATE_VDPSPRIND)
1736
+ }
1737
+
1738
+ static u16 updateVisibility(Sprite* sprite, u16 status)
1739
+ {
1740
+ START_PROFIL
1741
+
1742
+ u16 visibility;
1743
+ const SpriteDefinition* sprDef = sprite->definition;
1744
+
1745
+ // fast visibility computation ?
1746
+ if (status & SPR_FLAG_FAST_AUTO_VISIBILITY)
1747
+ {
1748
+ const s16 x = sprite->x - 0x80;
1749
+
1750
+ // compute global visibility for sprite
1751
+ if (((x + sprDef->w) > (s16) 0) && (x < (s16) screenWidth))
1752
+ visibility = VISIBILITY_ON;
1753
+ else
1754
+ visibility = VISIBILITY_OFF;
1755
+
1756
+ #ifdef SPR_DEBUG
1757
+ KLog_S1(" updateVisibility (fast): global x=", x);
1758
+ KLog_S2(" frame w=", sprDef->w, " h=", sprDef->h);
1759
+ #endif // SPR_DEBUG
1760
+ }
1761
+ else
1762
+ {
1763
+ AnimationFrame* frame = sprite->frame;
1764
+
1765
+ // attributes
1766
+ u16 attr = sprite->attribut;
1767
+ // xmin relative to sprite pos
1768
+ const s16 xmin = 0x80 - sprite->x;
1769
+ // xmax relative to sprite pos
1770
+ const s16 xmax = screenWidth + xmin;
1771
+ const s16 fw = sprDef->w;
1772
+
1773
+ #ifdef SPR_DEBUG
1774
+ KLog_S1(" updateVisibility (slow): global x=", sprite->x);
1775
+ KLog_S1(" frame w=", fw);
1776
+ KLog_S2(" xmin=", xmin, " xmax=", xmax);
1777
+ #endif // SPR_DEBUG
1778
+
1779
+ // sprite is fully visible ? --> set all sprite visible
1780
+ if ((xmin <= 0) && (xmax >= fw)) visibility = VISIBILITY_ON;
1781
+ // sprite is fully hidden ? --> set all sprite to hidden
1782
+ else if ((xmax < 0) || ((xmin - fw) > 0)) visibility = VISIBILITY_OFF;
1783
+ else
1784
+ {
1785
+ u16 num = frame->numSprite & 0x7F;
1786
+ // start from the last one
1787
+ FrameVDPSprite* frameSprite = &(frame->frameVDPSprites[num]);
1788
+ visibility = 0;
1789
+
1790
+ if (attr & TILE_ATTR_HFLIP_MASK)
1791
+ {
1792
+ // H flip
1793
+ while(num--)
1794
+ {
1795
+ // next
1796
+ frameSprite--;
1797
+ visibility <<= 1;
1798
+
1799
+ s16 w = ((frameSprite->size & 0x0C) << 1) + 8;
1800
+ s16 x = frameSprite->offsetXFlip;
1801
+
1802
+ // compute visibility
1803
+ if (((x + w) > xmin) && (x < xmax))
1804
+ visibility |= 1;
1805
+ }
1806
+ }
1807
+ else
1808
+ {
1809
+ while(num--)
1810
+ {
1811
+ // next
1812
+ frameSprite--;
1813
+ visibility <<= 1;
1814
+
1815
+ s16 w = ((frameSprite->size & 0x0C) << 1) + 8;
1816
+ s16 x = frameSprite->offsetX;
1817
+
1818
+ // compute visibility
1819
+ if (((x + w) > xmin) && (x < xmax))
1820
+ visibility |= 1;
1821
+ }
1822
+ }
1823
+ }
1824
+ }
1825
+
1826
+ #ifdef SPR_DEBUG
1827
+ KLog_U3(" Sprite at [", sprite->x - 0x80, ",", sprite->y - 0x80, "] visibility = ", visibility);
1828
+ #endif // SPR_DEBUG
1829
+
1830
+ END_PROFIL(PROFIL_UPDATE_VISIBILITY)
1831
+
1832
+ // set the new computed visibility
1833
+ status |= setVisibility(sprite, visibility);
1834
+
1835
+ // visibility update done !
1836
+ return status & ~NEED_VISIBILITY_UPDATE;
1837
+ }
1838
+
1839
+ static u16 setVisibility(Sprite* sprite, u16 newVisibility)
1840
+ {
1841
+ // visibility changed ?
1842
+ if (sprite->visibility != newVisibility)
1843
+ {
1844
+ // set new visibility info
1845
+ sprite->visibility = newVisibility;
1846
+ // need to recompute the position info (hidding a sprite is done by setting posY to 0)
1847
+ return NEED_ST_POS_UPDATE;
1848
+ }
1849
+
1850
+ return 0;
1851
+ }
1852
+
1853
+ static u16 updateFrame(Sprite* sprite, u16 status)
1854
+ {
1855
+ START_PROFIL
1856
+
1857
+ #ifdef SPR_DEBUG
1858
+ KLog_U1(" updateFrame: sprite #", getSpriteIndex(sprite));
1859
+ #endif // SPR_DEBUG
1860
+
1861
+ AnimationFrame* frame = sprite->animation->frames[sprite->frameInd];
1862
+
1863
+ // we need to transfert tiles data for this sprite and frame delay is not disabled ?
1864
+ if ((status & (SPR_FLAG_AUTO_TILE_UPLOAD | SPR_FLAG_DISABLE_DELAYED_FRAME_UPDATE)) == SPR_FLAG_AUTO_TILE_UPLOAD)
1865
+ {
1866
+ // not enough DMA capacity to transfer sprite tile data ?
1867
+ const u16 dmaCapacity = DMA_getMaxTransferSize();
1868
+
1869
+ if (dmaCapacity && ((DMA_getQueueTransferSize() + (frame->tileset->numTile * 32)) > dmaCapacity))
1870
+ {
1871
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_WARNING)
1872
+ KLog_U4_("Warning: sprite #", getSpriteIndex(sprite), " update delayed on frame #", vtimer, " - exceeding DMA capacity: ", DMA_getQueueTransferSize(), " bytes already queued and require ", frame->tileset->numTile * 32, " more bytes");
1873
+ #endif // LIB_DEBUG
1874
+
1875
+ // initial frame update ? --> better to set frame at least
1876
+ if (sprite->frame == NULL)
1877
+ sprite->frame = frame;
1878
+
1879
+ // delay frame update (when we will have enough DMA capacity to do it)
1880
+ return status;
1881
+ }
1882
+ }
1883
+
1884
+ // detect if we need to hide some VDP sprite
1885
+ s16 currentNumSprite = frame->numSprite & 0x7F;
1886
+
1887
+ // adjust number of sprite to hide
1888
+ sprite->spriteToHide += sprite->lastNumSprite - currentNumSprite;
1889
+
1890
+ // if (sprite->status & SPR_FLAG_AUTO_VISIBILITY)
1891
+ // KLog_U3("currNumSprite= ", currentNumSprite, " lastNumSprite= ", sprite->lastNumSprite, " spriteToHide= ", sprite->spriteToHide);
1892
+
1893
+ // store last used number of sprite
1894
+ sprite->lastNumSprite = currentNumSprite;
1895
+ // set frame
1896
+ sprite->frame = frame;
1897
+ // init timer for this frame *before* frame change callback so it can modify change it if needed.
1898
+ if (SPR_getAutoAnimation(sprite))
1899
+ sprite->timer = frame->timer;
1900
+
1901
+ // frame change event handler defined ? --> call it
1902
+ if (sprite->onFrameChange)
1903
+ {
1904
+ // important to preserve status value which may be modified externally here
1905
+ sprite->status = status;
1906
+ sprite->onFrameChange(sprite);
1907
+ status = sprite->status;
1908
+ }
1909
+
1910
+ // require tile data upload
1911
+ if (status & SPR_FLAG_AUTO_TILE_UPLOAD)
1912
+ status |= NEED_TILES_UPLOAD;
1913
+ // require visibility update
1914
+ if (status & SPR_FLAG_AUTO_VISIBILITY)
1915
+ status |= NEED_VISIBILITY_UPDATE;
1916
+
1917
+ // frame update done, also clear ANIMATION_DONE state
1918
+ status &= ~(NEED_FRAME_UPDATE | STATE_ANIMATION_DONE);
1919
+
1920
+ END_PROFIL(PROFIL_UPDATE_FRAME)
1921
+
1922
+ // need to update all sprite table
1923
+ return status | NEED_ST_ALL_UPDATE;
1924
+ }
1925
+
1926
+ static void updateSpriteTableAll(Sprite* sprite)
1927
+ {
1928
+ START_PROFIL
1929
+
1930
+ AnimationFrame* frame;
1931
+ FrameVDPSprite* frameSprite;
1932
+ VDPSprite* vdpSprite;
1933
+ u16 attr;
1934
+ s16 num;
1935
+ u16 visibility;
1936
+
1937
+ visibility = sprite->visibility;
1938
+ attr = sprite->attribut;
1939
+ frame = sprite->frame;
1940
+ num = frame->numSprite & 0x7F;
1941
+ frameSprite = frame->frameVDPSprites;
1942
+ vdpSprite = &vdpSpriteCache[sprite->VDPSpriteIndex];
1943
+
1944
+ if (visibility == VISIBILITY_ON)
1945
+ {
1946
+ while(num--)
1947
+ {
1948
+ if (attr & TILE_ATTR_VFLIP_MASK) vdpSprite->y = sprite->y + frameSprite->offsetYFlip;
1949
+ else vdpSprite->y = sprite->y + frameSprite->offsetY;
1950
+ vdpSprite->size = frameSprite->size;
1951
+ vdpSprite->attribut = attr;
1952
+ if (attr & TILE_ATTR_HFLIP_MASK) vdpSprite->x = sprite->x + frameSprite->offsetXFlip;
1953
+ else vdpSprite->x = sprite->x + frameSprite->offsetX;
1954
+
1955
+ // increment tile index in attribut field
1956
+ attr += frameSprite->numTile;
1957
+ vdpSprite = &vdpSpriteCache[vdpSprite->link];
1958
+ // next
1959
+ frameSprite++;
1960
+ }
1961
+ }
1962
+ else
1963
+ {
1964
+ while(num--)
1965
+ {
1966
+ if (visibility & 1)
1967
+ {
1968
+ if (attr & TILE_ATTR_VFLIP_MASK) vdpSprite->y = sprite->y + frameSprite->offsetYFlip;
1969
+ else vdpSprite->y = sprite->y + frameSprite->offsetY;
1970
+ if (attr & TILE_ATTR_HFLIP_MASK) vdpSprite->x = sprite->x + frameSprite->offsetXFlip;
1971
+ else vdpSprite->x = sprite->x + frameSprite->offsetX;
1972
+ }
1973
+ else vdpSprite->y = 0;
1974
+ vdpSprite->size = frameSprite->size;
1975
+ vdpSprite->attribut = attr;
1976
+
1977
+ // increment tile index in attribut field
1978
+ attr += frameSprite->numTile;
1979
+ // next VDP sprite
1980
+ visibility >>= 1;
1981
+ vdpSprite = &vdpSpriteCache[vdpSprite->link];
1982
+ // next
1983
+ frameSprite++;
1984
+ }
1985
+ }
1986
+
1987
+ // hide sprites that were used by previous frame
1988
+ if ((num = sprite->spriteToHide) > 0)
1989
+ {
1990
+ while(num--)
1991
+ {
1992
+ vdpSprite->y = 0;
1993
+ vdpSprite = &vdpSpriteCache[vdpSprite->link];
1994
+ }
1995
+ }
1996
+ sprite->spriteToHide = 0;
1997
+
1998
+ #ifdef SPR_DEBUG
1999
+ {
2000
+ u16 ind = sprite->VDPSpriteIndex;
2001
+ u16 i = sprite->definition->maxNumSprite;
2002
+ while(i--)
2003
+ {
2004
+ logVDPSprite(ind);
2005
+ // get next sprite
2006
+ ind = vdpSpriteCache[ind].link;
2007
+ }
2008
+ }
2009
+ #endif // SPR_DEBUG
2010
+
2011
+ END_PROFIL(PROFIL_UPDATE_SPRITE_TABLE)
2012
+ }
2013
+
2014
+ static void updateSpriteTablePos(Sprite* sprite)
2015
+ {
2016
+ START_PROFIL
2017
+
2018
+ AnimationFrame* frame;
2019
+ FrameVDPSprite* frameSprite;
2020
+ VDPSprite* vdpSprite;
2021
+ u16 attr;
2022
+ s16 num;
2023
+ u16 visibility;
2024
+
2025
+ visibility = sprite->visibility;
2026
+ attr = sprite->attribut;
2027
+ frame = sprite->frame;
2028
+ num = frame->numSprite & 0x7F;
2029
+ frameSprite = frame->frameVDPSprites;
2030
+ vdpSprite = &vdpSpriteCache[sprite->VDPSpriteIndex];
2031
+
2032
+ if (visibility == VISIBILITY_ON)
2033
+ {
2034
+ while(num--)
2035
+ {
2036
+ if (attr & TILE_ATTR_VFLIP_MASK) vdpSprite->y = sprite->y + frameSprite->offsetYFlip;
2037
+ else vdpSprite->y = sprite->y + frameSprite->offsetY;
2038
+ if (attr & TILE_ATTR_HFLIP_MASK) vdpSprite->x = sprite->x + frameSprite->offsetXFlip;
2039
+ else vdpSprite->x = sprite->x + frameSprite->offsetX;
2040
+
2041
+ // pass to next VDP sprite
2042
+ vdpSprite = &vdpSpriteCache[vdpSprite->link];
2043
+ // next
2044
+ frameSprite++;
2045
+ }
2046
+ }
2047
+ else
2048
+ {
2049
+ while(num--)
2050
+ {
2051
+ if (visibility & 1)
2052
+ {
2053
+ if (attr & TILE_ATTR_VFLIP_MASK) vdpSprite->y = sprite->y + frameSprite->offsetYFlip;
2054
+ else vdpSprite->y = sprite->y + frameSprite->offsetY;
2055
+ if (attr & TILE_ATTR_HFLIP_MASK) vdpSprite->x = sprite->x + frameSprite->offsetXFlip;
2056
+ else vdpSprite->x = sprite->x + frameSprite->offsetX;
2057
+ }
2058
+ else vdpSprite->y = 0;
2059
+
2060
+ // pass to next VDP sprite
2061
+ visibility >>= 1;
2062
+ vdpSprite = &vdpSpriteCache[vdpSprite->link];
2063
+ // next
2064
+ frameSprite++;
2065
+ }
2066
+ }
2067
+
2068
+ // hide sprites that were used by previous frame
2069
+ if ((num = sprite->spriteToHide) > 0)
2070
+ {
2071
+ while(num--)
2072
+ {
2073
+ vdpSprite->y = 0;
2074
+ vdpSprite = &vdpSpriteCache[vdpSprite->link];
2075
+ }
2076
+ }
2077
+ sprite->spriteToHide = 0;
2078
+
2079
+ #ifdef SPR_DEBUG
2080
+ {
2081
+ u16 ind = sprite->VDPSpriteIndex;
2082
+ u16 i = sprite->definition->maxNumSprite;
2083
+ while(i--)
2084
+ {
2085
+ logVDPSprite(ind);
2086
+ // get next sprite
2087
+ ind = vdpSpriteCache[ind].link;
2088
+ }
2089
+ }
2090
+ #endif // SPR_DEBUG
2091
+
2092
+ END_PROFIL(PROFIL_UPDATE_SPRITE_TABLE)
2093
+ }
2094
+
2095
+ static void updateSpriteTableHide(Sprite* sprite)
2096
+ {
2097
+ START_PROFIL
2098
+
2099
+ VDPSprite* vdpSprite = &vdpSpriteCache[sprite->VDPSpriteIndex];
2100
+ // don't forget to hide sprites that were used by previous frame
2101
+ s16 num = sprite->frame->numSprite & 0x7F;
2102
+
2103
+ if (sprite->spriteToHide > 0) num += sprite->spriteToHide;
2104
+
2105
+ // KLog_U3("updateSpriteTableHide(): sprite->spriteToHide= ", sprite->spriteToHide, " num= ", num, " maxNumSprite= ", sprite->definition->maxNumSprite);
2106
+
2107
+ while(num--)
2108
+ {
2109
+ vdpSprite->y = 0;
2110
+ vdpSprite = &vdpSpriteCache[vdpSprite->link];
2111
+ }
2112
+
2113
+ sprite->spriteToHide = 0;
2114
+
2115
+ END_PROFIL(PROFIL_UPDATE_SPRITE_TABLE)
2116
+ }
2117
+
2118
+ static void loadTiles(Sprite* sprite)
2119
+ {
2120
+ START_PROFIL
2121
+
2122
+ TileSet* tileset = sprite->frame->tileset;
2123
+ u16 lenInWord = (tileset->numTile * 32) / 2;
2124
+ // need to test for empty tileset (blank frame)
2125
+ if (lenInWord)
2126
+ {
2127
+ u16 compression = tileset->compression;
2128
+
2129
+ // TODO: separate tileset per VDP sprite and only unpack/upload visible VDP sprite (using visibility) to VRAM
2130
+
2131
+ // need unpacking ?
2132
+ if (compression != COMPRESSION_NONE)
2133
+ {
2134
+ // get buffer and send to DMA queue
2135
+ u8* buf = DMA_allocateAndQueueDma(DMA_VRAM, (sprite->attribut & TILE_INDEX_MASK) * 32, lenInWord, 2);
2136
+
2137
+ // unpack in temp buffer obtained from DMA queue
2138
+ if (buf) unpack(compression, (u8*) FAR_SAFE(tileset->tiles, lenInWord * 2), buf);
2139
+ #if (LIB_LOG_LEVEL >= LOG_LEVEL_ERROR)
2140
+ else KLog(" loadTiles: unpack tileset failed (DMA temporary buffer is full)");
2141
+ #endif
2142
+
2143
+ #ifdef SPR_DEBUG
2144
+ char str1[32];
2145
+ char str2[8];
2146
+
2147
+ intToHex((u32) buf, str2, 4);
2148
+ strcpy(str1, " at ");
2149
+ strcat(str1, str2);
2150
+
2151
+ KLog_U1_(" loadTiles: unpack tileset, numTile= ", tileset->numTile, str1);
2152
+ KLog_U2(" Queue DMA: to=", (sprite->attribut & TILE_INDEX_MASK) * 32, " size in word=", lenInWord);
2153
+ #endif // SPR_DEBUG
2154
+ }
2155
+ else
2156
+ {
2157
+ // just queue DMA operation to transfer tileset data to VRAM
2158
+ DMA_queueDma(DMA_VRAM, FAR_SAFE(tileset->tiles, lenInWord * 2), (sprite->attribut & TILE_INDEX_MASK) * 32, lenInWord, 2);
2159
+
2160
+ #ifdef SPR_DEBUG
2161
+ KLog_U3(" loadTiles - queue DMA: from=", (u32) tileset->tiles, " to=", (sprite->attribut & TILE_INDEX_MASK) * 32, " size in word=", lenInWord);
2162
+ #endif // SPR_DEBUG
2163
+ }
2164
+ }
2165
+
2166
+ END_PROFIL(PROFIL_LOADTILES)
2167
+ }
2168
+
2169
+ static Sprite* sortSprite(Sprite* sprite)
2170
+ {
2171
+ START_PROFIL
2172
+
2173
+ Sprite* const prev = sprite->prev;
2174
+ Sprite* const next = sprite->next;
2175
+ Sprite* s;
2176
+
2177
+ // cache sprite depth coordinate
2178
+ const s16 sdepth = sprite->depth;
2179
+
2180
+ #ifdef SPR_DEBUG
2181
+ KLog_U2("Start depth compare for sprite #", getSpriteIndex(sprite), " VDP Sprite Ind=", sprite->VDPSpriteIndex);
2182
+ #endif // SPR_DEBUG
2183
+
2184
+ // find position forward first
2185
+ s = next;
2186
+ while(s && (s->depth < sdepth)) s = s->next;
2187
+ // position changed ? --> insert sprite after s->prev (as s is pointing on 'next')
2188
+ if (s != next) moveAfter(s ? s->prev : lastSprite, sprite);
2189
+ else
2190
+ {
2191
+ // try to find position backward then
2192
+ s = prev;
2193
+ while(s && (s->depth > sdepth)) s = s->prev;
2194
+ // position changed ? --> insert sprite after s
2195
+ if (s != prev) moveAfter(s, sprite);
2196
+ }
2197
+
2198
+ #ifdef SPR_DEBUG
2199
+ if (s) KLog_U1("Position for sprite = ", getSpriteIndex(s) + 1);
2200
+ else KLog_U1("Position for sprite = ", 0);
2201
+ #endif // SPR_DEBUG
2202
+
2203
+ END_PROFIL(PROFIL_SORT)
2204
+
2205
+ // return prev just for convenience on full sorting
2206
+ return prev;
2207
+ }
2208
+
2209
+ static void moveAfter(Sprite* pos, Sprite* sprite)
2210
+ {
2211
+ Sprite* prev = sprite->prev;
2212
+ Sprite* next = sprite->next;
2213
+
2214
+ #ifdef SPR_DEBUG
2215
+ if (pos) KLog_U2("Insert #", getSpriteIndex(sprite), " after #", getSpriteIndex(pos));
2216
+ else KLog_U1_("Insert #", getSpriteIndex(sprite), " at #0");
2217
+ #endif // SPR_DEBUG
2218
+
2219
+ // we first remove the sprite from its current position
2220
+ if (prev)
2221
+ {
2222
+ prev->next = next;
2223
+ if (next)
2224
+ {
2225
+ next->prev = prev;
2226
+ // fix sprite link from previous sprite
2227
+ prev->lastVDPSprite->link = next->VDPSpriteIndex;
2228
+ }
2229
+ else
2230
+ {
2231
+ lastSprite = prev;
2232
+ // fix sprite link from previous sprite
2233
+ prev->lastVDPSprite->link = 0;
2234
+ }
2235
+ }
2236
+ else
2237
+ {
2238
+ // 'next' become the first sprite
2239
+ firstSprite = next;
2240
+ if (next)
2241
+ {
2242
+ next->prev = prev;
2243
+ // fix sprite link from previous sprite
2244
+ starter->link = next->VDPSpriteIndex;
2245
+ }
2246
+ else
2247
+ {
2248
+ // no more sprite (both firstSprite and lastSprite == NULL)
2249
+ lastSprite = prev;
2250
+ // fix sprite link from previous sprite
2251
+ starter->link = 0;
2252
+ }
2253
+ }
2254
+
2255
+ // then we re-insert after 'pos'
2256
+ if (pos)
2257
+ {
2258
+ next = pos->next;
2259
+ sprite->next = next;
2260
+ sprite->prev = pos;
2261
+ if (next) next->prev = sprite;
2262
+ else lastSprite = sprite;
2263
+ pos->next = sprite;
2264
+ // fix sprite link
2265
+ sprite->lastVDPSprite->link = pos->lastVDPSprite->link;
2266
+ pos->lastVDPSprite->link = sprite->VDPSpriteIndex;
2267
+ }
2268
+ // or we insert before 'firstSprite' (become the new first sprite)
2269
+ else
2270
+ {
2271
+ sprite->next = firstSprite;
2272
+ sprite->prev = NULL;
2273
+ // sprite become the preceding sprite of previous first sprite
2274
+ if (firstSprite) firstSprite->prev = sprite;
2275
+ // no previous first sprite ? --> sprite becomes last sprite then
2276
+ else lastSprite = sprite;
2277
+ // sprite become first sprite
2278
+ firstSprite = sprite;
2279
+ // fix sprite link
2280
+ sprite->lastVDPSprite->link = starter->link;
2281
+ starter->link = sprite->VDPSpriteIndex;
2282
+ }
2283
+ }
2284
+
2285
+ static u16 getSpriteIndex(Sprite* sprite)
2286
+ {
2287
+ u16 res = 0;
2288
+ Sprite* s = firstSprite;
2289
+
2290
+ while(s != sprite)
2291
+ {
2292
+ s = s->next;
2293
+ res++;
2294
+ }
2295
+
2296
+ return res;
2297
+ }
2298
+
2299
+ static void logSprite(Sprite* sprite)
2300
+ {
2301
+ KLog_U2("Sprite #", getSpriteIndex(sprite), " ------------- status=", sprite->status);
2302
+ KLog_U2("animInd=", sprite->animInd, " frameInd=", sprite->frameInd);
2303
+ KLog_S4("attribut=", sprite->attribut, " x=", sprite->x, " y=", sprite->y, " depth=", sprite->depth);
2304
+ KLog_U2("visibility=", sprite->visibility, " timer=", sprite->timer);
2305
+ KLog_U2("VDPSpriteInd=", sprite->VDPSpriteIndex, " link=", sprite->lastVDPSprite->link);
2306
+ KLog_U2("prev=", (sprite->prev == NULL) ? 128 : getSpriteIndex(sprite->prev), " next=", (sprite->next == NULL) ? 128 : getSpriteIndex(sprite->next));
2307
+ }
2308
+
2309
+ #endif