diff --git a/source/cd_hw/cd_cart.c b/source/cd_hw/cd_cart.c index 7cfd306..94c11e2 100644 --- a/source/cd_hw/cd_cart.c +++ b/source/cd_hw/cd_cart.c @@ -264,4 +264,4 @@ void cd_cart_init(void) } } } -} \ No newline at end of file +} diff --git a/source/cd_hw/cdd.c b/source/cd_hw/cdd.c index c42e7ec..61ef52d 100644 --- a/source/cd_hw/cdd.c +++ b/source/cd_hw/cdd.c @@ -357,7 +357,7 @@ int cdd_load(char *filename, char *header) if (!(memcmp(lptr, "FILE", 4))) { /* check supported file types */ - if (!strstr(lptr," BINARY") && !strstr(lptr," WAVE")) + if (!strstr(lptr," BINARY") && !strstr(lptr," WAV")) { /* unsupported file type */ break; @@ -375,7 +375,7 @@ int cdd_load(char *filename, char *header) if (ptr - fname) ptr++; /* append filename characters after filepath */ - while ((*lptr != '\"') && memcmp(lptr, " BINARY", 7) && memcmp(lptr, " WAVE", 5)) + while ((*lptr != '\"') && memcmp(lptr, " BINARY", 7) && memcmp(lptr, " WAV", 4)) { *ptr++ = *lptr++; } @@ -636,6 +636,9 @@ int cdd_load(char *filename, char *header) } } + /* Lead-out */ + cdd.toc.tracks[cdd.toc.last].start = cdd.toc.end; + /* CD loaded */ cdd.loaded = 1; return 1; @@ -839,6 +842,7 @@ void cdd_update(void) } else { + cdd.status = CD_END; return; } @@ -898,6 +902,10 @@ void cdd_update(void) } else if (cdd.index >= cdd.toc.last) { + /* no AUDIO track playing */ + scd.regs[0x36>>1].byte.h = 0x01; + + /* end of disc */ cdd.index = cdd.toc.last; cdd.lba = cdd.toc.end; } @@ -905,6 +913,9 @@ void cdd_update(void) /* seek to current block */ if (!cdd.index) { + /* no AUDIO track playing */ + scd.regs[0x36>>1].byte.h = 0x01; + fseek(cdd.toc.tracks[0].fd, cdd.lba * cdd.sectorSize, SEEK_SET); } else if (cdd.toc.tracks[cdd.index].fd) @@ -961,7 +972,7 @@ void cdd_process(void) scd.regs[0x3a>>1].w = lut_BCD_16[(lba/75)/60]; scd.regs[0x3c>>1].w = lut_BCD_16[(lba/75)%60]; scd.regs[0x3e>>1].w = lut_BCD_16[(lba%75)]; - scd.regs[0x40>>1].byte.h = 0x00; + scd.regs[0x40>>1].byte.h = 0x00; /* TODO: check what is returned in RS8 (note: bit 1 is checked by BIOS) */ break; } @@ -972,7 +983,7 @@ void cdd_process(void) scd.regs[0x3a>>1].w = lut_BCD_16[(lba/75)/60]; scd.regs[0x3c>>1].w = lut_BCD_16[(lba/75)%60]; scd.regs[0x3e>>1].w = lut_BCD_16[(lba%75)]; - scd.regs[0x40>>1].byte.h = 0x00; + scd.regs[0x40>>1].byte.h = 0x00; /* TODO: check what is returned in RS8 */ break; } @@ -981,7 +992,7 @@ void cdd_process(void) scd.regs[0x38>>1].w = (cdd.status << 8) | 0x02; scd.regs[0x3a>>1].w = (cdd.index < cdd.toc.last) ? lut_BCD_16[cdd.index + 1] : 0x0A0A; scd.regs[0x3c>>1].w = 0x0000; - scd.regs[0x3e>>1].w = 0x0000; + scd.regs[0x3e>>1].w = 0x0000; /* TODO: check what is returned in RS6 */ scd.regs[0x40>>1].byte.h = 0x00; break; } @@ -1002,8 +1013,8 @@ void cdd_process(void) scd.regs[0x38>>1].w = (cdd.status << 8) | 0x04; scd.regs[0x3a>>1].w = 0x0001; scd.regs[0x3c>>1].w = lut_BCD_16[cdd.toc.last]; - scd.regs[0x3e>>1].w = 0x0000; - scd.regs[0x40>>1].byte.h = 0x00; + scd.regs[0x3e>>1].w = 0x0000; /* TODO: check what is returned in RS6-RS7 */ + scd.regs[0x40>>1].byte.h = 0x00; /* TODO: check what is returned in RS8 */ break; } @@ -1018,7 +1029,7 @@ void cdd_process(void) scd.regs[0x40>>1].byte.h = track % 10; if (track == 1) { - /* data track */ + /* RS6 bit 3 is set for DATA track */ scd.regs[0x3e>>1].byte.h |= 0x08; } break; @@ -1081,7 +1092,14 @@ void cdd_process(void) /* Some delay is also needed when playing AUDIO tracks located at the end of the disc (ex: Sonic CD intro) */ /* max. seek time = 1.5s = 1.5 x 75 = 112.5 CDD interrupts (rounded to 120) for 270000 sectors max on disc */ /* Note: this is only a rough approximation, on real hardware, drive seek time is much likely not linear */ - cdd.latency += ((abs(lba - cdd.lba) * 120) / 270000); + if (lba < cdd.lba) + { + cdd.latency += (((cdd.lba - lba) * 120) / 270000); + } + else + { + cdd.latency += (((lba - cdd.lba) * 120) / 270000); + } /* seek AUDIO track */ if (lba < cdd.toc.tracks[index].start) diff --git a/source/cd_hw/cdd.h b/source/cd_hw/cdd.h index ed4d883..c0e0710 100644 --- a/source/cd_hw/cdd.h +++ b/source/cd_hw/cdd.h @@ -50,6 +50,7 @@ #define CD_READY 0x04 #define CD_OPEN 0x05 #define CD_STOP 0x09 +#define CD_END 0x0C /* CD blocks scanning speed */ #define CD_SCAN_SPEED 10 diff --git a/source/cd_hw/pcm.c b/source/cd_hw/pcm.c index caa7f00..8a74161 100644 --- a/source/cd_hw/pcm.c +++ b/source/cd_hw/pcm.c @@ -64,6 +64,16 @@ void pcm_reset(void) /* reset default bank */ pcm.bank = pcm.ram; + /* reset channels stereo panning */ + pcm.chan[0].pan = 0xff; + pcm.chan[1].pan = 0xff; + pcm.chan[2].pan = 0xff; + pcm.chan[3].pan = 0xff; + pcm.chan[4].pan = 0xff; + pcm.chan[5].pan = 0xff; + pcm.chan[6].pan = 0xff; + pcm.chan[7].pan = 0xff; + /* reset master clocks counter */ pcm.cycles = 0; @@ -77,15 +87,15 @@ int pcm_context_save(uint8 *state) uint8 tmp8; int bufferptr = 0; - tmp8 = (scd.pcm_hw.bank - scd.pcm_hw.ram) >> 12; + tmp8 = (pcm.bank - pcm.ram) >> 12; - save_param(scd.pcm_hw.chan, sizeof(scd.pcm_hw.chan)); - save_param(scd.pcm_hw.out, sizeof(scd.pcm_hw.out)); + save_param(pcm.chan, sizeof(pcm.chan)); + save_param(pcm.out, sizeof(pcm.out)); save_param(&tmp8, 1); - save_param(&scd.pcm_hw.enabled, sizeof(scd.pcm_hw.enabled)); - save_param(&scd.pcm_hw.status, sizeof(scd.pcm_hw.status)); - save_param(&scd.pcm_hw.index, sizeof(scd.pcm_hw.index)); - save_param(scd.pcm_hw.ram, sizeof(scd.pcm_hw.ram)); + save_param(&pcm.enabled, sizeof(pcm.enabled)); + save_param(&pcm.status, sizeof(pcm.status)); + save_param(&pcm.index, sizeof(pcm.index)); + save_param(pcm.ram, sizeof(pcm.ram)); return bufferptr; } @@ -95,16 +105,16 @@ int pcm_context_load(uint8 *state) uint8 tmp8; int bufferptr = 0; - load_param(scd.pcm_hw.chan, sizeof(scd.pcm_hw.chan)); - load_param(scd.pcm_hw.out, sizeof(scd.pcm_hw.out)); + load_param(pcm.chan, sizeof(pcm.chan)); + load_param(pcm.out, sizeof(pcm.out)); load_param(&tmp8, 1); - scd.pcm_hw.bank = &scd.pcm_hw.ram[(tmp8 & 0x0f) << 12]; + pcm.bank = &pcm.ram[(tmp8 & 0x0f) << 12]; - load_param(&scd.pcm_hw.enabled, sizeof(scd.pcm_hw.enabled)); - load_param(&scd.pcm_hw.status, sizeof(scd.pcm_hw.status)); - load_param(&scd.pcm_hw.index, sizeof(scd.pcm_hw.index)); - load_param(scd.pcm_hw.ram, sizeof(scd.pcm_hw.ram)); + load_param(&pcm.enabled, sizeof(pcm.enabled)); + load_param(&pcm.status, sizeof(pcm.status)); + load_param(&pcm.index, sizeof(pcm.index)); + load_param(pcm.ram, sizeof(pcm.ram)); return bufferptr; } @@ -209,7 +219,7 @@ void pcm_run(unsigned int length) } } - /* end of blib buffer frame */ + /* end of blip buffer frame */ blip_end_frame(blip[0], length); blip_end_frame(blip[1], length); diff --git a/source/cd_hw/scd.c b/source/cd_hw/scd.c index bc75284..e10a0b1 100644 --- a/source/cd_hw/scd.c +++ b/source/cd_hw/scd.c @@ -1045,7 +1045,7 @@ void scd_init(void) { if (i & 2) { - /* PRG-RAM (first 128KB bank, mirrored ?) */ + /* PRG-RAM (first 128KB bank, mirrored) */ m68k.memory_map[i].base = scd.prg_ram + ((i & 1) << 16); m68k.memory_map[i].read8 = NULL; m68k.memory_map[i].read16 = NULL; @@ -1068,7 +1068,7 @@ void scd_init(void) } } - /* $200000-$23FFFF (resp. $600000-$63FFFF): Word-RAM in 2M mode (256KB) */ + /* $200000-$3FFFFF (resp. $600000-$7FFFFF): Word-RAM in 2M mode (256KB mirrored) */ for (i=base+0x20; i>1].byte.l; } /* SUB-CPU communication flags */ - if (address == 0xa1200f) + if (index == 0x0f) { m68k_poll_detect(0x0f); return scd.regs[0x0f>>1].byte.l; } /* default registers */ - if (address < 0xa12030) + if (index < 0x30) { /* SUB-CPU communication words */ - if (address >= 0xa12020) + if (index >= 0x20) { - m68k_poll_detect((address - 0x10) & 0x1f); + m68k_poll_detect(index - 0x10); } /* register LSB */ if (address & 1) { - return scd.regs[(address >> 1) & 0xff].byte.l; + return scd.regs[index >> 1].byte.l; } /* register MSB */ - return scd.regs[(address >> 1) & 0xff].byte.h; + return scd.regs[index >> 1].byte.h; } } @@ -441,35 +444,38 @@ unsigned int ctrl_io_read_word(unsigned int address) #endif if (system_hw == SYSTEM_MCD) { + /* register index ($A12000-A1203F mirrored up to $A120FF) */ + uint8 index = address & 0x3f; + /* Memory Mode */ - if (address == 0xa12002) + if (index == 0x02) { m68k_poll_detect(0x03); return scd.regs[0x03>>1].w; } /* CDC host data (word access only ?) */ - if (address == 0xa12008) + if (index == 0x08) { return cdc_host_r(); } /* H-INT vector (word access only ?) */ - if (address == 0xa12006) + if (index == 0x06) { return *(uint16 *)(m68k.memory_map[0].base + 0x72); } /* default registers */ - if (address < 0xa12030) + if (index < 0x30) { /* SUB-CPU communication words */ - if (address >= 0xa12020) + if (index >= 0x20) { - m68k_poll_detect((address - 0x10) & 0x1e); + m68k_poll_detect(index - 0x10); } - return scd.regs[(address >> 1) & 0xff].w; + return scd.regs[index >> 1].w; } } @@ -565,7 +571,8 @@ void ctrl_io_write_byte(unsigned int address, unsigned int data) #endif if (system_hw == SYSTEM_MCD) { - switch (address & 0xff) + /* register index ($A12000-A1203F mirrored up to $A120FF) */ + switch (address & 0x3f) { case 0x00: /* SUB-CPU interrupt */ { @@ -795,7 +802,8 @@ void ctrl_io_write_word(unsigned int address, unsigned int data) #endif if (system_hw == SYSTEM_MCD) { - switch (address & 0xfe) + /* register index ($A12000-A1203F mirrored up to $A120FF) */ + switch (address & 0x3e) { case 0x00: /* SUB-CPU interrupt & control */ { diff --git a/source/sound/blip_buf.c b/source/sound/blip_buf.c index 7068af3..2f48536 100644 --- a/source/sound/blip_buf.c +++ b/source/sound/blip_buf.c @@ -8,8 +8,6 @@ #include "blip_buf.h" -#define BLIP_ASSERT 1 - #ifdef BLIP_ASSERT #include #endif @@ -236,11 +234,10 @@ int blip_read_samples( blip_t* m, short out [], int count) buf_t const* in = SAMPLES( m ); buf_t const* end = in + count; int sum = m->integrator; - int s; do { /* Eliminate fraction */ - s = ARITH_SHIFT( sum, delta_bits ); + int s = ARITH_SHIFT( sum, delta_bits ); sum += *in++; @@ -275,24 +272,23 @@ int blip_mix_samples( blip_t* m, short out [], int count) buf_t const* in = SAMPLES( m ); buf_t const* end = in + count; int sum = m->integrator; - int s, temp; do { /* Eliminate fraction */ - s = ARITH_SHIFT( sum, delta_bits ); + int s = ARITH_SHIFT( sum, delta_bits ); sum += *in++; - - /* Add to current buffer */ - temp = s + *out; - - CLAMP( temp ); - - *out = temp; - out += 2; /* High-pass filter */ sum -= s << (delta_bits - bass_shift); + + /* Add current buffer value */ + s += *out; + + CLAMP( s ); + + *out = s; + out += 2; } while ( in != end ); m->integrator = sum; diff --git a/source/sound/sn76489.h b/source/sound/sn76489.h index 19d4a86..3c86cae 100644 --- a/source/sound/sn76489.h +++ b/source/sound/sn76489.h @@ -20,4 +20,4 @@ extern void SN76489_Update(unsigned int cycles); extern void *SN76489_GetContextPtr(void); extern int SN76489_GetContextSize(void); -#endif /* _SN76489_H_ */ \ No newline at end of file +#endif /* _SN76489_H_ */ diff --git a/source/win/fileio.c b/source/win/fileio.c index e530b68..5482032 100644 --- a/source/win/fileio.c +++ b/source/win/fileio.c @@ -41,7 +41,6 @@ ****************************************************************************************/ #include "shared.h" -#include #include static int check_zip(char *filename); diff --git a/source/win/main.c b/source/win/main.c index 34acdaa..f873aae 100644 --- a/source/win/main.c +++ b/source/win/main.c @@ -1,4 +1,8 @@ +#ifdef __WIN32__ #include +#else +#define MessageBox(owner, text, caption, type) printf("%s: %s\n", caption, text) +#endif #include "SDL.h" #include "SDL_thread.h" @@ -197,7 +201,8 @@ static void sdl_video_update() /* clear destination surface */ SDL_FillRect(sdl_video.surf_screen, 0, 0); - /*if (config.render && (interlaced || config.ntsc)) rect.h *= 2; +#if 0 + if (config.render && (interlaced || config.ntsc)) rect.h *= 2; if (config.ntsc) rect.w = (reg[12]&1) ? MD_NTSC_OUT_WIDTH(rect.w) : SMS_NTSC_OUT_WIDTH(rect.w); if (config.ntsc) { @@ -233,7 +238,8 @@ static void sdl_video_update() free(md_ntsc); md_ntsc = NULL; } - } */ + } +#endif } SDL_BlitSurface(sdl_video.surf_bitmap, &sdl_video.srect, sdl_video.surf_screen, &sdl_video.drect); @@ -658,8 +664,6 @@ int sdl_input_update(void) break; } } - - free (keystate); return 1; } diff --git a/source/win/osd.h b/source/win/osd.h index 88ecf1b..ad95a52 100644 --- a/source/win/osd.h +++ b/source/win/osd.h @@ -6,7 +6,6 @@ #include #include #include -#include #include #include