X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2Fsound%2Fsound.c;h=48ad40953c008124878664ef54a9497e91314ae4;hb=e743be2070a13d14cae39a55b815b62b0edb6776;hp=a73ebd992110baaced75e11eb3a4d5d77fa71483;hpb=02da059d71b20efd72efbd1009b8f42ab1e4bd02;p=picodrive.git diff --git a/pico/sound/sound.c b/pico/sound/sound.c index a73ebd9..48ad409 100644 --- a/pico/sound/sound.c +++ b/pico/sound/sound.c @@ -107,14 +107,9 @@ static void dac_recalculate(void) PICO_INTERNAL void PsndReset(void) { - void *ym2612_regs; - - // also clear the internal registers+addr line - ym2612_regs = YM2612GetRegs(); - memset(ym2612_regs, 0, 0x200+4); - timers_reset(); - + // PsndRerate calls YM2612Init, which also resets PsndRerate(0); + timers_reset(); } @@ -252,7 +247,7 @@ PICO_INTERNAL void cdda_start_play(void) lba_offset += Pico_mcd->TOC.Tracks[index].Offset; // find the actual file for this track - for (i = index; i >= 0; i--) + for (i = index; i > 0; i--) if (Pico_mcd->TOC.Tracks[i].F != NULL) break; if (Pico_mcd->TOC.Tracks[i].F == NULL) { @@ -296,7 +291,7 @@ PICO_INTERNAL void PsndClear(void) memset32((int *) PsndOut, 0, len); // assume PsndOut to be aligned else { short *out = PsndOut; - if ((int)out & 2) { *out++ = 0; len--; } + if ((long)out & 2) { *out++ = 0; len--; } memset32((int *) out, 0, len/2); if (len & 1) out[len-1] = 0; } @@ -313,6 +308,8 @@ static int PsndRender(int offset, int length) (Pico_mcd->pcm.control & 0x80) && Pico_mcd->pcm.enabled; offset <<= stereo; + pprof_start(sound); + #if !SIMPLE_WRITE_SOUND if (offset == 0) { // should happen once per frame // compensate for float part of PsndLen @@ -340,6 +337,7 @@ static int PsndRender(int offset, int length) memset32(buf32, 0, length< 0) - { - ccz = Cz80_Exec(&CZ80, 1); - cdrz = 1 - DrZ80Run(&drZ80, 1); - - if (drZ80.Z80_IRQ && (drZ80.Z80IF&1)) - cdrz += 1 - DrZ80Run(&drZ80, 1); // cz80 processes IRQ after EI, DrZ80 does not - - if (cdrz != ccz) { - printf("cycles: %i vs %i\n", cdrz, ccz); - fail = 1; - } - - if (drZ80.Z80PC - drZ80.Z80PC_BASE != Cz80_Get_Reg(&CZ80, CZ80_PC)) { - printf("PC: %04x vs %04x\n", drZ80.Z80PC - drZ80.Z80PC_BASE, Cz80_Get_Reg(&CZ80, CZ80_PC)); - fail = 1; - } - - if (fail) xfail(); + int stereo = (PicoOpt & 8) >> 3; + int length = PsndLen; - z80_ops_done++; - z80_cycles_left -= ccz; - z80_ppc = Cz80_Get_Reg(&CZ80, CZ80_PC); +#if !SIMPLE_WRITE_SOUND + // compensate for float part of PsndLen + PsndLen_exc_cnt += PsndLen_exc_add; + if (PsndLen_exc_cnt >= 0x10000) { + PsndLen_exc_cnt -= 0x10000; + length++; } - - return co - z80_cycles_left; -} #endif + // PSG + if (PicoOpt & POPT_EN_PSG) + SN76496Update(PsndOut, length, stereo); -PICO_INTERNAL void z80_pack(unsigned char *data) -{ -#if defined(_USE_MZ80) - struct mz80context mz80; - *(int *)data = 0x00005A6D; // "mZ" - mz80GetContext(&mz80); - memcpy(data+4, &mz80.z80clockticks, sizeof(mz80)-5*4); // don't save base&memhandlers -#elif defined(_USE_DRZ80) - *(int *)data = 0x015A7244; // "DrZ" v1 - drZ80.Z80PC = drZ80.z80_rebasePC(drZ80.Z80PC-drZ80.Z80PC_BASE); - drZ80.Z80SP = drZ80.z80_rebaseSP(drZ80.Z80SP-drZ80.Z80SP_BASE); - memcpy(data+4, &drZ80, 0x54); -#elif defined(_USE_CZ80) - *(int *)data = 0x00007a43; // "Cz" - *(int *)(data+4) = Cz80_Get_Reg(&CZ80, CZ80_PC); - memcpy(data+8, &CZ80, (INT32)&CZ80.BasePC - (INT32)&CZ80); -#endif -} - -PICO_INTERNAL void z80_unpack(unsigned char *data) -{ -#if defined(_USE_MZ80) - if (*(int *)data == 0x00005A6D) { // "mZ" save? - struct mz80context mz80; - mz80GetContext(&mz80); - memcpy(&mz80.z80clockticks, data+4, sizeof(mz80)-5*4); - mz80SetContext(&mz80); - } else { - z80_reset(); - z80_int(); - } -#elif defined(_USE_DRZ80) - if (*(int *)data == 0x015A7244) { // "DrZ" v1 save? - memcpy(&drZ80, data+4, 0x54); - // update bases - drZ80.Z80PC = drZ80.z80_rebasePC(drZ80.Z80PC-drZ80.Z80PC_BASE); - drZ80.Z80SP = drZ80.z80_rebaseSP(drZ80.Z80SP-drZ80.Z80SP_BASE); - } else { - z80_reset(); - drZ80.Z80IM = 1; - z80_int(); // try to goto int handler, maybe we won't execute trash there? + // upmix to "stereo" if needed + if (stereo) { + int i, *p; + for (i = length, p = (void *)PsndOut; i > 0; i--, p++) + *p |= *p << 16; } -#elif defined(_USE_CZ80) - if (*(int *)data == 0x00007a43) { // "Cz" save? - memcpy(&CZ80, data+8, (INT32)&CZ80.BasePC - (INT32)&CZ80); - Cz80_Set_Reg(&CZ80, CZ80_PC, *(int *)(data+4)); - } else { - z80_reset(); - z80_int(); - } -#endif -} -PICO_INTERNAL void z80_exit(void) -{ -#if defined(_USE_MZ80) - mz80shutdown(); -#endif + if (PicoWriteSound != NULL) + PicoWriteSound(length * ((PicoOpt & POPT_EN_STEREO) ? 4 : 2)); + PsndClear(); } -#if 1 // defined(__DEBUG_PRINT) || defined(__GP2X__) || defined(__GIZ__) -PICO_INTERNAL void z80_debug(char *dstr) -{ -#if defined(_USE_DRZ80) - sprintf(dstr, "Z80 state: PC: %04x SP: %04x\n", drZ80.Z80PC-drZ80.Z80PC_BASE, drZ80.Z80SP-drZ80.Z80SP_BASE); -#elif defined(_USE_CZ80) - sprintf(dstr, "Z80 state: PC: %04x SP: %04x\n", CZ80.PC - CZ80.BasePC, CZ80.SP.W); -#endif -} -#endif