fix: read the SSF BIOS rules from SSF.exe

Readme claims give way to the boot routine of SSF.exe R38: the Saturn
BIOS must read 0x80000 bytes, a failed read or NoBIOS falls back to the
embedded boot ROM, so the BIOS is optional with an HLE fallback, and
ST-V reads its EPROM whatever NoBIOS says.
This commit is contained in:
Abdessamad Derraz committed 2026-11-11 10:27:58 +01:00
1 parent 95bb3ab127
commit 302994d209
1 file changed
+30 -21
+30 -21
View File
@@ -29,35 +29,43 @@ notes: |
emulator is the 64-bit SSF.exe and which is cited by virtual address, and the
Android build SSF_AndroidVer.zip of 2022-08-07, package
com.xrea.g2.aaaaaaaa.ssf, whose lib/arm64-v8a/libnative-lib.so keeps its 40738
dynamic symbols and which is cited by symbol. Prose references name the
Japanese documentation shipped in Document/.
dynamic symbols and which is cited by symbol.
Every path below is stored in full in SSF.ini and picked through a file dialog
filtered on "all files (*.*)". SSF fixes no filename and no directory for any
of them and looks for none, so the names used here are the dumps that fill
each slot rather than names the code searches.
Saturn BIOS, [Peripheral] SaturnBIOS. Readme.txt describes the image as the
console address range 00000000-0007FFFF and states that the filename is free.
Neither a length nor a hash is compared against the file. The one routine that
walks the 512 KiB BIOS area is CStateSaveBase::_GetBIOSHash, which folds it
into the checksum pair that tags a save state.
Saturn BIOS, [Peripheral] SaturnBIOS. The boot routine at 0xae0950 opens the
configured path with fopen "rb" and succeeds only when fread returns 0x80000
bytes (0xa61f70), so a shorter file fails and a longer one is cut at 512 KiB.
No hash is compared against the file. The one routine that walks the 512 KiB
BIOS area is CStateSaveBase::_GetBIOSHash, which folds it into the checksum
pair that tags a save state.
Running without it is a supported mode, [Program4] NoBIOS. SSF carries a boot
ROM of its own, an embedded program with the SYS_* system calls and the
interrupt vectors, and in that mode the backup library is always hooked.
Readme.txt records lower compatibility and advises supplying a BIOS.
Running without it is a supported mode, [Program4] NoBIOS, inverted by holding
Ctrl at launch (GetAsyncKeyState(VK_CONTROL) at 0xae0cf3, applied at
0xae0d9b-0xae0da7). A failed read leads to the same state: the BIOS present
flag is cleared (0xae0e95, published at 0xaccc46-0xaccc50) and the setup at
0xa7cfa3-0xa7cfbc passes its negation to the embedded boot ROM, a program with
the SYS_* system calls and the interrupt vectors decompressed into the BIOS
area (0xa756c0), and to the ST-V system call layer (0xa77630).
ST-V is entered by holding left Shift at launch. [Peripheral] STVBIOS names
the motherboard EPROM, and both the option reference and the No BIOS entry of
Readme.txt state that ST-V does not run without it.
ST-V is entered by holding left Shift at launch or by a command-line ROM whose
extension is zip (GetAsyncKeyState(VK_LSHIFT) at 0xae0c08, extension compare
at 0xae0c9d-0xae0ce0). [Peripheral] STVBIOS names the motherboard EPROM. In
that mode the EPROM is read whatever NoBIOS says (0xae0db4-0xae0e63), and an
image carrying SEGA ST-V(TITAN) at 0x500 is byte-swapped in 16-bit units
(0xae0ea6-0xae0ef6). When it is missing the boot carries on with the BIOS
present flag cleared, which arms STVSystemCall::Initialize (0xa77630, the 1
MiB clear and table reset of the Android symbol) and writes its stub into the
BIOS area.
ST-V cartridges are the game and are read from a ZIP: the loader takes the
extension of each member as its IC number, accepts 1 through 13, byte-swaps
every mask ROM in 16-bit units, doubles each byte of the IC13 EPROM across the
16-bit bus, then mirrors each chip over its window. IC7 and IC13 are
exclusive. STV_ROM.html gives the same layout and notes that MAME ROM sets fit
once the extensions are changed.
exclusive.
Cheat scripts live in Cheat/ under the disc product number. Six ship with the
emulator and the memory cheat dialog writes more.
@@ -82,7 +90,7 @@ files:
size: 524288
description: "Saturn BIOS"
note: "Any dump of the 512 KiB console ROM, the compatible machines included. Area code is chosen by [Peripheral] Areacode and AutoAreacode, not by the image, so no region selects this file. Each alias labels one of those dumps: mpr-17933.bin, sega_100.bin, sega_100a.bin, sega1003.bin, hisaturn.bin and vsaturn.bin."
source_ref: "SSF.exe 0x43d770 (SaturnBIOS 0x129b1f8), SSF.exe 0x129a2f8 with the filter at 0x129a310, SSF.exe 0x43ff96 (NoBIOS 0x129b4cc), libnative-lib.so SSF::CStateSaveBase::_GetBIOSHash 0x134b8ec-0x134b924, SSF-archive Document/Readme.txt BIOSファイルについて"
source_ref: "SSF.exe 0x43d770 (SaturnBIOS 0x129b1f8), SSF.exe 0x129a2f8 with the filter at 0x129a310, SSF.exe 0x43ff96 (NoBIOS 0x129b4cc), SSF.exe 0xae0950 0xae0e4b-0xae0e95 (path chosen, read of 0x80000 bytes through 0xa61f70), SSF.exe 0xa61f70 0xa61fad-0xa6200e (fopen rb, fread count compared to the size), libnative-lib.so SSF::CStateSaveBase::_GetBIOSHash 0x134b8ec-0x134b924"
- name: "epr-20091.ic8"
aliases:
@@ -98,19 +106,20 @@ files:
- epr-17741a.ic8
- epr-17742a.ic8
system: sega-stv
required: true
required: false
hle_fallback: true
size: 524288
description: "ST-V BIOS"
note: "Loose 512 KiB EPROM image, read outside the cartridge ZIP. Any of the board revisions is accepted, the code branching on none of them."
source_ref: "SSF.exe 0x43d91f (STVBIOS 0x129b218), SSF.exe 0x129a328, SSF-archive Document/Readme.txt ST-V BIOS option, SSF-archive Document/Readme.txt No BIOS option"
source_ref: "SSF.exe 0x43d91f (STVBIOS 0x129b218), SSF.exe 0x129a328, SSF.exe 0xae0950 0xae0db4-0xae0e93 (ST-V mode reads this path through 0xa61f70 whatever NoBIOS says), 0xae0ea6-0xae0ef6 (SEGA ST-V(TITAN) compare, 16-bit swap), 0xa7cfa3-0xa7cfbc (BIOS absent passed to STVSystemCall::Initialize 0xa77630)"
- name: "<cartridge>.bin"
system: sega-saturn
required: false
category: game_data
description: "cartridge image mapped at A-Bus CS0"
note: "[Peripheral] DataCartridge, gated by DataCartridgeEnable and off by default. SSF reads the file at the configured path into the 32 MiB A-Bus CS0 window and identifies it in no way. The dumps that belong there are the two Saturn ROM carts, mpr-18811-mx.ic1 for The King of Fighters '95 and mpr-19367-mx.ic1 for Ultraman. Readme.txt records the option as unverified."
source_ref: "SSF.exe 0x43e26b (DataCartridge 0x1298838), SSF.exe 0x43e178 (DataCartridgeEnable 0x1298820), SSF.exe 0x129a340, SSF.exe 0x916e5e-0x916e84, SSF-archive Document/Readme.txt Data Cartridge option"
note: "[Peripheral] DataCartridge, gated by DataCartridgeEnable and off by default. SSF reads the file at the configured path into the 32 MiB A-Bus CS0 window and identifies it in no way. The dumps that belong there are the two Saturn ROM carts, mpr-18811-mx.ic1 for The King of Fighters '95 and mpr-19367-mx.ic1 for Ultraman."
source_ref: "SSF.exe 0x43e26b (DataCartridge 0x1298838), SSF.exe 0x43e178 (DataCartridgeEnable 0x1298820), SSF.exe 0x129a340, SSF.exe 0x916e5e-0x916e84"
- name: "<name>.cht"
path: "Cheat/<product id>/<name>.cht"