FXSound disassemblován
Je to takový vánoční projekt - původně jsem si chtěl zkusit napsat nějakou hudbu ve Fukově fxmasm v domění, že ji prostě přeložím a nějak dostanu a pustím na ZX Spectrum. Nicméně to samozřejmě tak jednoduché není. Fukův fxmasm neobsahuje vůbec žádný asm (assembler), ale jen kompiluje data ze symbolického zápisu do bajtkódu, který se dá na PC přehrávat v AY_emulu. To ale není úplně to co jsem chtěl...
Disassemblování
Našel jsem poměrně hezkou stránku o "reversinženýringu" ZX her, kde mne navedly na nástroj skoolkit - pomocí něj a profileru ve Fuse emulatoru jsem vytvoril kod pro FXSound1 nějak takto:
./tap2sna.py FXS1.tzx FXS1.z80
./sna2ctl.py -m FXS1.map FXS1.z80 > FXS1.ctl
./sna2skool.py -c FXS1.ctl FXS1.z80 > FXS1.skool
.map procházi z profileru Fuse - necháte prostě běžet program, pokusíte se projít všechny možné stavy a profiler označí co je kód a co data. Skool z toho vytvori ctl file, který ještě můžete upravit. Následně jsem na skool, ve kterém jsem nechal jen kód pustil ChatGPT jako experta na ZX Spectrum Z80.
AnaLýza přes LLM
ChatGPT celkem pěkně zanalyzoval disassemblovaný kód, ale už i tak to na něj bylo dlouhé, některé části vynechal, no a hlavně tam nadělal pár chyb... a ty najít bylo to nejtěžší. Stejně tak požadavek na konverzi do SJASMplus syntaxe zvládl z větší části, ale bohužel ne úplně konzistentně. Asi by se dalo chyby najit pomocí jiného LLM a třeba porovnáním původního disassemblu s tím novým. Jenže co by to bylo za zábavu že.
Takže jsem to debugoval přes Fuse debugger, který sice graficky není nic moc a bohužel do něj nejde nahrát ani nějaký ".lst" nebo něco jako zdroják, aby se dal krokovat přímo i s adresami a labely, nicméně přes příkazovou řádku má aspoň základní funkce.
Takže to pak slavnostně vypadalo nějak takle (3 Fuse emulátory zároveň):
Výsledný assembler
Výsledek ja na https://github.com/covex/fxsound
No a vánoční volno je v tahu...
PS: Během práce jsem našel velice zajímavý a netradiční emulátor RetroVirtualMachine, který zvládá i emulaci CRT obrazovek!
