romdevtools 0.30.0 → 0.40.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 (77) hide show
  1. package/AGENTS.md +12 -3
  2. package/CHANGELOG.md +89 -13
  3. package/README.md +11 -2
  4. package/examples/gb/templates/tile_engine.c +1 -1
  5. package/examples/gbc/templates/tile_engine.c +1 -1
  6. package/examples/genesis/templates/two_plane_parallax.c +4 -4
  7. package/examples/nes/templates/tile_engine.c +1 -1
  8. package/package.json +3 -1
  9. package/src/analysis/analyze.js +276 -0
  10. package/src/analysis/decompile.js +108 -0
  11. package/src/analysis/decompiler/sleigh/6502.cspec +34 -0
  12. package/src/analysis/decompiler/sleigh/6502.ldefs +33 -0
  13. package/src/analysis/decompiler/sleigh/6502.pspec +16 -0
  14. package/src/analysis/decompiler/sleigh/6502.sla +3414 -0
  15. package/src/analysis/decompiler/sleigh/65816-snes.pspec +249 -0
  16. package/src/analysis/decompiler/sleigh/65816.cspec +17 -0
  17. package/src/analysis/decompiler/sleigh/65816.ldefs +15 -0
  18. package/src/analysis/decompiler/sleigh/65816.sla +23670 -0
  19. package/src/analysis/decompiler/sleigh/65c02.sla +4683 -0
  20. package/src/analysis/decompiler/sleigh/68000.cspec +67 -0
  21. package/src/analysis/decompiler/sleigh/68000.ldefs +68 -0
  22. package/src/analysis/decompiler/sleigh/68000.pspec +9 -0
  23. package/src/analysis/decompiler/sleigh/68000_register.cspec +118 -0
  24. package/src/analysis/decompiler/sleigh/68040.sla +81693 -0
  25. package/src/analysis/decompiler/sleigh/ARM.ldefs +377 -0
  26. package/src/analysis/decompiler/sleigh/ARM4t_le.sla +53758 -0
  27. package/src/analysis/decompiler/sleigh/ARM_v45.cspec +209 -0
  28. package/src/analysis/decompiler/sleigh/ARM_v45.pspec +40 -0
  29. package/src/analysis/decompiler/sleigh/ARMt_v45.pspec +43 -0
  30. package/src/analysis/decompiler/sleigh/HuC6280.cspec +67 -0
  31. package/src/analysis/decompiler/sleigh/HuC6280.ldefs +18 -0
  32. package/src/analysis/decompiler/sleigh/HuC6280.pspec +150 -0
  33. package/src/analysis/decompiler/sleigh/HuC6280.sla +7524 -0
  34. package/src/analysis/decompiler/sleigh/sm83.cspec +70 -0
  35. package/src/analysis/decompiler/sleigh/sm83.ldefs +29 -0
  36. package/src/analysis/decompiler/sleigh/sm83.pspec +19 -0
  37. package/src/analysis/decompiler/sleigh/sm83.sla +7695 -0
  38. package/src/analysis/decompiler/sleigh/z80.cspec +122 -0
  39. package/src/analysis/decompiler/sleigh/z80.ldefs +57 -0
  40. package/src/analysis/decompiler/sleigh/z80.pspec +43 -0
  41. package/src/analysis/decompiler/sleigh/z80.sla +20518 -0
  42. package/src/analysis/decompiler/wasm/decompile.js +2 -0
  43. package/src/analysis/decompiler/wasm/decompile.wasm +0 -0
  44. package/src/analysis/rizin.js +129 -0
  45. package/src/analysis/wasm/rizin.js +6032 -0
  46. package/src/analysis/wasm/rizin.wasm +0 -0
  47. package/src/http/routes.js +1 -1
  48. package/src/http/skill-doc.js +3 -1
  49. package/src/mcp/tools/cart-parts.js +5 -2
  50. package/src/mcp/tools/disasm.js +32 -5
  51. package/src/mcp/tools/font-map.js +3 -3
  52. package/src/mcp/tools/index.js +2 -2
  53. package/src/mcp/tools/project.js +1 -1
  54. package/src/mcp/tools/reinject.js +1 -1
  55. package/src/mcp/tools/symbols.js +10 -4
  56. package/src/mcp/tools/trace-vram-source.js +1 -1
  57. package/src/mcp/tools/watch-memory.js +1 -1
  58. package/src/platforms/_guides/ROMHACKING_PLAYBOOK.md +48 -3
  59. package/src/platforms/atari2600/MENTAL_MODEL.md +6 -0
  60. package/src/platforms/atari7800/MENTAL_MODEL.md +6 -0
  61. package/src/platforms/c64/MENTAL_MODEL.md +6 -0
  62. package/src/platforms/gb/MENTAL_MODEL.md +6 -0
  63. package/src/platforms/gb/lib/c/README.md +1 -1
  64. package/src/platforms/gba/MENTAL_MODEL.md +7 -1
  65. package/src/platforms/gbc/MENTAL_MODEL.md +6 -0
  66. package/src/platforms/gbc/lib/c/README.md +1 -1
  67. package/src/platforms/genesis/MENTAL_MODEL.md +8 -2
  68. package/src/platforms/genesis/TROUBLESHOOTING.md +2 -2
  69. package/src/platforms/genesis/lib/wram.s +1 -1
  70. package/src/platforms/gg/MENTAL_MODEL.md +6 -0
  71. package/src/platforms/lynx/MENTAL_MODEL.md +6 -0
  72. package/src/platforms/msx/MENTAL_MODEL.md +6 -0
  73. package/src/platforms/nes/MENTAL_MODEL.md +6 -0
  74. package/src/platforms/pce/MENTAL_MODEL.md +6 -0
  75. package/src/platforms/sms/MENTAL_MODEL.md +6 -0
  76. package/src/platforms/snes/MENTAL_MODEL.md +10 -4
  77. package/src/toolchains/_worker/wasm-worker.js +5 -0
