Clarify SGB multiplayer, handle count = 0

This commit is contained in:
Lior Halphon 2021-04-13 21:33:13 +03:00
parent 24915e41eb
commit 0af4f1fa4d
2 changed files with 20 additions and 20 deletions

10
BESS.md
View File

@ -139,7 +139,7 @@ The RTC block uses the `'RTC '` identifier, and is an optional block that is use
The length of this block is 0x30 bytes long and it follows the following structure: The length of this block is 0x30 bytes long and it follows the following structure:
|Offset | Content | | Offset | Content |
|--------|------------------------------------------------------------------------| |--------|------------------------------------------------------------------------|
| 0x00 | Current seconds (1 byte), followed by 3 bytes of padding | | 0x00 | Current seconds (1 byte), followed by 3 bytes of padding |
| 0x04 | Current minutes (1 byte), followed by 3 bytes of padding | | 0x04 | Current minutes (1 byte), followed by 3 bytes of padding |
@ -158,7 +158,7 @@ The HUC3 block uses the `'HUC3'` identifier, and is an optional block that is us
The length of this block is 0x11 bytes long and it follows the following structure: The length of this block is 0x11 bytes long and it follows the following structure:
|Offset | Content | | Offset | Content |
|--------|-------------------------------------------------------| |--------|-------------------------------------------------------|
| 0x00 | UNIX timestamp at the time of the save state (64-bit) | | 0x00 | UNIX timestamp at the time of the save state (64-bit) |
| 0x08 | RTC minutes (16-bit) | | 0x08 | RTC minutes (16-bit) |
@ -173,8 +173,8 @@ The SGB block uses the `'SGB '` identifier, and is an optional block that is onl
The length of this block is 0x39 bytes and it follows the following structure: The length of this block is 0x39 bytes and it follows the following structure:
|Offset | Content | | Offset | Content |
|--------|--------------------------------------------------------------------------------------------------| |--------|--------------------------------------------------------------------------------------------------------------------------|
| 0x00 | The size of the border tile data (=0x2000, 32-bit integer) | | 0x00 | The size of the border tile data (=0x2000, 32-bit integer) |
| 0x04 | The offset of the border tile data (SNES tile format, 32-bit integer) | | 0x04 | The offset of the border tile data (SNES tile format, 32-bit integer) |
| 0x08 | The size of the border tilemap (=0x800, 32-bit integer) | | 0x08 | The size of the border tilemap (=0x800, 32-bit integer) |
@ -189,7 +189,7 @@ The length of this block is 0x39 bytes and it follows the following structure:
| 0x2C | The offset of the attribute map (32-bit integer) | | 0x2C | The offset of the attribute map (32-bit integer) |
| 0x30 | The size of the attribute files (=0xfd2, 32-bit integer) | | 0x30 | The size of the attribute files (=0xfd2, 32-bit integer) |
| 0x34 | The offset of the attribute files (32-bit integer) | | 0x34 | The offset of the attribute files (32-bit integer) |
| 0x38 | Multiplayer status (1 byte); high nibble is player count, low nibble is current player (0-based) | | 0x38 | Multiplayer status (1 byte); high nibble is player count (1, 2 or 4), low nibble is current player (Where Player 1 is 0) |
If only some of the size-offset pairs are available (for example, partial HLE SGB implementation), missing fields are allowed to have 0 as their size, and implementations are expected to fall back to a sane default. If only some of the size-offset pairs are available (for example, partial HLE SGB implementation), missing fields are allowed to have 0 as their size, and implementations are expected to fall back to a sane default.

View File

@ -1032,7 +1032,7 @@ done:
gb->sgb->player_count = sgb.multiplayer_state >> 4; gb->sgb->player_count = sgb.multiplayer_state >> 4;
gb->sgb->current_player = sgb.multiplayer_state & 0xF; gb->sgb->current_player = sgb.multiplayer_state & 0xF;
if (gb->sgb->player_count > 4 || gb->sgb->player_count == 3) { if (gb->sgb->player_count > 4 || gb->sgb->player_count == 3 || gb->sgb->player_count == 0) {
gb->sgb->player_count = 1; gb->sgb->player_count = 1;
gb->sgb->current_player = 0; gb->sgb->current_player = 0;
} }