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