This is quite an important feature but I haven't researched it yet.
This is finished and I've tested programs with and without sound without issue.
I'll leave this open for a while in case there are any issues.
There was an issue on my GP2X with a FAT32 SD card. Because now single letter parent folders are created to contain program folders, creating local/B/BoulderL.p created local/b/BoulderL.p but sz81 was expecting to read and write to local/B/BoulderL.p and it failed. I fixed it (I hope) by forcing the parent folder (for all platforms) to lower-case, so it'll be local/b/BoulderL.p and local/m/MazezaM.p etc.
I've added control bar icons for save and load state.
The state files I've forced to little-endian by manually saving each byte (some emulator variables are words and dwords) and then reconstructing them on load. This means that the state files can be shared across platforms (I don't have a big-endian machine to test but I'm not expecting it to fail).
This works now without issue so I'll close it.