sound, fix ym2413 fm sound load/save

This commit is contained in:
kub 2022-05-11 00:18:47 +02:00
parent 732c328c41
commit 2ec448a8ce
3 changed files with 42 additions and 13 deletions

View file

@ -879,6 +879,8 @@ void ym2612_unpack_state(void);
Pico.t.timer_b_step = TIMER_B_TICK_ZCYCLES * 256; \ Pico.t.timer_b_step = TIMER_B_TICK_ZCYCLES * 256; \
ym2612.OPN.ST.status &= ~3; ym2612.OPN.ST.status &= ~3;
void *YM2413GetRegs(void);
void YM2413UnpackState(void);
// videoport.c // videoport.c
extern u32 SATaddr, SATmask; extern u32 SATaddr, SATmask;

View file

@ -29,11 +29,33 @@ extern int *sn76496_regs;
// ym2413 // ym2413
#define YM2413_CLK 3579545 #define YM2413_CLK 3579545
OPLL old_opll;
static OPLL *opll = NULL; static OPLL *opll = NULL;
unsigned YM2413_reg; static OPLL old_opll;
static struct {
uint32_t adr;
uint8_t reg[sizeof(opll->reg)];
} opll_buf;
PICO_INTERNAL void *YM2413GetRegs(void)
{
memcpy(opll_buf.reg, opll->reg, sizeof(opll->reg));
opll_buf.adr = opll->adr;
return &opll_buf;
}
PICO_INTERNAL void YM2413UnpackState(void)
{
int i;
for (i = sizeof(opll->reg)-1; i >= 0; i--) {
OPLL_writeIO(opll, 0, i);
OPLL_writeIO(opll, 1, opll_buf.reg[i]);
}
opll->adr = opll_buf.adr;
}
static resampler_t *fmresampler; static resampler_t *fmresampler;
static int (*PsndFMUpdate)(s32 *buffer, int length, int stereo, int is_buf_empty);
PICO_INTERNAL void PsndInit(void) PICO_INTERNAL void PsndInit(void)
{ {
@ -57,8 +79,6 @@ PICO_INTERNAL void PsndReset(void)
timers_reset(); timers_reset();
} }
int (*PsndFMUpdate)(s32 *buffer, int length, int stereo, int is_buf_empty);
// FM polyphase FIR resampling // FM polyphase FIR resampling
#define FMFIR_TAPS 9 #define FMFIR_TAPS 9
@ -142,6 +162,8 @@ void PsndRerate(int preserve_state)
if (preserve_state) memcpy(&old_opll, opll, sizeof(OPLL)); // remember old state if (preserve_state) memcpy(&old_opll, opll, sizeof(OPLL)); // remember old state
OPLL_setRate(opll, PicoIn.sndRate); OPLL_setRate(opll, PicoIn.sndRate);
OPLL_reset(opll); OPLL_reset(opll);
if (preserve_state) memcpy(&opll->adr, &old_opll.adr, sizeof(OPLL)-20); // restore old state
OPLL_forceRefresh(opll);
} }
if (state) if (state)

View file

