mirror of
https://github.com/holub/mame
synced 2025-05-30 17:41:47 +03:00
commit
3cdf716d64
@ -2,7 +2,7 @@
|
||||
// copyright-holders:Angelo Salese, R. Belmont
|
||||
/***************************************************************************
|
||||
|
||||
machine/stvcd.c - Sega Saturn and ST-V CD-ROM handling
|
||||
machine/stvcd.cpp - Sega Saturn and ST-V CD-ROM handling
|
||||
|
||||
Another tilt at the windmill in 2011 by R. Belmont.
|
||||
|
||||
@ -70,6 +70,7 @@ DEFINE_DEVICE_TYPE(STVCD, stvcd_device, "stvcd", "Sega Saturn/ST-V CD Block HLE"
|
||||
|
||||
stvcd_device::stvcd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, STVCD, tag, owner, clock)
|
||||
, device_mixer_interface(mconfig, *this, 2)
|
||||
, m_cdrom_image(*this, "cdrom")
|
||||
, m_sector_timer(*this, "sector_timer")
|
||||
, m_sh1_timer(*this, "sh1_cmd")
|
||||
@ -85,20 +86,14 @@ MACHINE_CONFIG_START(stvcd_device::device_add_mconfig)
|
||||
MCFG_TIMER_DRIVER_ADD("sh1_cmd", stvcd_device, stv_sh1_sim)
|
||||
|
||||
MCFG_DEVICE_ADD("cdda", CDDA)
|
||||
// FIXME: these outputs should not be hardcoded
|
||||
MCFG_SOUND_ROUTE(0, ":lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, ":rspeaker", 1.0)
|
||||
MCFG_MIXER_ROUTE(0, *this, 1.0, 0)
|
||||
MCFG_MIXER_ROUTE(1, *this, 1.0, 1)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
void stvcd_device::device_start()
|
||||
{
|
||||
}
|
||||
|
||||
READ16_MEMBER(stvcd_device::channel_volume_r)
|
||||
{
|
||||
return m_cdda->get_channel_volume(offset);
|
||||
}
|
||||
|
||||
int stvcd_device::get_timing_command(void)
|
||||
{
|
||||
/* TODO: calculate timings based off command params */
|
||||
|
@ -11,7 +11,7 @@
|
||||
#include "machine/timer.h"
|
||||
#include "sound/cdda.h"
|
||||
|
||||
class stvcd_device : public device_t
|
||||
class stvcd_device : public device_t, public device_mixer_interface
|
||||
{
|
||||
static constexpr unsigned MAX_FILTERS = 24;
|
||||
static constexpr unsigned MAX_BLOCKS = 200;
|
||||
@ -23,8 +23,6 @@ public:
|
||||
DECLARE_READ32_MEMBER(stvcd_r);
|
||||
DECLARE_WRITE32_MEMBER(stvcd_w);
|
||||
|
||||
DECLARE_READ16_MEMBER(channel_volume_r);
|
||||
|
||||
void set_tray_open();
|
||||
void set_tray_close();
|
||||
|
||||
|
@ -30,11 +30,14 @@
|
||||
* June 6, 2011 (AS) Rewrote DMA from scratch, Darius 2 relies on it.
|
||||
*/
|
||||
|
||||
// TODO : Envelope/LFO times are based on 44100Hz case?
|
||||
#include "emu.h"
|
||||
#include "scsp.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#define ICLIP16(x) (x<-32768)?-32768:((x>32767)?32767:x)
|
||||
static constexpr int32_t clip16(int x) { return std::min(32767, std::max(-32768, x)); }
|
||||
static constexpr int32_t clip18(int x) { return std::min(131071, std::max(-131072, x)); }
|
||||
|
||||
#define SHIFT 12
|
||||
#define LFO_SHIFT 8
|
||||
@ -50,8 +53,8 @@
|
||||
*/
|
||||
|
||||
//SLOT PARAMETERS
|
||||
#define KEYONEX(slot) ((slot->udata.data[0x0]>>0x0)&0x1000)
|
||||
#define KEYONB(slot) ((slot->udata.data[0x0]>>0x0)&0x0800)
|
||||
#define KEYONEX(slot) ((slot->udata.data[0x0]>>0x0)&0x1000)
|
||||
#define KEYONB(slot) ((slot->udata.data[0x0]>>0x0)&0x0800)
|
||||
#define SBCTL(slot) ((slot->udata.data[0x0]>>0x9)&0x0003)
|
||||
#define SSCTL(slot) ((slot->udata.data[0x0]>>0x7)&0x0003)
|
||||
#define LPCTL(slot) ((slot->udata.data[0x0]>>0x5)&0x0003)
|
||||
@ -65,15 +68,15 @@
|
||||
|
||||
#define D2R(slot) ((slot->udata.data[0x4]>>0xB)&0x001F)
|
||||
#define D1R(slot) ((slot->udata.data[0x4]>>0x6)&0x001F)
|
||||
#define EGHOLD(slot) ((slot->udata.data[0x4]>>0x0)&0x0020)
|
||||
#define EGHOLD(slot) ((slot->udata.data[0x4]>>0x0)&0x0020)
|
||||
#define AR(slot) ((slot->udata.data[0x4]>>0x0)&0x001F)
|
||||
|
||||
#define LPSLNK(slot) ((slot->udata.data[0x5]>>0x0)&0x4000)
|
||||
#define LPSLNK(slot) ((slot->udata.data[0x5]>>0x0)&0x4000)
|
||||
#define KRS(slot) ((slot->udata.data[0x5]>>0xA)&0x000F)
|
||||
#define DL(slot) ((slot->udata.data[0x5]>>0x5)&0x001F)
|
||||
#define RR(slot) ((slot->udata.data[0x5]>>0x0)&0x001F)
|
||||
|
||||
#define STWINH(slot) ((slot->udata.data[0x6]>>0x0)&0x0200)
|
||||
#define STWINH(slot) ((slot->udata.data[0x6]>>0x0)&0x0200)
|
||||
#define SDIR(slot) ((slot->udata.data[0x6]>>0x0)&0x0100)
|
||||
#define TL(slot) ((slot->udata.data[0x6]>>0x0)&0x00FF)
|
||||
|
||||
@ -86,9 +89,9 @@
|
||||
|
||||
#define LFORE(slot) ((slot->udata.data[0x9]>>0x0)&0x8000)
|
||||
#define LFOF(slot) ((slot->udata.data[0x9]>>0xA)&0x001F)
|
||||
#define PLFOWS(slot) ((slot->udata.data[0x9]>>0x8)&0x0003)
|
||||
#define PLFOWS(slot) ((slot->udata.data[0x9]>>0x8)&0x0003)
|
||||
#define PLFOS(slot) ((slot->udata.data[0x9]>>0x5)&0x0007)
|
||||
#define ALFOWS(slot) ((slot->udata.data[0x9]>>0x3)&0x0003)
|
||||
#define ALFOWS(slot) ((slot->udata.data[0x9]>>0x3)&0x0003)
|
||||
#define ALFOS(slot) ((slot->udata.data[0x9]>>0x0)&0x0007)
|
||||
|
||||
#define ISEL(slot) ((slot->udata.data[0xA]>>0x3)&0x000F)
|
||||
@ -148,7 +151,6 @@ scsp_device::scsp_device(const machine_config &mconfig, const char *tag, device_
|
||||
device_rom_interface(mconfig, *this, 20, ENDIANNESS_BIG, 16),
|
||||
m_irq_cb(*this),
|
||||
m_main_irq_cb(*this),
|
||||
m_exts_cb(*this),
|
||||
m_BUFPTR(0),
|
||||
m_Master(0),
|
||||
m_stream(nullptr),
|
||||
@ -166,25 +168,28 @@ scsp_device::scsp_device(const machine_config &mconfig, const char *tag, device_
|
||||
m_mcipd(0),
|
||||
m_bufferl(nullptr),
|
||||
m_bufferr(nullptr),
|
||||
m_exts0(nullptr),
|
||||
m_exts1(nullptr),
|
||||
m_length(0),
|
||||
m_RBUFDST(nullptr)
|
||||
{
|
||||
memset(m_RINGBUF, 0, sizeof(m_RINGBUF));
|
||||
memset(m_MidiStack, 0, sizeof(m_MidiStack));
|
||||
memset(m_LPANTABLE, 0, sizeof(m_LPANTABLE));
|
||||
memset(m_RPANTABLE, 0, sizeof(m_RPANTABLE));
|
||||
memset(m_TimPris, 0, sizeof(m_TimPris));
|
||||
memset(m_ARTABLE, 0, sizeof(m_ARTABLE));
|
||||
memset(m_DRTABLE, 0, sizeof(m_DRTABLE));
|
||||
memset(m_EG_TABLE, 0, sizeof(m_EG_TABLE));
|
||||
memset(m_PLFO_TRI, 0, sizeof(m_PLFO_TRI));
|
||||
memset(m_PLFO_SQR, 0, sizeof(m_PLFO_SQR));
|
||||
memset(m_PLFO_SAW, 0, sizeof(m_PLFO_SAW));
|
||||
memset(m_PLFO_NOI, 0, sizeof(m_PLFO_NOI));
|
||||
memset(m_ALFO_TRI, 0, sizeof(m_ALFO_TRI));
|
||||
memset(m_ALFO_SQR, 0, sizeof(m_ALFO_SQR));
|
||||
memset(m_ALFO_SAW, 0, sizeof(m_ALFO_SAW));
|
||||
memset(m_ALFO_NOI, 0, sizeof(m_ALFO_NOI));
|
||||
std::fill(std::begin(m_RINGBUF), std::end(m_RINGBUF), 0);
|
||||
std::fill(std::begin(m_MidiStack), std::end(m_MidiStack), 0);
|
||||
std::fill(std::begin(m_LPANTABLE), std::end(m_LPANTABLE), 0);
|
||||
std::fill(std::begin(m_RPANTABLE), std::end(m_RPANTABLE), 0);
|
||||
std::fill(std::begin(m_TimPris), std::end(m_TimPris), 0);
|
||||
std::fill(std::begin(m_ARTABLE), std::end(m_ARTABLE), 0);
|
||||
std::fill(std::begin(m_DRTABLE), std::end(m_DRTABLE), 0);
|
||||
std::fill(std::begin(m_EG_TABLE), std::end(m_EG_TABLE), 0);
|
||||
std::fill(std::begin(m_PLFO_TRI), std::end(m_PLFO_TRI), 0);
|
||||
std::fill(std::begin(m_PLFO_SQR), std::end(m_PLFO_SQR), 0);
|
||||
std::fill(std::begin(m_PLFO_SAW), std::end(m_PLFO_SAW), 0);
|
||||
std::fill(std::begin(m_PLFO_NOI), std::end(m_PLFO_NOI), 0);
|
||||
std::fill(std::begin(m_ALFO_TRI), std::end(m_ALFO_TRI), 0);
|
||||
std::fill(std::begin(m_ALFO_SQR), std::end(m_ALFO_SQR), 0);
|
||||
std::fill(std::begin(m_ALFO_SAW), std::end(m_ALFO_SAW), 0);
|
||||
std::fill(std::begin(m_ALFO_NOI), std::end(m_ALFO_NOI), 0);
|
||||
std::fill(std::begin(m_ALFO_NOI), std::end(m_ALFO_NOI), 0);
|
||||
memset(m_PSCALES, 0, sizeof(m_PSCALES));
|
||||
memset(m_ASCALES, 0, sizeof(m_ASCALES));
|
||||
memset(&m_Slots, 0, sizeof(m_Slots));
|
||||
@ -206,11 +211,16 @@ void scsp_device::device_start()
|
||||
// set up the IRQ callbacks
|
||||
m_irq_cb.resolve_safe();
|
||||
m_main_irq_cb.resolve_safe();
|
||||
m_exts_cb.resolve_safe(0);
|
||||
|
||||
m_stream = machine().sound().stream_alloc(*this, 0, 2, clock() / 512);
|
||||
// Stereo output with EXTS0,1 Input (External digital audio output)
|
||||
m_stream = machine().sound().stream_alloc(*this, 2, 2, clock() / 512);
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_clock_changed - called if the clock
|
||||
// changes
|
||||
//-------------------------------------------------
|
||||
|
||||
void scsp_device::device_clock_changed()
|
||||
{
|
||||
m_stream->set_sample_rate(clock() / 512);
|
||||
@ -227,6 +237,8 @@ void scsp_device::rom_bank_updated()
|
||||
|
||||
void scsp_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
|
||||
{
|
||||
m_exts0 = inputs[0];
|
||||
m_exts1 = inputs[1];
|
||||
m_bufferl = outputs[0];
|
||||
m_bufferr = outputs[1];
|
||||
m_length = samples;
|
||||
@ -589,7 +601,7 @@ void scsp_device::init()
|
||||
t=ARTimes[i]; //In ms
|
||||
if(t!=0.0)
|
||||
{
|
||||
step=(1023*1000.0)/( double(22'579'200 / 512)*t);
|
||||
step=(1023*1000.0) / (44100.0*t);
|
||||
scale=(double) (1<<EG_SHIFT);
|
||||
m_ARTABLE[i]=(int) (step*scale);
|
||||
}
|
||||
@ -597,7 +609,7 @@ void scsp_device::init()
|
||||
m_ARTABLE[i]=1024<<EG_SHIFT;
|
||||
|
||||
t=DRTimes[i]; //In ms
|
||||
step=(1023*1000.0)/( double(22'579'200 / 512)*t);
|
||||
step=(1023*1000.0) / (44100.0*t);
|
||||
scale=(double) (1<<EG_SHIFT);
|
||||
m_DRTABLE[i]=(int) (step*scale);
|
||||
}
|
||||
@ -611,7 +623,6 @@ void scsp_device::init()
|
||||
}
|
||||
|
||||
LFO_Init();
|
||||
|
||||
// no "pend"
|
||||
m_udata.data[0x20/2] = 0;
|
||||
m_TimCnt[0] = 0xffff;
|
||||
@ -722,10 +733,10 @@ void scsp_device::UpdateReg(int reg)
|
||||
|
||||
if ((m_udata.data[0x18/2]&0xff) != 255)
|
||||
{
|
||||
time = (clock() / 512 / m_TimPris[0]) / (255-(m_udata.data[0x18/2]&0xff));
|
||||
time = (clock() / m_TimPris[0]) / (255-(m_udata.data[0x18/2]&0xff));
|
||||
if (time)
|
||||
{
|
||||
m_timerA->adjust(attotime::from_hz(time));
|
||||
m_timerA->adjust(attotime::from_ticks(512, time));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -741,10 +752,10 @@ void scsp_device::UpdateReg(int reg)
|
||||
|
||||
if ((m_udata.data[0x1A/2]&0xff) != 255)
|
||||
{
|
||||
time = (clock() / 512 / m_TimPris[1]) / (255-(m_udata.data[0x1A/2]&0xff));
|
||||
time = (clock() / m_TimPris[1]) / (255-(m_udata.data[0x1A/2]&0xff));
|
||||
if (time)
|
||||
{
|
||||
m_timerB->adjust(attotime::from_hz(time));
|
||||
m_timerB->adjust(attotime::from_ticks(512, time));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -760,10 +771,10 @@ void scsp_device::UpdateReg(int reg)
|
||||
|
||||
if ((m_udata.data[0x1C/2]&0xff) != 255)
|
||||
{
|
||||
time = (clock() / 512 / m_TimPris[2]) / (255-(m_udata.data[0x1C/2]&0xff));
|
||||
time = (clock() / m_TimPris[2]) / (255-(m_udata.data[0x1C/2]&0xff));
|
||||
if (time)
|
||||
{
|
||||
m_timerC->adjust(attotime::from_hz(time));
|
||||
m_timerC->adjust(attotime::from_ticks(512, time));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1043,10 +1054,8 @@ unsigned short scsp_device::r16(unsigned int addr)
|
||||
004CB4: 4E75 rts
|
||||
*/
|
||||
logerror("SCSP: Reading from EXTS register %08x\n",addr);
|
||||
if(addr == 0xee0)
|
||||
v = m_exts_cb(0);
|
||||
if(addr == 0xee2)
|
||||
v = m_exts_cb(1);
|
||||
if(addr<0xEE4)
|
||||
v = *((unsigned short *) (m_DSP.EXTS+(addr-0xee0)/2));
|
||||
}
|
||||
}
|
||||
return v;
|
||||
@ -1216,10 +1225,13 @@ inline int32_t scsp_device::UpdateSlot(SCSP_SLOT *slot)
|
||||
void scsp_device::DoMasterSamples(int nsamples)
|
||||
{
|
||||
stream_sample_t *bufr,*bufl;
|
||||
stream_sample_t *exts[2];
|
||||
int sl, s, i;
|
||||
|
||||
bufr=m_bufferr;
|
||||
bufl=m_bufferl;
|
||||
exts[0]=m_exts0;
|
||||
exts[1]=m_exts1;
|
||||
|
||||
for(s=0;s<nsamples;++s)
|
||||
{
|
||||
@ -1275,8 +1287,31 @@ void scsp_device::DoMasterSamples(int nsamples)
|
||||
}
|
||||
}
|
||||
|
||||
*bufl++ = ICLIP16(smpl>>2);
|
||||
*bufr++ = ICLIP16(smpr>>2);
|
||||
for(i=0;i<2;++i)
|
||||
{
|
||||
SCSP_SLOT *slot=m_Slots+i+16; // 100217, 100237 EFSDL, EFPAN for EXTS0/1
|
||||
if(EFSDL(slot))
|
||||
{
|
||||
m_DSP.EXTS[i] = exts[i][s];
|
||||
unsigned short Enc=((EFPAN(slot))<<0x8)|((EFSDL(slot))<<0xd);
|
||||
smpl+=(m_DSP.EXTS[i]*m_LPANTABLE[Enc])>>SHIFT;
|
||||
smpr+=(m_DSP.EXTS[i]*m_RPANTABLE[Enc])>>SHIFT;
|
||||
}
|
||||
}
|
||||
|
||||
if (DAC18B())
|
||||
{
|
||||
smpl = clip18(smpl);
|
||||
smpr = clip18(smpr);
|
||||
}
|
||||
else
|
||||
{
|
||||
smpl = clip16(smpl>>2);
|
||||
smpr = clip16(smpr>>2);
|
||||
}
|
||||
|
||||
*bufl++ = smpl;
|
||||
*bufr++ = smpr;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1359,7 +1394,7 @@ void scsp_device::exec_dma()
|
||||
if(m_udata.data[0x1e/2] & 0x10)
|
||||
{
|
||||
popmessage("SCSP DMA IRQ triggered, contact MAMEdev");
|
||||
machine().device("audiocpu")->execute().set_input_line(DecodeSCI(SCIDMA),HOLD_LINE);
|
||||
m_irq_cb(DecodeSCI(SCIDMA), HOLD_LINE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1523,7 +1558,7 @@ signed int scsp_device::ALFO_Step(SCSP_LFO_t *LFO)
|
||||
|
||||
void scsp_device::LFO_ComputeStep(SCSP_LFO_t *LFO,uint32_t LFOF,uint32_t LFOWS,uint32_t LFOS,int ALFO)
|
||||
{
|
||||
float step=(float) LFOFreq[LFOF]*256.0f/float(22'579'200 / 512);
|
||||
float step=(float) LFOFreq[LFOF]*256.0f/44100.0f;
|
||||
LFO->phase_step=(unsigned int) ((float) (1<<LFO_SHIFT)*step);
|
||||
if(ALFO)
|
||||
{
|
||||
|
@ -15,16 +15,6 @@
|
||||
// driver code indicates should be 4, but sounds distorted then
|
||||
|
||||
|
||||
#define MCFG_SCSP_IRQ_CB(_devcb) \
|
||||
downcast<scsp_device &>(*device).set_irq_callback(DEVCB_##_devcb);
|
||||
|
||||
#define MCFG_SCSP_MAIN_IRQ_CB(_devcb) \
|
||||
downcast<scsp_device &>(*device).set_main_irq_callback(DEVCB_##_devcb);
|
||||
|
||||
#define MCFG_SCSP_EXTS_CB(_devcb) \
|
||||
downcast<scsp_device &>(*device).set_exts_callback(DEVCB_##_devcb);
|
||||
|
||||
|
||||
class scsp_device : public device_t,
|
||||
public device_sound_interface,
|
||||
public device_rom_interface
|
||||
@ -32,12 +22,8 @@ class scsp_device : public device_t,
|
||||
public:
|
||||
scsp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 22'579'200);
|
||||
|
||||
template <class Object> devcb_base &set_irq_callback(Object &&cb) { return m_irq_cb.set_callback(std::forward<Object>(cb)); }
|
||||
template <class Object> devcb_base &set_main_irq_callback(Object &&cb) { return m_main_irq_cb.set_callback(std::forward<Object>(cb)); }
|
||||
template <class Object> devcb_base &set_exts_callback(Object &&cb) { return m_exts_cb.set_callback(std::forward<Object>(cb)); }
|
||||
auto irq_cb() { return m_irq_cb.bind(); }
|
||||
auto main_irq_cb() { return m_main_irq_cb.bind(); }
|
||||
auto exts_cb() { return m_exts_cb.bind(); }
|
||||
|
||||
// SCSP register access
|
||||
DECLARE_READ16_MEMBER( read );
|
||||
@ -106,7 +92,6 @@ private:
|
||||
|
||||
devcb_write8 m_irq_cb; /* irq callback */
|
||||
devcb_write_line m_main_irq_cb;
|
||||
devcb_read16 m_exts_cb;
|
||||
|
||||
union
|
||||
{
|
||||
@ -162,6 +147,8 @@ private:
|
||||
|
||||
stream_sample_t *m_bufferl;
|
||||
stream_sample_t *m_bufferr;
|
||||
stream_sample_t *m_exts0;
|
||||
stream_sample_t *m_exts1;
|
||||
|
||||
int m_length;
|
||||
|
||||
|
@ -162,7 +162,7 @@ void SCSPDSP::Step()
|
||||
else if (IRA <= 0x2F)
|
||||
INPUTS = MIXS[IRA - 0x20] << 4; //MIXS is 20 bit
|
||||
else if (IRA <= 0x31)
|
||||
INPUTS = 0;
|
||||
INPUTS = EXTS[IRA - 0x30] << 8; //EXTS is 16 bit
|
||||
else
|
||||
return;
|
||||
|
||||
|
@ -375,8 +375,7 @@ public:
|
||||
bitmap_ind16 m_bg_bitmap;
|
||||
bitmap_ind16 m_bg_bitmap2;
|
||||
|
||||
bitmap_ind16 m_screen1_bitmap;
|
||||
bitmap_ind16 m_screen2_bitmap;
|
||||
bitmap_ind16 m_screen_bitmap[2];
|
||||
uint8_t an_mux_data;
|
||||
uint8_t sound_data, sound_fifo;
|
||||
|
||||
@ -566,8 +565,8 @@ void coolridr_state::video_start()
|
||||
m_screen->register_screen_bitmap(m_bg_bitmap);
|
||||
m_screen->register_screen_bitmap(m_bg_bitmap2);
|
||||
|
||||
m_screen->register_screen_bitmap(m_screen1_bitmap);
|
||||
m_screen->register_screen_bitmap(m_screen2_bitmap);
|
||||
m_screen->register_screen_bitmap(m_screen_bitmap[0]);
|
||||
m_screen->register_screen_bitmap(m_screen_bitmap[1]);
|
||||
|
||||
m_gfxdecode->set_gfx(m_gfx_index, std::make_unique<gfx_element>(m_palette, h1_tile_layout, m_h1_pcg.get(), 0, 8, 0));
|
||||
}
|
||||
@ -898,30 +897,14 @@ uint32_t coolridr_state::screen_update_coolridr(screen_device &screen, bitmap_in
|
||||
m_fadedpals[i] = (r<<10|g<<5|b);
|
||||
}
|
||||
|
||||
if (which==0)
|
||||
for (int y = cliprect.top(); y <= cliprect.bottom(); y++)
|
||||
{
|
||||
for (int y=0;y<384;y++)
|
||||
{
|
||||
uint16_t* linesrc = &m_screen1_bitmap.pix16(y);
|
||||
uint16_t* linedest = &bitmap.pix16(y);
|
||||
uint16_t* linesrc = &m_screen_bitmap[which].pix16(y);
|
||||
uint16_t* linedest = &bitmap.pix16(y);
|
||||
|
||||
for (int x=0;x<496;x++)
|
||||
{
|
||||
linedest[x] = m_fadedpals[linesrc[x]];
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int y=0;y<384;y++)
|
||||
for (int x = cliprect.left(); x<= cliprect.right(); x++)
|
||||
{
|
||||
uint16_t* linesrc = &m_screen2_bitmap.pix16(y);
|
||||
uint16_t* linedest = &bitmap.pix16(y);
|
||||
|
||||
for (int x=0;x<496;x++)
|
||||
{
|
||||
linedest[x] = m_fadedpals[linesrc[x]];
|
||||
}
|
||||
linedest[x] = m_fadedpals[linesrc[x]];
|
||||
}
|
||||
}
|
||||
|
||||
@ -2543,7 +2526,7 @@ WRITE32_MEMBER(coolridr_state::sysh1_fb_data_w)
|
||||
osd_work_queue_wait(m_work_queue[0], osd_ticks_per_second() * 100);
|
||||
|
||||
// copy our old buffer to the actual screen
|
||||
copybitmap(m_screen1_bitmap, m_temp_bitmap_sprites, 0, 0, 0, 0, visarea);
|
||||
copybitmap(m_screen_bitmap[0], m_temp_bitmap_sprites, 0, 0, 0, 0, visarea);
|
||||
|
||||
|
||||
|
||||
@ -2591,7 +2574,7 @@ WRITE32_MEMBER(coolridr_state::sysh1_fb_data_w)
|
||||
osd_work_queue_wait(m_work_queue[1], osd_ticks_per_second() * 100);
|
||||
|
||||
// copy our old buffer to the actual screen
|
||||
copybitmap(m_screen2_bitmap, m_temp_bitmap_sprites2, 0, 0, 0, 0, visarea);
|
||||
copybitmap(m_screen_bitmap[1], m_temp_bitmap_sprites2, 0, 0, 0, 0, visarea);
|
||||
|
||||
|
||||
|
||||
@ -3277,14 +3260,14 @@ WRITE_LINE_MEMBER(coolridr_state::scsp2_to_sh1_irq)
|
||||
#define MAIN_CLOCK XTAL(28'636'363)
|
||||
|
||||
MACHINE_CONFIG_START(coolridr_state::coolridr)
|
||||
MCFG_DEVICE_ADD("maincpu", SH2, MAIN_CLOCK) // 28 mhz
|
||||
MCFG_DEVICE_ADD("maincpu", SH2, MAIN_CLOCK) // 28 MHz
|
||||
MCFG_DEVICE_PROGRAM_MAP(system_h1_map)
|
||||
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", coolridr_state, system_h1_main, "screen", 0, 1)
|
||||
|
||||
MCFG_DEVICE_ADD("soundcpu", M68000, 11289600) //256 x 44100 Hz = 11.2896 MHz
|
||||
MCFG_DEVICE_ADD("soundcpu", M68000, 22579000/2) // 22.579 MHz XTAL / 2 = 11.2895 MHz
|
||||
MCFG_DEVICE_PROGRAM_MAP(system_h1_sound_map)
|
||||
|
||||
MCFG_DEVICE_ADD("sub", SH1, 16000000) // SH7032 HD6417032F20!! 16 mhz
|
||||
MCFG_DEVICE_ADD("sub", SH1, 16000000) // SH7032 HD6417032F20!! 16 MHz
|
||||
MCFG_DEVICE_PROGRAM_MAP(coolridr_submap)
|
||||
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer2", coolridr_state, system_h1_sub, "screen", 0, 1)
|
||||
|
||||
@ -3325,18 +3308,18 @@ MACHINE_CONFIG_START(coolridr_state::coolridr)
|
||||
SPEAKER(config, "lspeaker").front_left();
|
||||
SPEAKER(config, "rspeaker").front_right();
|
||||
|
||||
MCFG_DEVICE_ADD("scsp1", SCSP)
|
||||
MCFG_DEVICE_ADDRESS_MAP(0, scsp1_map)
|
||||
MCFG_SCSP_IRQ_CB(WRITE8(*this, coolridr_state, scsp_irq))
|
||||
MCFG_SCSP_MAIN_IRQ_CB(WRITELINE(*this, coolridr_state, scsp1_to_sh1_irq))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(0, "rspeaker", 1.0)
|
||||
scsp_device &scsp1(SCSP(config, "scsp1", 22579000)); // 22.579 MHz XTAL
|
||||
scsp1.set_addrmap(0, &coolridr_state::scsp1_map);
|
||||
scsp1.irq_cb().set(FUNC(coolridr_state::scsp_irq));
|
||||
scsp1.main_irq_cb().set(FUNC(coolridr_state::scsp1_to_sh1_irq));
|
||||
scsp1.add_route(0, "lspeaker", 1.0);
|
||||
scsp1.add_route(1, "rspeaker", 1.0);
|
||||
|
||||
MCFG_DEVICE_ADD("scsp2", SCSP)
|
||||
MCFG_DEVICE_ADDRESS_MAP(0, scsp2_map)
|
||||
MCFG_SCSP_MAIN_IRQ_CB(WRITELINE(*this, coolridr_state, scsp2_to_sh1_irq))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(0, "rspeaker", 1.0)
|
||||
scsp_device &scsp2(SCSP(config, "scsp2", 22579000)); // 22.579 MHz XTAL
|
||||
scsp1.set_addrmap(0, &coolridr_state::scsp2_map);
|
||||
scsp2.main_irq_cb().set(FUNC(coolridr_state::scsp2_to_sh1_irq));
|
||||
scsp2.add_route(0, "lspeaker", 1.0);
|
||||
scsp2.add_route(1, "rspeaker", 1.0);
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
MACHINE_CONFIG_START(coolridr_state::aquastge)
|
||||
|
@ -4,7 +4,7 @@
|
||||
Sega Model 2: i960KB + (5x TGP) or (2x SHARC) or (2x TGPx4)
|
||||
System 24 tilemaps
|
||||
Custom Sega/Lockheed-Martin rasterization hardware
|
||||
(68000 + YM3834 + 2x MultiPCM) or (68000 + SCSP)
|
||||
(68000 + YM3438 + 2x MultiPCM) or (68000 + SCSP)
|
||||
|
||||
Hardware and protection reverse-engineering and general assistance by ElSemi.
|
||||
MAME driver by R. Belmont, Olivier Galibert, ElSemi and Angelo Salese.
|
||||
@ -2449,17 +2449,17 @@ MACHINE_CONFIG_START(model2_state::model2_screen)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
MACHINE_CONFIG_START(model2_state::model2_scsp)
|
||||
MCFG_DEVICE_ADD("audiocpu", M68000, 12000000)
|
||||
MCFG_DEVICE_ADD("audiocpu", M68000, 45158000/4) // SCSP Clock / 2
|
||||
MCFG_DEVICE_PROGRAM_MAP(model2_snd)
|
||||
|
||||
SPEAKER(config, "lspeaker").front_left();
|
||||
SPEAKER(config, "rspeaker").front_right();
|
||||
|
||||
MCFG_DEVICE_ADD("scsp", SCSP)
|
||||
MCFG_DEVICE_ADDRESS_MAP(0, scsp_map)
|
||||
MCFG_SCSP_IRQ_CB(WRITE8(*this, model2_state,scsp_irq))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 2.0)
|
||||
MCFG_SOUND_ROUTE(0, "rspeaker", 2.0)
|
||||
SCSP(config, m_scsp, 45158000/2); // 45.158MHz XTAL at Video board(Model 2A-CRX)
|
||||
m_scsp->set_addrmap(0, &model2_state::scsp_map);
|
||||
m_scsp->irq_cb().set(FUNC(model2_state::scsp_irq));
|
||||
m_scsp->add_route(0, "lspeaker", 1.0);
|
||||
m_scsp->add_route(1, "rspeaker", 1.0);
|
||||
|
||||
I8251(config, m_uart, 8000000); // uPD71051C, clock unknown
|
||||
// m_uart->rxrdy_handler().set(FUNC(model2_state::sound_ready_w));
|
||||
|
@ -6023,7 +6023,7 @@ void model3_state::add_cpu_166mhz(machine_config &config)
|
||||
|
||||
void model3_state::add_base_devices(machine_config &config)
|
||||
{
|
||||
M68000(config, m_audiocpu, 12000000);
|
||||
M68000(config, m_audiocpu, 45158000/4); // SCSP Clock / 2
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &model3_state::model3_snd);
|
||||
|
||||
EEPROM_93C46_16BIT(config, m_eeprom);
|
||||
@ -6044,16 +6044,16 @@ void model3_state::add_base_devices(machine_config &config)
|
||||
SPEAKER(config, "lspeaker").front_left();
|
||||
SPEAKER(config, "rspeaker").front_right();
|
||||
|
||||
SCSP(config, m_scsp1);
|
||||
SCSP(config, m_scsp1, 45158000/2); // 45.158 MHz XTAL
|
||||
m_scsp1->set_addrmap(0, &model3_state::scsp1_map);
|
||||
m_scsp1->irq_cb().set(FUNC(model3_state::scsp_irq));
|
||||
m_scsp1->add_route(0, "lspeaker", 2.0);
|
||||
m_scsp1->add_route(0, "rspeaker", 2.0);
|
||||
m_scsp1->add_route(0, "lspeaker", 1.0);
|
||||
m_scsp1->add_route(1, "rspeaker", 1.0);
|
||||
|
||||
scsp_device &scsp2(SCSP(config, "scsp2"));
|
||||
scsp_device &scsp2(SCSP(config, "scsp2", 45158000/2));
|
||||
scsp2.set_addrmap(0, &model3_state::scsp2_map);
|
||||
scsp2.add_route(0, "lspeaker", 2.0);
|
||||
scsp2.add_route(0, "rspeaker", 2.0);
|
||||
scsp2.add_route(0, "lspeaker", 1.0);
|
||||
scsp2.add_route(1, "rspeaker", 1.0);
|
||||
}
|
||||
|
||||
void model3_state::add_scsi_devices(machine_config &config)
|
||||
|
@ -846,17 +846,16 @@ MACHINE_CONFIG_START(sat_console_state::saturn)
|
||||
SPEAKER(config, "lspeaker").front_left();
|
||||
SPEAKER(config, "rspeaker").front_right();
|
||||
|
||||
MCFG_DEVICE_ADD(m_scsp, SCSP)
|
||||
MCFG_DEVICE_ADDRESS_MAP(0, scsp_mem)
|
||||
MCFG_SCSP_IRQ_CB(WRITE8(*this, saturn_state, scsp_irq))
|
||||
MCFG_SCSP_MAIN_IRQ_CB(WRITELINE(m_scu, sega_scu_device, sound_req_w))
|
||||
MCFG_SCSP_EXTS_CB(READ16("stvcd", stvcd_device, channel_volume_r))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
SCSP(config, m_scsp, 8467200*8/3); // 8.4672 MHz EXTCLK * 8 / 3 = 22.5792 MHz
|
||||
m_scsp->set_addrmap(0, &sat_console_state::scsp_mem);
|
||||
m_scsp->irq_cb().set(FUNC(saturn_state::scsp_irq));
|
||||
m_scsp->main_irq_cb().set(m_scu, FUNC(sega_scu_device::sound_req_w));
|
||||
m_scsp->add_route(0, "lspeaker", 1.0);
|
||||
m_scsp->add_route(1, "rspeaker", 1.0);
|
||||
|
||||
MCFG_DEVICE_ADD("stvcd", STVCD, 0)
|
||||
//MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
//MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(0, "scsp", 1.0, 0)
|
||||
MCFG_SOUND_ROUTE(1, "scsp", 1.0, 1)
|
||||
|
||||
MCFG_SATURN_CONTROL_PORT_ADD("ctrl1", saturn_controls, "joypad")
|
||||
MCFG_SATURN_CONTROL_PORT_ADD("ctrl2", saturn_controls, "joypad")
|
||||
|
@ -1176,12 +1176,12 @@ MACHINE_CONFIG_START(stv_state::stv)
|
||||
SPEAKER(config, "lspeaker").front_left();
|
||||
SPEAKER(config, "rspeaker").front_right();
|
||||
|
||||
MCFG_DEVICE_ADD("scsp", SCSP)
|
||||
MCFG_DEVICE_ADDRESS_MAP(0, scsp_mem)
|
||||
MCFG_SCSP_IRQ_CB(WRITE8(*this, saturn_state, scsp_irq))
|
||||
MCFG_SCSP_MAIN_IRQ_CB(WRITELINE("scu", sega_scu_device, sound_req_w))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
SCSP(config, m_scsp, 22579200); // TODO : Unknown clock, divider
|
||||
m_scsp->set_addrmap(0, &stv_state::scsp_mem);
|
||||
m_scsp->irq_cb().set(FUNC(saturn_state::scsp_irq));
|
||||
m_scsp->main_irq_cb().set(m_scu, FUNC(sega_scu_device::sound_req_w));
|
||||
m_scsp->add_route(0, "lspeaker", 1.0);
|
||||
m_scsp->add_route(1, "rspeaker", 1.0);
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
MACHINE_CONFIG_START(stv_state::stv_5881)
|
||||
@ -1199,11 +1199,8 @@ MACHINE_CONFIG_START(stv_state::stvcd)
|
||||
MCFG_DEVICE_PROGRAM_MAP(stvcd_mem)
|
||||
|
||||
MCFG_DEVICE_ADD("stvcd", STVCD, 0)
|
||||
//MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
//MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
|
||||
MCFG_DEVICE_MODIFY("scsp")
|
||||
MCFG_SCSP_EXTS_CB(READ16("stvcd", stvcd_device, channel_volume_r))
|
||||
MCFG_SOUND_ROUTE(0, "scsp", 1.0, 0)
|
||||
MCFG_SOUND_ROUTE(1, "scsp", 1.0, 1)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user