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