@@ -47,13 +47,13 @@ The SNES has 8 BG modes selected via PPU register $2105 (BGMODE):
47
47
 
48
48
  ```
49
49
  0 4 BGs × 4 colors — text-mode look
50
- 1 3 BGs (16+16+4 col) — default for most games (Super Mario World)
51
- 2 2 BGs × 16 col + tilemap offset-per-tile (Yoshi's Island)
52
- 3 1 BG × 256 col + 1 BG × 16 col (Donkey Kong Country)
50
+ 1 3 BGs (16+16+4 col) — default for most games (typical 2D platformer)
51
+ 2 2 BGs × 16 col + tilemap offset-per-tile (a pre-rendered-sprite platformer)
52
+ 3 1 BG × 256 col + 1 BG × 16 col (pre-rendered-sprite platformer)
53
53
  4 1 BG × 256 col + 1 BG × 4 col with offset-per-tile
54
54
  5 2 BGs hi-res (512 px wide, half-height)
55
55
  6 hi-res mosaic
56
- 7 1 BG with affine transform (Mario Kart, F-Zero)
56
+ 7 1 BG with affine transform (mode-7 racers)
57
57
  ```
58
58
 
59
59
  PVSnesLib's default is `BG_MODE1` (`setMode(BG_MODE1, 0)`) — three
@@ -313,3 +313,9 @@ and parallax is nearly free.
313
313
  scanlines.
314
314
 
315
315
  Track `camX` in pixels; actor screen-X = `worldX - camX`.
316
+
317
+ ## Reverse-engineering & decompilation
318
+
319
+ The Rizin/Ghidra analysis engine works here like everywhere: `disasm({target:'functions'})` to carve the program, `disasm({target:'cfg'|'xrefs'})` to trace it, `symbols({op:'analyze'})` for a one-shot structural map.
320
+
321
+ **Decompiler quality on 65816: MEDIUM.** The M/X register-width flags make instruction meaning context-dependent, but the Ghidra 65816 SLEIGH tracks them, so pseudocode is usable. `disasm({target:'decompile', address})` returns C-like pseudocode (the `qualityNote` field restates this). Read it to UNDERSTAND a routine; use `disasm({target:'project'})` to actually edit + rebuild. See the cross-platform ROM-hacking playbook §5f for the full loop.
@@ -109,6 +109,11 @@ async function runJob(job) {
109
109
  return buf[idx++];
110
110
  };
111
111
  }
112
+ // Optional environment variables for the WASM (e.g. SLEIGHHOME for the Ghidra
113
+ // decompiler). Seed Module.ENV in preRun, before libc reads getenv().
114
+ if (job.env && typeof job.env === "object") {
115
+ moduleArgs.preRun = [(m) => { Object.assign((m.ENV || (m.ENV = {})), job.env); }];
116
+ }
112
117
 
113
118
  const mod = await factory(moduleArgs);
114
119