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