Development notes
Practical notes for building on and hacking hootrip.
Gotchas
- The hoot gamelist XML is Shift_JIS with CRLF. All 557 files under
xml/andxml2/are Shift_JIS, not UTF-8 —hoot-xml’sdecode_bytes()handles this; never read them as UTF-8 directly. Note that somegrepbuilds (notablyugrep) silently skip or mismatch Shift_JIS files and exit non-zero even when an ASCII pattern is present. Use GNUgrep,grep -a, or Python for archive text searches. - Point the tool at your own unpacked HootArchive with
--archive <path>; that directory holdshoot.xmlplus thexml/,xml2/, and per-platform data folders.
Verification tools
vgm2wav/vgmplayfrom system libvgm render both.vgm/.vgzand.s98, so they double as an independent check on the writers (cargo run -p hoot-log --example gen_test).hootrip sweep— PC-88 pass/fail survey;hootrip pc98-sweep— the PC-98 equivalent, bucketed by driver kind.hootrip compare <game> --reference ref.s98— LCS-aligns two register streams and reports tempo ratio and timing error; ready for any reference.s98.- Ground truth is hoot’s own source, not a running hoot. hoot is
closed-source and its S98 logger / IPC don’t automate headlessly. The source
release (
dmpsoft.s17.xrea.com/data/hootsrc20011006.cab, extract withcabextract) defines the exact machine model each driver runs on — the useful files aredrivers/mucom88.cpp(PC-88 machine setup) andsound/ssFMTimer.cpp(OPN timer periods). PC-98 rips can also be cross-checked against the NP2-sourced 1000 Hz rips on s98.joshw.info.
Style
- Register-log writers stay pure: bytes in → bytes out, no I/O, so they are unit-testable against the format specs.
- Vendored C/C++ cores (the NP2 i286 CPU under
vendor/np2) are compiled via acc+globbuild.rsand wrapped with hand-written FFI.