Fix issue #1009: sameboy: stack pointer saved in init state
This commit is contained in:
parent
1532950961
commit
148cadda72
|
@ -64,7 +64,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy
|
||||||
{
|
{
|
||||||
Filename = "sameboy.wbx",
|
Filename = "sameboy.wbx",
|
||||||
SbrkHeapSizeKB = 192,
|
SbrkHeapSizeKB = 192,
|
||||||
InvisibleHeapSizeKB = 4,
|
InvisibleHeapSizeKB = 12,
|
||||||
SealedHeapSizeKB = 9 * 1024,
|
SealedHeapSizeKB = 9 * 1024,
|
||||||
PlainHeapSizeKB = 4,
|
PlainHeapSizeKB = 4,
|
||||||
MmapHeapSizeKB = 1024
|
MmapHeapSizeKB = 1024
|
||||||
|
|
Binary file not shown.
|
@ -3,6 +3,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "snes_spc/spc.h"
|
#include "snes_spc/spc.h"
|
||||||
|
#include "../emulibc/emulibc.h"
|
||||||
|
|
||||||
#define utils_log printf
|
#define utils_log printf
|
||||||
|
|
||||||
|
@ -76,13 +77,13 @@ typedef struct
|
||||||
uint16_t tilemap[32 * 32];
|
uint16_t tilemap[32 * 32];
|
||||||
|
|
||||||
// frame data
|
// frame data
|
||||||
uint8_t frame[160 * 144]; // the most recent obtained full frame
|
uint8_t frame[160 * 144]; // the most recent obtained full frame
|
||||||
uint32_t frozenframe[256 * 224]; // the most recent saved full frame (MASK_EN)
|
uint32_t frozenframe[256 * 224]; // the most recent saved full frame (MASK_EN)
|
||||||
uint8_t attr[20 * 18]; // current attr map for the GB screen
|
uint8_t attr[20 * 18]; // current attr map for the GB screen
|
||||||
uint8_t auxattr[45][20 * 18]; // 45 attr files
|
uint8_t auxattr[45][20 * 18]; // 45 attr files
|
||||||
|
|
||||||
// MASK_EN
|
// MASK_EN
|
||||||
uint8_t active_mask; // true if mask is currently being used
|
uint8_t active_mask; // true if mask is currently being used
|
||||||
|
|
||||||
// audio
|
// audio
|
||||||
SNES_SPC *spc;
|
SNES_SPC *spc;
|
||||||
|
@ -622,12 +623,15 @@ int sgb_init(const uint8_t *spc, int length)
|
||||||
utils_log("SGB: Failed to load SPC\n");
|
utils_log("SGB: Failed to load SPC\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make a scratch buffer in a predictable (not stack) place because spc stores multiple pointers to it
|
||||||
|
// which is kind of nasty...
|
||||||
|
int16_t *sound_buffer = alloc_invisible(4096 * sizeof(int16_t));
|
||||||
|
|
||||||
// the combination of the sameboy bootrom plus the built in SPC file we use means
|
// the combination of the sameboy bootrom plus the built in SPC file we use means
|
||||||
// that the SPC doesn't finish its init fast enough for donkey kong, which starts poking
|
// that the SPC doesn't finish its init fast enough for donkey kong, which starts poking
|
||||||
// data too early. it's just a combination of various HLE concerns not meshing...
|
// data too early. it's just a combination of various HLE concerns not meshing...
|
||||||
int16_t sound_buffer[4096];
|
spc_set_output(sgb.spc, sound_buffer, 4096);
|
||||||
spc_set_output(sgb.spc, sound_buffer, sizeof(sound_buffer) / sizeof(sound_buffer[0]));
|
|
||||||
for (int i = 0; i < 240; i++)
|
for (int i = 0; i < 240; i++)
|
||||||
{
|
{
|
||||||
spc_end_frame(sgb.spc, 35104);
|
spc_end_frame(sgb.spc, 35104);
|
||||||
|
@ -741,10 +745,10 @@ void sgb_set_controller_data(const uint8_t *buttons)
|
||||||
memcpy(sgb.joypad_data, buttons, sizeof(sgb.joypad_data));
|
memcpy(sgb.joypad_data, buttons, sizeof(sgb.joypad_data));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void trn_sound(const uint8_t* data)
|
static void trn_sound(const uint8_t *data)
|
||||||
{
|
{
|
||||||
const uint8_t* const dataend = data + 0x10000;
|
const uint8_t *const dataend = data + 0x10000;
|
||||||
uint8_t* const dst = spc_get_ram(sgb.spc);
|
uint8_t *const dst = spc_get_ram(sgb.spc);
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
@ -771,7 +775,7 @@ static void trn_sound(const uint8_t* data)
|
||||||
utils_log("TRN_SOUND dst overflow\n");
|
utils_log("TRN_SOUND dst overflow\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
utils_log("TRN_SOUND addr %04x len %04x\n", addr, len);
|
utils_log("TRN_SOUND addr %04x len %04x\n", addr, len);
|
||||||
memcpy(dst + addr, data, len);
|
memcpy(dst + addr, data, len);
|
||||||
data += len;
|
data += len;
|
||||||
}
|
}
|
||||||
|
@ -1014,14 +1018,14 @@ void sgb_render_audio(uint64_t time, void (*callback)(int16_t l, int16_t r, uint
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
utils_log("SPC: %02x %02x %02x %02x => %02x %02x %02x %02x\n",
|
utils_log("SPC: %02x %02x %02x %02x => %02x %02x %02x %02x\n",
|
||||||
spc_read_port(sgb.spc, 0, 0),
|
spc_read_port(sgb.spc, 0, 0),
|
||||||
spc_read_port(sgb.spc, 0, 1),
|
spc_read_port(sgb.spc, 0, 1),
|
||||||
spc_read_port(sgb.spc, 0, 2),
|
spc_read_port(sgb.spc, 0, 2),
|
||||||
spc_read_port(sgb.spc, 0, 3),
|
spc_read_port(sgb.spc, 0, 3),
|
||||||
sgb.sound_control[0],
|
sgb.sound_control[0],
|
||||||
sgb.sound_control[1],
|
sgb.sound_control[1],
|
||||||
sgb.sound_control[2],
|
sgb.sound_control[2],
|
||||||
sgb.sound_control[3]);
|
sgb.sound_control[3]);
|
||||||
}
|
}
|
||||||
for (int p = 0; p < 4; p++)
|
for (int p = 0; p < 4; p++)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue