SMS driver: use our SN psg, force pal timing for xenon2, msx mapper WIP

This commit is contained in:
dinkc64 2015-02-25 08:24:13 +00:00
parent 42e4232961
commit eb1d8b0bbd
7 changed files with 125 additions and 214 deletions

View File

@ -3,6 +3,7 @@
#include "tiles_generic.h"
#include "smsshared.h"
#include "z80_intf.h"
#include "sn76496.h"
static UINT8 *AllMem;
static UINT8 *MemEnd;
@ -83,6 +84,8 @@ INT32 SMSExit()
cart.rom = NULL;
}
system_shutdown();
return 0;
}
@ -145,19 +148,6 @@ INT32 SMSFrame()
system_frame(0);
ZetClose();
if (pBurnSoundOut) {
INT32 length = nBurnSoundLen;
INT16 *pSoundBuf = pBurnSoundOut;
if (snd.buffer_size < length) length = snd.buffer_size;
memset(pBurnSoundOut, 0, nBurnSoundLen * 4);
for(INT32 i = 0; i < length; i++) {
pSoundBuf[0] = snd.output[0][i]; //nLeftSample;
pSoundBuf[1] = snd.output[1][i]; //nRightSample;
pSoundBuf += 2;
}
}
if (pBurnDraw)
SMSDraw();
@ -183,6 +173,17 @@ rominfo_t game_list[] = {
{0xA577CE46, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, "Micro Machines"},
{0x8813514B, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, "Excellent Dizzy (Proto)"},
{0xAA140C9C, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, "Excellent Dizzy (Proto - GG)"},
{0x5c205ee1, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, "Xenon 2"},
{0xec726c0d, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, "Xenon 2"},
{0x445525E2, MAPPER_MSX, DISPLAY_NTSC, TERRITORY_EXPORT, "Penguin Adventure (KR)"},
{0x83F0EEDE, MAPPER_MSX, DISPLAY_NTSC, TERRITORY_EXPORT, "Street Master (KR)"},
{0xA05258F5, MAPPER_MSX, DISPLAY_NTSC, TERRITORY_EXPORT, "Won-Si-In (KR)"},
{0x06965ED9, MAPPER_MSX, DISPLAY_NTSC, TERRITORY_EXPORT, "F-1 Spirit - The way to Formula-1 (KR)"},
{0x77EFE84A, MAPPER_MSX, DISPLAY_NTSC, TERRITORY_EXPORT, "Cyborg Z (KR)"},
{0xF89AF3CC, MAPPER_MSX, DISPLAY_NTSC, TERRITORY_EXPORT, "Knightmare II - The Maze of Galious (KR)"},
{0x9195C34C, MAPPER_MSX, DISPLAY_NTSC, TERRITORY_EXPORT, "Super Boy 3 (KR)"},
{0xE316C06D, MAPPER_MSX_NEMESIS, DISPLAY_NTSC, TERRITORY_EXPORT, "Nemesis (KR)"},
{0x0A77FA5E, MAPPER_MSX, DISPLAY_NTSC, TERRITORY_EXPORT, "Nemesis 2 (KR)"},
{0 , -1 , -1, -1, NULL},
};
@ -291,8 +292,6 @@ INT32 SMSInit()
sms.territory = 0;
sms.use_fm = 0;
//system_poweron(); (alias for sms_reset())
//sms_reset(); (reset on system_init() automatically)
return 0;
}
@ -318,21 +317,13 @@ static void system_load_state()
INT32 SMSScan(INT32 nAction, INT32 *pnMin)
{
struct BurnArea ba;
if (pnMin) {
*pnMin = 0x029708;
}
if (nAction & ACB_VOLATILE) {
memset(&ba, 0, sizeof(ba));
ba.Data = SN76489_GetContextPtr(0);
ba.nLen = SN76489_GetContextSize();
ba.szName = "SMSPSG";
BurnAcb(&ba);
ZetScan(nAction);
SN76496Scan(nAction, pnMin);
SCAN_VAR(vdp);
SCAN_VAR(sms);
SCAN_VAR(cart.fcr);

View File

@ -39,11 +39,21 @@ void __fastcall writemem_mapper_codies(UINT16 offset, UINT8 data)
sms_mapper_w(3, data);
return;
case 0xC000:
//cpu_writemap[offset >> 10][offset & 0x03FF] = data;
sms.wram[offset & 0x1fff] = data; // maybe..
return;
}
}
void __fastcall writemem_mapper_msx(UINT16 offset, UINT8 data)
{
if (offset <= 0x0003) {
bprintf(0, _T("msx %X %X,"), offset, data);
sms_mapper8k_w(offset & 3, data);
return;
}
sms.wram[offset & 0x1fff] = data;
//z80_writemap[address >> 10][address & 0x03FF] = data;
}
void sms_init(void)
@ -58,6 +68,8 @@ void sms_init(void)
/* Assign mapper */
if(cart.mapper == MAPPER_CODIES)
ZetSetWriteHandler(writemem_mapper_codies);
else if (cart.mapper == MAPPER_MSX || cart.mapper == MAPPER_MSX_NEMESIS)
{ bprintf(0, _T("msx mapper!\n"));ZetSetWriteHandler(writemem_mapper_msx);}
else
ZetSetWriteHandler(writemem_mapper_sega);
@ -153,9 +165,62 @@ void sms_reset(void)
cart.fcr[0] = 0x00;
cart.fcr[1] = 0x00;
cart.fcr[2] = 0x01;
cart.fcr[3] = 0x00;
cart.fcr[3] = 0x00;
switch (cart.mapper) // WIP!!
{
case MAPPER_MSX_NEMESIS:
case MAPPER_MSX: {
cart.fcr[2] = 0x00;
UINT32 poffset = ((cart.pages * 2)-1) << 13;
ZetOpen(0);
ZetMapMemory(cart.rom + poffset, 0x0000, 0x1fff, MAP_READ);
ZetClose();
}
}
}
/*// INIT ??
// Nemesis special case
if (slot.mapper == MAPPER_MSX_NEMESIS)
{
// first 8k page is mapped to last 8k ROM bank
for (i = 0x00; i < 0x08; i++)
{
z80_readmap[i] = &slot.rom[(0x0f << 13) | ((i & 0x07) << 10)];
}
}
*/
void sms_mapper8k_w(INT32 address, UINT8 data) // WIP
{
/* Calculate ROM page index */
UINT32 poffset = (data % (cart.pages * 2)) << 13;
/* Save frame control register data */
cart.fcr[address] = data;
/* 4 x 8k banks */
switch (address & 3)
{
case 0: /* cartridge ROM bank (8k) at $8000-$9FFF */
ZetMapMemory(cart.rom + poffset, 0x8000, 0x9fff, MAP_ROM);
break;
case 1: /* cartridge ROM bank (8k) at $A000-$BFFF */
ZetMapMemory(cart.rom + poffset, 0xa000, 0xbfff, MAP_ROM);
break;
case 2: /* cartridge ROM bank (8k) at $4000-$5FFF */
ZetMapMemory(cart.rom + poffset, 0x4000, 0x5fff, MAP_ROM);
break;
case 3: /* cartridge ROM bank (8k) at $6000-$7FFF */
ZetMapMemory(cart.rom + poffset, 0x6000, 0x7fff, MAP_ROM);
break;
}
}
void sms_mapper_w(INT32 address, UINT8 data)
{
@ -206,7 +271,6 @@ uint8 z80_read_unmapped(void)
uint8 data;
pc = (pc - 1) & 0xFFFF;
data = ZetReadProg(pc);
//bprintf(0, _T("Read unmapped: %X data %X.\n"), pc, data);
return ((data | data_bus_pullup) & ~data_bus_pulldown);
}
@ -221,7 +285,7 @@ void memctrl_w(uint8 data)
/*--------------------------------------------------------------------------*/
void _fastcall sms_port_w(UINT16 port, UINT8 data)
{ //bprintf(0, _T("pw %X %X,"), port, data);
{
switch(port & 0xC1)
{
case 0x00:
@ -249,7 +313,7 @@ void _fastcall sms_port_w(UINT16 port, UINT8 data)
}
UINT8 _fastcall sms_port_r(UINT16 port)
{ //bprintf(0, _T("pr %X,"), port);
{
switch(port & 0xC0)
{
case 0x00:

View File

@ -12,7 +12,9 @@ enum {
enum {
MAPPER_NONE = 0,
MAPPER_SEGA = 1,
MAPPER_CODIES = 2
MAPPER_CODIES = 2,
MAPPER_MSX = 3,
MAPPER_MSX_NEMESIS = 4
};
enum {
@ -105,6 +107,7 @@ void sms_init(void);
void sms_reset(void);
void sms_shutdown(void);
void sms_mapper_w(INT32 address, UINT8 data);
void sms_mapper8k_w(INT32 address, UINT8 data);
/* port-map Function prototypes */
uint8 z80_read_unmapped(void);

View File

@ -16,7 +16,7 @@
#include "smsvdp.h"
#include "smsrender.h"
#include "smstms.h"
#include "smssn76489.h"
//#include "smssn76489.h"
#include "smsfmintf.h"
#include "smssound.h"
#include "smssystem.h"

View File

@ -4,27 +4,12 @@
*/
#include "tiles_generic.h"
#include "smsshared.h"
#include "sn76496.h"
snd_t snd;
static int16 **fm_buffer;
static int16 **psg_buffer;
int *smptab;
int smptab_len;
int sound_init(void)
{
uint8 *buf = NULL;
int restore_fm = 0;
int i;
/* Save register settings */
if(snd.enabled && sms.use_fm)
{
restore_fm = 1;
buf = (uint8 *)malloc(FM_GetContextSize());
FM_GetContext(buf);
}
/* If we are reinitializing, shut down sound emulation */
if(snd.enabled)
{
@ -38,104 +23,32 @@ int sound_init(void)
if(snd.sample_rate < 8000 || snd.sample_rate > 48000)
return 0;
/* Assign stream mixing callback if none provided */
if(!snd.mixer_callback)
snd.mixer_callback = sound_mixer_callback;
// Init sound emulation
SN76489Init(0, snd.psg_clock, 0);
SN76496SetRoute(0, 1.00, BURN_SND_ROUTE_BOTH);
/* Calculate number of samples generated per frame */
snd.sample_count = (snd.sample_rate / snd.fps);
/* Calculate size of sample buffer */
snd.buffer_size = snd.sample_count * 2;
/* Free sample buffer position table if previously allocated */
if(smptab)
{
free(smptab);
smptab = NULL;
}
/* Prepare incremental info */
snd.done_so_far = 0;
smptab_len = (sms.display == DISPLAY_NTSC) ? 262 : 313;
smptab = (int *)malloc(smptab_len * sizeof(int));
if(!smptab) return 0;
for (i = 0; i < smptab_len; i++)
{
double calc = (snd.sample_count * i);
calc = calc / (double)smptab_len;
smptab[i] = (int)calc;
}
/* Allocate emulated sound streams */
for(i = 0; i < STREAM_MAX; i++)
{
snd.stream[i] = (int16 *)malloc(snd.buffer_size);
if(!snd.stream[i]) return 0;
memset(snd.stream[i], 0, snd.buffer_size);
}
/* Allocate sound output streams */
snd.output[0] = (int16 *)malloc(snd.buffer_size);
snd.output[1] = (int16 *)malloc(snd.buffer_size);
if(!snd.output[0] || !snd.output[1]) return 0;
/* Set up buffer pointers */
fm_buffer = (int16 **)&snd.stream[STREAM_FM_MO];
psg_buffer = (int16 **)&snd.stream[STREAM_PSG_L];
/* Set up SN76489 emulation */
SN76489_Init(0, snd.psg_clock, snd.sample_rate);
/* Set up YM2413 emulation */
FM_Init();
FM_Init();
/* Inform other functions that we can use sound */
snd.enabled = 1;
/* Restore YM2413 register settings */
if(restore_fm)
{
FM_SetContext(buf);
free(buf);
}
return 1;
}
void sound_shutdown(void)
{
int i;
if(!snd.enabled)
return;
/* Free emulated sound streams */
for(i = 0; i < STREAM_MAX; i++)
{
if(snd.stream[i])
{
free(snd.stream[i]);
snd.stream[i] = NULL;
}
}
/* Free sound output buffers */
for(i = 0; i < 2; i++)
{
if(snd.output[i])
{
free(snd.output[i]);
snd.output[i] = NULL;
}
}
/* Shut down SN76489 emulation */
SN76489_Shutdown();
//SN76489_Shutdown();
SN76496Exit();
/* Shut down YM2413 emulation */
FM_Shutdown();
FM_Shutdown();
snd.enabled = 0;
}
@ -145,78 +58,13 @@ void sound_reset(void)
return;
/* Reset SN76489 emulator */
SN76489_Reset(0);
//SN76489_Reset(0);
/* Reset YM2413 emulator */
FM_Reset();
}
void sound_update(int line)
{
int16 *fm[2], *psg[2];
if(!snd.enabled)
return;
/* Finish buffers at end of frame */
if(line == smptab_len - 1)
{
psg[0] = psg_buffer[0] + snd.done_so_far;
psg[1] = psg_buffer[1] + snd.done_so_far;
fm[0] = fm_buffer[0] + snd.done_so_far;
fm[1] = fm_buffer[1] + snd.done_so_far;
/* Generate SN76489 sample data */
SN76489_Update(0, psg, snd.sample_count - snd.done_so_far);
/* Generate YM2413 sample data */
FM_Update(fm, snd.sample_count - snd.done_so_far);
/* Mix streams into output buffer */
snd.mixer_callback(snd.stream, snd.output, snd.sample_count);
/* Reset */
snd.done_so_far = 0;
}
else
{
int tinybit;
tinybit = smptab[line] - snd.done_so_far;
/* Do a tiny bit */
psg[0] = psg_buffer[0] + snd.done_so_far;
psg[1] = psg_buffer[1] + snd.done_so_far;
fm[0] = fm_buffer[0] + snd.done_so_far;
fm[1] = fm_buffer[1] + snd.done_so_far;
/* Generate SN76489 sample data */
SN76489_Update(0, psg, tinybit);
/* Generate YM2413 sample data */
FM_Update(fm, tinybit);
/* Sum total */
snd.done_so_far += tinybit;
}
}
/* Generic FM+PSG stereo mixer callback */
void sound_mixer_callback(int16 **stream, int16 **output, int length)
{
int i;
for(i = 0; i < length; i++)
{
//int16 temp = (fm_buffer[0][i] + fm_buffer[1][i]) / 2; // FM is disabled.
//output[0][i] = temp + psg_buffer[0][i];
//output[1][i] = temp + psg_buffer[1][i];
output[0][i] = psg_buffer[0][i];
output[1][i] = psg_buffer[1][i];
}
}
/*--------------------------------------------------------------------------*/
/* Sound chip access handlers */
/*--------------------------------------------------------------------------*/
@ -225,11 +73,8 @@ void psg_stereo_w(int data)
{
if(!snd.enabled)
return;
SN76489_GGStereoWrite(0, data);
}
void stream_update(int which, int position)
{
//SN76489_GGStereoWrite(0, data);
SN76496Write(0, data); // wrong - needs stereo -dink
}
@ -237,7 +82,8 @@ void psg_write(int data)
{
if(!snd.enabled)
return;
SN76489_Write(0, data);
//SN76489_Write(0, data);
SN76496Write(0, data);
}
/*--------------------------------------------------------------------------*/
@ -263,6 +109,3 @@ void fmunit_write(int offset, int data)
}

View File

@ -40,7 +40,7 @@ void fmunit_write(int offset, int data);
int sound_init(void);
void sound_shutdown(void);
void sound_reset(void);
void sound_update(int line);
void sound_mixer_callback(int16 **stream, int16 **output, int length);
//void sound_update(int line);
//void sound_mixer_callback(int16 **stream, int16 **output, int length);
#endif /* _SOUND_H_ */

View File

@ -19,6 +19,7 @@
#include "smsshared.h"
#include "burnint.h"
#include "z80_intf.h"
#include "sn76496.h"
bitmap_t bitmap;
@ -31,6 +32,7 @@ void system_frame(int skip_render)
static int iline_table[] = {0xC0, 0xE0, 0xF0};
int lpf = (sms.display == DISPLAY_NTSC) ? 262 : 313;
int iline;
INT32 nSoundBufferPos = 0;
/* Debounce pause key */
if(input.system & INPUT_PAUSE)
@ -100,13 +102,29 @@ void system_frame(int skip_render)
}
}
sound_update(vdp.line);
// sound_update(vdp.line);
// Render Sound Segment
if (pBurnSoundOut) {
INT32 nSegmentLength = nBurnSoundLen / lpf;
INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1);
SN76496Update(0, pSoundBuf, nSegmentLength);
nSoundBufferPos += nSegmentLength;
}
++vdp.line;
if(vdp.mode <= 7)
parse_line(vdp.line);
}
// Make sure the buffer is entirely filled.
if (pBurnSoundOut) {
INT32 nSegmentLength = nBurnSoundLen - nSoundBufferPos;
INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1);
if (nSegmentLength) {
SN76496Update(0, pSoundBuf, nSegmentLength);
}
}
}
@ -114,8 +132,6 @@ void system_frame(int skip_render)
void system_init(void)
{
//error_init();
sms_init();
pio_init();
vdp_init();
@ -149,9 +165,6 @@ void system_shutdown(void)
error("SG:%04X\n", vdp.sg);
error("\n");*/
#endif
sms_shutdown();
@ -159,8 +172,6 @@ void system_shutdown(void)
vdp_shutdown();
render_shutdown();
sound_shutdown();
//error_shutdown();
}
void system_reset(void)
@ -184,4 +195,3 @@ void system_poweroff(void)
}