@ -16,7 +16,6 @@
// sn76496 & ym2413 // sn76496 & ym2413
extern int *sn76496_regs; extern int *sn76496_regs;
extern OPLL old_opll;
static arearw *areaRead; static arearw *areaRead;
static arearw *areaWrite; static arearw *areaWrite;
@ -125,7 +124,6 @@ typedef enum {
CHUNK_DRAM, CHUNK_DRAM,
CHUNK_32XPAL, CHUNK_32XPAL,
CHUNK_32X_EVT, CHUNK_32X_EVT,
CHUNK_YM2413, //40
//rename //rename
CHUNK_32X_FIRST = CHUNK_MSH2, CHUNK_32X_FIRST = CHUNK_MSH2,
CHUNK_32X_LAST = CHUNK_32X_EVT, CHUNK_32X_LAST = CHUNK_32X_EVT,
@ -134,6 +132,7 @@ typedef enum {
CHUNK_CD_GFX, CHUNK_CD_GFX,
CHUNK_CD_CDC, CHUNK_CD_CDC,
CHUNK_CD_CDD, CHUNK_CD_CDD,
CHUNK_YM2413,
// //
CHUNK_DEFAULT_COUNT, CHUNK_DEFAULT_COUNT,
CHUNK_CARTHW_ = CHUNK_CARTHW, // 64 (defined in PicoInt) CHUNK_CARTHW_ = CHUNK_CARTHW, // 64 (defined in PicoInt)
@ -225,7 +224,7 @@ static int state_save(void *file)
{ {
char sbuff[32] = "Saving.. "; char sbuff[32] = "Saving.. ";
unsigned char buff[0x60], buff_z80[Z80_STATE_SIZE]; unsigned char buff[0x60], buff_z80[Z80_STATE_SIZE];
void *ym2612_regs = YM2612GetRegs(); void *ym_regs = YM2612GetRegs();
void *buf2 = NULL; void *buf2 = NULL;
int ver = 0x0191; // not really used.. int ver = 0x0191; // not really used..
int retval = -1; int retval = -1;
@ -245,14 +244,16 @@ static int state_save(void *file)
CHECKED_WRITE_BUFF(CHUNK_VSRAM, PicoMem.vsram); CHECKED_WRITE_BUFF(CHUNK_VSRAM, PicoMem.vsram);
CHECKED_WRITE_BUFF(CHUNK_IOPORTS, PicoMem.ioports); CHECKED_WRITE_BUFF(CHUNK_IOPORTS, PicoMem.ioports);
ym2612_pack_state(); ym2612_pack_state();
CHECKED_WRITE(CHUNK_FM, 0x200+4, ym2612_regs); ym_regs = YM2612GetRegs();
CHECKED_WRITE(CHUNK_FM, 0x200+4, ym_regs);
if (!(PicoIn.opt & POPT_DIS_IDLE_DET)) if (!(PicoIn.opt & POPT_DIS_IDLE_DET))
SekInitIdleDet(); SekInitIdleDet();
} }
else { else {
CHECKED_WRITE_BUFF(CHUNK_SMS, Pico.ms); CHECKED_WRITE_BUFF(CHUNK_SMS, Pico.ms);
CHECKED_WRITE_BUFF(CHUNK_YM2413, old_opll); ym_regs = YM2413GetRegs();
CHECKED_WRITE(CHUNK_YM2413, 0x40+4, ym_regs);
} }
CHECKED_WRITE_BUFF(CHUNK_VRAM, PicoMem.vram); CHECKED_WRITE_BUFF(CHUNK_VRAM, PicoMem.vram);
@ -395,7 +396,7 @@ static int state_load(void *file)
unsigned char buff_sh2[SH2_STATE_SIZE]; unsigned char buff_sh2[SH2_STATE_SIZE];
unsigned char *buf = NULL; unsigned char *buf = NULL;
unsigned char chunk; unsigned char chunk;
void *ym2612_regs; void *ym_regs;
int len_check; int len_check;
int retval = -1; int retval = -1;
char header[8]; char header[8];
@ -452,10 +453,14 @@ static int state_load(void *file)
case CHUNK_IOPORTS: CHECKED_READ_BUFF(PicoMem.ioports); break; case CHUNK_IOPORTS: CHECKED_READ_BUFF(PicoMem.ioports); break;
case CHUNK_PSG: CHECKED_READ2(28*4, sn76496_regs); break; case CHUNK_PSG: CHECKED_READ2(28*4, sn76496_regs); break;
case CHUNK_YM2413: CHECKED_READ_BUFF(old_opll); break; case CHUNK_YM2413:
ym_regs = YM2413GetRegs();
CHECKED_READ2(0x40+4, ym_regs);
YM2413UnpackState();
break;
case CHUNK_FM: case CHUNK_FM:
ym2612_regs = YM2612GetRegs(); ym_regs = YM2612GetRegs();
CHECKED_READ2(0x200+4, ym2612_regs); CHECKED_READ2(0x200+4, ym_regs);
ym2612_unpack_state(); ym2612_unpack_state();
break; break;