mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-09-10 16:53:15 +02:00
Merge git://github.com/ekeeke/Genesis-Plus-GX
This commit is contained in:
commit
52a8cca2d4
@ -264,4 +264,4 @@ void cd_cart_init(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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<base+0x24; i++)
|
||||
{
|
||||
m68k.memory_map[i].base = scd.word_ram_2M + ((i & 3) << 16);
|
||||
@ -1079,18 +1079,6 @@ void scd_init(void)
|
||||
zbank_memory_map[i].read = NULL;
|
||||
zbank_memory_map[i].write = NULL;
|
||||
}
|
||||
|
||||
/* $240000-$3FFFFF (resp. $400000-$7FFFFF): unused area (Word-RAM mirrored ?) */
|
||||
for (i=base+0x24; i<base+0x40; i++)
|
||||
{
|
||||
m68k.memory_map[i].base = scd.word_ram_2M + ((i & 3) << 16);
|
||||
m68k.memory_map[i].read8 = m68k_read_bus_8;
|
||||
m68k.memory_map[i].read16 = m68k_read_bus_16;
|
||||
m68k.memory_map[i].write8 = m68k_unused_8_w;
|
||||
m68k.memory_map[i].write16 = m68k_unused_16_w;
|
||||
zbank_memory_map[i].read = zbank_unused_r;
|
||||
zbank_memory_map[i].write = zbank_unused_w;
|
||||
}
|
||||
|
||||
/****************************************************************/
|
||||
/* SUB-CPU memory map ($000000-$FFFFFF) */
|
||||
|
@ -74,4 +74,4 @@ void terebi_oekaki_write(unsigned char data)
|
||||
|
||||
/* set BUSY flag */
|
||||
tablet.busy = 1;
|
||||
}
|
||||
}
|
||||
|
@ -322,37 +322,40 @@ unsigned int ctrl_io_read_byte(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 == 0xa12003)
|
||||
if (index == 0x03)
|
||||
{
|
||||
m68k_poll_detect(0x03);
|
||||
return scd.regs[0x03>>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 */
|
||||
{
|
||||
|
@ -8,8 +8,6 @@
|
||||
|
||||
#include "blip_buf.h"
|
||||
|
||||
#define BLIP_ASSERT 1
|
||||
|
||||
#ifdef BLIP_ASSERT
|
||||
#include <assert.h>
|
||||
#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;
|
||||
|
@ -20,4 +20,4 @@ extern void SN76489_Update(unsigned int cycles);
|
||||
extern void *SN76489_GetContextPtr(void);
|
||||
extern int SN76489_GetContextSize(void);
|
||||
|
||||
#endif /* _SN76489_H_ */
|
||||
#endif /* _SN76489_H_ */
|
||||
|
@ -41,7 +41,6 @@
|
||||
****************************************************************************************/
|
||||
|
||||
#include "shared.h"
|
||||
#include <windows.h>
|
||||
#include <zlib.h>
|
||||
|
||||
static int check_zip(char *filename);
|
||||
|
@ -1,4 +1,8 @@
|
||||
#ifdef __WIN32__
|
||||
#include <windows.h>
|
||||
#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;
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,6 @@
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <time.h>
|
||||
#include <conio.h>
|
||||
|
||||
#include <SDL.h>
|
||||
#include <stdlib.h>
|
||||
|
Loading…
Reference in New Issue
Block a user