From eb1d8b0bbda54ef06bfaf29468262c6f8ff92977 Mon Sep 17 00:00:00 2001 From: dinkc64 <12570148+dinkc64@users.noreply.github.com> Date: Wed, 25 Feb 2015 08:24:13 +0000 Subject: [PATCH] SMS driver: use our SN psg, force pal timing for xenon2, msx mapper WIP --- src/burn/drv/sms/d_sms.cpp | 39 +++---- src/burn/drv/sms/sms.cpp | 74 ++++++++++++- src/burn/drv/sms/sms.h | 5 +- src/burn/drv/sms/smsshared.h | 2 +- src/burn/drv/sms/smssound.cpp | 187 +++------------------------------ src/burn/drv/sms/smssound.h | 4 +- src/burn/drv/sms/smssystem.cpp | 28 +++-- 7 files changed, 125 insertions(+), 214 deletions(-) diff --git a/src/burn/drv/sms/d_sms.cpp b/src/burn/drv/sms/d_sms.cpp index e73402563..4f0b5708a 100644 --- a/src/burn/drv/sms/d_sms.cpp +++ b/src/burn/drv/sms/d_sms.cpp @@ -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); diff --git a/src/burn/drv/sms/sms.cpp b/src/burn/drv/sms/sms.cpp index c32a03f7b..4fa34bcb3 100644 --- a/src/burn/drv/sms/sms.cpp +++ b/src/burn/drv/sms/sms.cpp @@ -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: diff --git a/src/burn/drv/sms/sms.h b/src/burn/drv/sms/sms.h index 299afaf42..f9e05a1ca 100644 --- a/src/burn/drv/sms/sms.h +++ b/src/burn/drv/sms/sms.h @@ -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); diff --git a/src/burn/drv/sms/smsshared.h b/src/burn/drv/sms/smsshared.h index d29c5e798..2d96a34a4 100644 --- a/src/burn/drv/sms/smsshared.h +++ b/src/burn/drv/sms/smsshared.h @@ -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" diff --git a/src/burn/drv/sms/smssound.cpp b/src/burn/drv/sms/smssound.cpp index f86981b1b..90a0aeb56 100644 --- a/src/burn/drv/sms/smssound.cpp +++ b/src/burn/drv/sms/smssound.cpp @@ -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) } - - - diff --git a/src/burn/drv/sms/smssound.h b/src/burn/drv/sms/smssound.h index d5b3886c0..bc0f6b845 100644 --- a/src/burn/drv/sms/smssound.h +++ b/src/burn/drv/sms/smssound.h @@ -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_ */ diff --git a/src/burn/drv/sms/smssystem.cpp b/src/burn/drv/sms/smssystem.cpp index a06982bb2..1a67d4d7c 100644 --- a/src/burn/drv/sms/smssystem.cpp +++ b/src/burn/drv/sms/smssystem.cpp @@ -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) } -