mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
(MESS) megavdp: simplified DMA 'lag' handling, reducing the need of
global functions. nw.
This commit is contained in:
parent
bf956aa84c
commit
04472de94a
@ -406,8 +406,6 @@ private:
|
||||
|
||||
|
||||
/* machine/megavdp.c */
|
||||
extern UINT16 (*vdp_get_word_from_68k_mem)(running_machine &machine, UINT32 source, address_space& space);
|
||||
extern UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source, address_space& space);
|
||||
extern int megadrive_total_scanlines;
|
||||
extern int megadrive_vblank_flag;
|
||||
extern UINT16* megadrive_vdp_palette_lookup;
|
||||
|
@ -1048,24 +1048,6 @@ static int megadriv_tas_callback(device_t *device)
|
||||
return 0; // writeback not allowed
|
||||
}
|
||||
|
||||
// the SVP introduces some kind of DMA 'lag', which we have to compensate for, this is obvious even on gfx DMAd from ROM (the Speedometer)
|
||||
// likewise segaCD, at least when reading wordram? we might need to check what mode we're in here..
|
||||
UINT16 vdp_get_word_from_68k_mem_delayed(running_machine &machine, UINT32 source, address_space & space68k)
|
||||
{
|
||||
if (source <= 0x3fffff)
|
||||
{
|
||||
source -= 2; // compensate DMA lag
|
||||
return space68k.read_word(source);
|
||||
}
|
||||
else if ((source >= 0xe00000) && (source <= 0xffffff))
|
||||
return space68k.read_word(source);
|
||||
else
|
||||
{
|
||||
printf("DMA Read unmapped %06x\n",source);
|
||||
return machine.rand();
|
||||
}
|
||||
}
|
||||
|
||||
void md_base_state::megadriv_init_common()
|
||||
{
|
||||
/* Look to see if this system has the standard Sound Z80 */
|
||||
@ -1078,17 +1060,6 @@ void md_base_state::megadriv_init_common()
|
||||
|
||||
m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(md_base_state::genesis_int_callback),this));
|
||||
|
||||
vdp_get_word_from_68k_mem = vdp_get_word_from_68k_mem_default;
|
||||
|
||||
if (machine().device("sega32x"))
|
||||
printf("32X found 'sega32x'\n");
|
||||
|
||||
if (machine().device("segacd"))
|
||||
{
|
||||
printf("SegaCD found 'segacd'\n");
|
||||
vdp_get_word_from_68k_mem = vdp_get_word_from_68k_mem_delayed;
|
||||
}
|
||||
|
||||
m68k_set_tas_callback(m_maincpu, megadriv_tas_callback);
|
||||
|
||||
m_megadrive_io_read_data_port_ptr = read8_delegate(FUNC(md_base_state::megadrive_io_read_data_port_3button),this);
|
||||
|
@ -21,7 +21,8 @@ sega_genesis_vdp_device::sega_genesis_vdp_device(const machine_config &mconfig,
|
||||
: sega315_5124_device( mconfig, SEGA315_5246, "Sega Genesis VDP", tag, owner, clock, SEGA315_5124_CRAM_SIZE, 0, true, "sega_genesis_vdp", __FILE__),
|
||||
m_sndirqline_callback(*this),
|
||||
m_lv6irqline_callback(*this),
|
||||
m_lv4irqline_callback(*this)
|
||||
m_lv4irqline_callback(*this),
|
||||
m_dma_delay(0)
|
||||
{
|
||||
m_use_alt_timing = 0;
|
||||
m_palwrite_base = -1;
|
||||
@ -457,11 +458,9 @@ void sega_genesis_vdp_device::update_m_vdp_code_and_address(void)
|
||||
((m_vdp_command_part2 & 0x0003) << 14);
|
||||
}
|
||||
|
||||
UINT16 (*vdp_get_word_from_68k_mem)(running_machine &machine, UINT32 source, address_space& space68k);
|
||||
|
||||
// if either SVP CPU or segaCD is present, there is a lag we have to compensate for
|
||||
// hence, variants of this call will be defined in megadriv_init_common for segacd and svp
|
||||
UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source, address_space & space68k)
|
||||
// if either SVP CPU or segaCD is present, there is a 'lag' we have to compensate for
|
||||
// hence, for segacd and svp we set m_dma_delay to the appropriate value at start
|
||||
inline UINT16 sega_genesis_vdp_device::vdp_get_word_from_68k_mem(UINT32 source)
|
||||
{
|
||||
// should we limit the valid areas here?
|
||||
// how does this behave with the segacd etc?
|
||||
@ -470,13 +469,13 @@ UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source
|
||||
//printf("vdp_get_word_from_68k_mem_default %08x\n", source);
|
||||
|
||||
if (source <= 0x3fffff)
|
||||
return space68k.read_word(source);
|
||||
return m_space68k->read_word(source - m_dma_delay); // compensate DMA lag
|
||||
else if ((source >= 0xe00000) && (source <= 0xffffff))
|
||||
return space68k.read_word(source);
|
||||
return m_space68k->read_word(source);
|
||||
else
|
||||
{
|
||||
printf("DMA Read unmapped %06x\n",source);
|
||||
return machine.rand();
|
||||
return machine().rand();
|
||||
}
|
||||
}
|
||||
|
||||
@ -544,7 +543,7 @@ void sega_genesis_vdp_device::insta_68k_to_vram_dma(UINT32 source,int length)
|
||||
|
||||
for (count = 0;count<(length>>1);count++)
|
||||
{
|
||||
vdp_vram_write(vdp_get_word_from_68k_mem(machine(), source, *m_space68k));
|
||||
vdp_vram_write(vdp_get_word_from_68k_mem(source));
|
||||
source+=2;
|
||||
if (source>0xffffff) source = 0xe00000;
|
||||
}
|
||||
@ -570,7 +569,7 @@ void sega_genesis_vdp_device::insta_68k_to_cram_dma(UINT32 source,UINT16 length)
|
||||
{
|
||||
//if (m_vdp_address>=0x80) return; // abandon
|
||||
|
||||
write_cram_value((m_vdp_address&0x7e)>>1, vdp_get_word_from_68k_mem(machine(), source, *m_space68k));
|
||||
write_cram_value((m_vdp_address&0x7e)>>1, vdp_get_word_from_68k_mem(source));
|
||||
source+=2;
|
||||
|
||||
if (source>0xffffff) source = 0xfe0000;
|
||||
@ -598,7 +597,7 @@ void sega_genesis_vdp_device::insta_68k_to_vsram_dma(UINT32 source,UINT16 length
|
||||
{
|
||||
if (m_vdp_address>=0x80) return; // abandon
|
||||
|
||||
m_vsram[(m_vdp_address&0x7e)>>1] = vdp_get_word_from_68k_mem(machine(), source, *m_space68k);
|
||||
m_vsram[(m_vdp_address&0x7e)>>1] = vdp_get_word_from_68k_mem(source);
|
||||
source+=2;
|
||||
|
||||
if (source>0xffffff) source = 0xfe0000;
|
||||
|
@ -168,9 +168,6 @@
|
||||
sega_genesis_vdp_device::static_set_palette_tag(*device, "^" _palette_tag);
|
||||
|
||||
|
||||
UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source, address_space & space68k);
|
||||
|
||||
|
||||
// Temporary solution while 32x VDP mixing and scanline interrupting is moved outside MD VDP
|
||||
typedef device_delegate<void (int x, UINT32 priority, UINT16 &lineptr)> md_32x_scanline_delegate;
|
||||
typedef device_delegate<void (int scanline, int irq6)> md_32x_interrupt_delegate;
|
||||
@ -226,6 +223,7 @@ public:
|
||||
void set_framerate(int rate) { m_framerate = rate; }
|
||||
void set_vdp_pal(bool pal) { m_vdp_pal = pal ? 1 : 0; }
|
||||
void set_use_cram(int cram) { m_vdp_use_cram = cram; }
|
||||
void set_dma_delay(int delay) { m_dma_delay = delay; }
|
||||
int get_framerate() { return m_framerate; }
|
||||
|
||||
|
||||
@ -243,6 +241,8 @@ public:
|
||||
TIMER_DEVICE_CALLBACK_MEMBER( megadriv_scanline_timer_callback );
|
||||
timer_device* m_megadriv_scanline_timer;
|
||||
|
||||
inline UINT16 vdp_get_word_from_68k_mem(UINT32 source);
|
||||
|
||||
protected:
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
@ -286,6 +286,7 @@ private:
|
||||
int m_framerate;
|
||||
int m_vdp_pal;
|
||||
int m_vdp_use_cram; // c2 uses it's own palette ram, so it sets this to 0
|
||||
int m_dma_delay; // SVP and SegaCD have some 'lag' in DMA transfers
|
||||
|
||||
UINT16* m_vdp_regs;
|
||||
UINT16* m_vram;
|
||||
|
@ -246,28 +246,6 @@ INPUT_PORTS_END
|
||||
*
|
||||
*************************************/
|
||||
|
||||
|
||||
UINT16 vdp_get_word_from_68k_mem_console(running_machine &machine, UINT32 source, address_space & space68k)
|
||||
{
|
||||
md_cons_state *state = machine.driver_data<md_cons_state>();
|
||||
|
||||
if (source <= 0x3fffff)
|
||||
{
|
||||
if (state->m_slotcart->get_type() == SEGA_SVP)
|
||||
{
|
||||
source -= 2; // the SVP introduces some kind of DMA 'lag', which we have to compensate for, this is obvious even on gfx DMAd from ROM (the Speedometer)
|
||||
}
|
||||
return space68k.read_word(source);
|
||||
}
|
||||
else if ((source >= 0xe00000) && (source <= 0xffffff))
|
||||
return space68k.read_word(source);
|
||||
else
|
||||
{
|
||||
printf("DMA Read unmapped %06x\n",source);
|
||||
return machine.rand();
|
||||
}
|
||||
}
|
||||
|
||||
MACHINE_START_MEMBER(md_cons_state, md_common)
|
||||
{
|
||||
static const char *const pad6names[2][4] = {
|
||||
@ -296,7 +274,9 @@ MACHINE_START_MEMBER(md_cons_state, ms_megadriv)
|
||||
{
|
||||
MACHINE_START_CALL_MEMBER( md_common );
|
||||
|
||||
vdp_get_word_from_68k_mem = vdp_get_word_from_68k_mem_console;
|
||||
// the SVP introduces some kind of DMA 'lag', which we have to compensate for, this is obvious even on gfx DMAd from ROM (the Speedometer)
|
||||
if (m_slotcart->get_type() == SEGA_SVP)
|
||||
m_vdp->set_dma_delay(2);
|
||||
|
||||
// for now m_cartslot is only in MD and not 32x and SegaCD
|
||||
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7fffff, read16_delegate(FUNC(base_md_cart_slot_device::read),(base_md_cart_slot_device*)m_slotcart), write16_delegate(FUNC(base_md_cart_slot_device::write),(base_md_cart_slot_device*)m_slotcart));
|
||||
@ -305,7 +285,16 @@ MACHINE_START_MEMBER(md_cons_state, ms_megadriv)
|
||||
m_maincpu->space(AS_PROGRAM).install_write_handler(0xa14000, 0xa14003, write16_delegate(FUNC(base_md_cart_slot_device::write_tmss_bank),(base_md_cart_slot_device*)m_slotcart));
|
||||
}
|
||||
|
||||
MACHINE_RESET_MEMBER(md_cons_state,ms_megadriv )
|
||||
MACHINE_START_MEMBER(md_cons_state, ms_megacd)
|
||||
{
|
||||
MACHINE_START_CALL_MEMBER( md_common );
|
||||
|
||||
// the segaCD introduces some kind of DMA 'lag', which we have to compensate for,
|
||||
// at least when reading wordram? we might need to check what mode we're in the DMA...
|
||||
m_vdp->set_dma_delay(2);
|
||||
}
|
||||
|
||||
MACHINE_RESET_MEMBER(md_cons_state, ms_megadriv)
|
||||
{
|
||||
m_maincpu->reset();
|
||||
MACHINE_RESET_CALL_MEMBER( megadriv );
|
||||
@ -314,8 +303,8 @@ MACHINE_RESET_MEMBER(md_cons_state,ms_megadriv )
|
||||
static MACHINE_CONFIG_START( ms_megadriv, md_cons_state )
|
||||
MCFG_FRAGMENT_ADD( md_ntsc )
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE( md_cons_state, ms_megadriv )
|
||||
MCFG_MACHINE_RESET_OVERRIDE( md_cons_state, ms_megadriv )
|
||||
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megadriv)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
|
||||
|
||||
MCFG_MD_CARTRIDGE_ADD("mdslot", md_cart, NULL)
|
||||
MCFG_SOFTWARE_LIST_ADD("cart_list","megadriv")
|
||||
@ -324,8 +313,8 @@ MACHINE_CONFIG_END
|
||||
static MACHINE_CONFIG_START( ms_megadpal, md_cons_state )
|
||||
MCFG_FRAGMENT_ADD( md_pal )
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE( md_cons_state, ms_megadriv )
|
||||
MCFG_MACHINE_RESET_OVERRIDE( md_cons_state, ms_megadriv )
|
||||
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megadriv)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
|
||||
|
||||
MCFG_MD_CARTRIDGE_ADD("mdslot", md_cart, NULL)
|
||||
MCFG_SOFTWARE_LIST_ADD("cart_list","megadriv")
|
||||
@ -453,8 +442,8 @@ void md_cons_state::_32x_scanline_helper_callback(int scanline)
|
||||
static MACHINE_CONFIG_START( genesis_32x, md_cons_state )
|
||||
MCFG_FRAGMENT_ADD( md_ntsc )
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE( md_cons_state, md_common )
|
||||
MCFG_MACHINE_RESET_OVERRIDE( md_cons_state, ms_megadriv )
|
||||
MCFG_MACHINE_START_OVERRIDE(md_cons_state, md_common)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
|
||||
|
||||
MCFG_DEVICE_MODIFY("gen_vdp")
|
||||
MCFG_SEGAGEN_VDP_32X_SCANLINE_CB(md_cons_state, _32x_scanline_callback);
|
||||
@ -492,8 +481,8 @@ MACHINE_CONFIG_END
|
||||
static MACHINE_CONFIG_START( mdj_32x, md_cons_state )
|
||||
MCFG_FRAGMENT_ADD( md_ntsc )
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE( md_cons_state, md_common )
|
||||
MCFG_MACHINE_RESET_OVERRIDE( md_cons_state, ms_megadriv )
|
||||
MCFG_MACHINE_START_OVERRIDE(md_cons_state, md_common)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
|
||||
|
||||
MCFG_DEVICE_MODIFY("gen_vdp")
|
||||
MCFG_SEGAGEN_VDP_32X_SCANLINE_CB(md_cons_state, _32x_scanline_callback);
|
||||
@ -531,8 +520,8 @@ MACHINE_CONFIG_END
|
||||
static MACHINE_CONFIG_START( md_32x, md_cons_state )
|
||||
MCFG_FRAGMENT_ADD( md_pal )
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE( md_cons_state, md_common )
|
||||
MCFG_MACHINE_RESET_OVERRIDE( md_cons_state, ms_megadriv )
|
||||
MCFG_MACHINE_START_OVERRIDE(md_cons_state, md_common)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
|
||||
|
||||
MCFG_DEVICE_MODIFY("gen_vdp")
|
||||
MCFG_SEGAGEN_VDP_32X_SCANLINE_CB(md_cons_state, _32x_scanline_callback);
|
||||
@ -609,8 +598,8 @@ struct cdrom_interface scd_cdrom =
|
||||
static MACHINE_CONFIG_START( genesis_scd, md_cons_state )
|
||||
MCFG_FRAGMENT_ADD( md_ntsc )
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE( md_cons_state, md_common )
|
||||
MCFG_MACHINE_RESET_OVERRIDE( md_cons_state, ms_megadriv )
|
||||
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megacd)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
|
||||
|
||||
MCFG_DEVICE_ADD("segacd", SEGA_SEGACD_US, 0)
|
||||
|
||||
@ -622,8 +611,8 @@ MACHINE_CONFIG_END
|
||||
static MACHINE_CONFIG_START( md_scd, md_cons_state )
|
||||
MCFG_FRAGMENT_ADD( md_pal )
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE( md_cons_state, md_common )
|
||||
MCFG_MACHINE_RESET_OVERRIDE( md_cons_state, ms_megadriv )
|
||||
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megacd)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
|
||||
|
||||
MCFG_DEVICE_ADD("segacd", SEGA_SEGACD_EUROPE, 0)
|
||||
|
||||
@ -635,8 +624,8 @@ MACHINE_CONFIG_END
|
||||
static MACHINE_CONFIG_START( mdj_scd, md_cons_state )
|
||||
MCFG_FRAGMENT_ADD( md_ntsc )
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE( md_cons_state, md_common )
|
||||
MCFG_MACHINE_RESET_OVERRIDE( md_cons_state, ms_megadriv )
|
||||
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megacd)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(md_cons_state, ms_megadriv)
|
||||
|
||||
MCFG_DEVICE_ADD("segacd", SEGA_SEGACD_JAPAN, 0)
|
||||
|
||||
@ -650,6 +639,8 @@ static MACHINE_CONFIG_DERIVED( genesis_32x_scd, genesis_32x )
|
||||
|
||||
MCFG_DEVICE_ADD("segacd", SEGA_SEGACD_US, 0)
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(md_cons_state, ms_megacd)
|
||||
|
||||
//MCFG_QUANTUM_PERFECT_CPU("32x_master_sh2")
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
@ -24,6 +24,7 @@ public:
|
||||
|
||||
DECLARE_MACHINE_START( md_common ); // setup ioport_port
|
||||
DECLARE_MACHINE_START( ms_megadriv ); // setup ioport_port + install cartslot handlers
|
||||
DECLARE_MACHINE_START( ms_megacd ); // setup ioport_port + dma delay for cd
|
||||
DECLARE_MACHINE_RESET( ms_megadriv );
|
||||
|
||||
void _32x_scanline_callback(int x, UINT32 priority, UINT16 &lineptr);
|
||||
|
Loading…
Reference in New Issue
Block a user