mirror of
https://github.com/holub/mame
synced 2025-07-01 16:19:38 +03:00
first attempt to use modern 315-5124 code for SMS games
in MegaTech, exploiting the parent class of the MegaDrive VDP class. please report regressions, if any.
This commit is contained in:
parent
814aa09a35
commit
ea77cb9af7
@ -569,13 +569,13 @@ MACHINE_RESET_MEMBER(mplay_state,megaplay)
|
|||||||
m_mp_bios_bank_addr = 0;
|
m_mp_bios_bank_addr = 0;
|
||||||
m_readpos = 1;
|
m_readpos = 1;
|
||||||
MACHINE_RESET_CALL_MEMBER(megadriv);
|
MACHINE_RESET_CALL_MEMBER(megadriv);
|
||||||
MACHINE_RESET_CALL_MEMBER(megatech_bios);
|
MACHINE_RESET_CALL_MEMBER(megaplay_bios);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mplay_state::screen_eof_megaplay(screen_device &screen, bool state)
|
void mplay_state::screen_eof_megaplay(screen_device &screen, bool state)
|
||||||
{
|
{
|
||||||
screen_eof_megadriv(screen,state);
|
screen_eof_megadriv(screen,state);
|
||||||
screen_eof_megatech_bios(screen,state);
|
screen_eof_megaplay_bios(screen,state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static MACHINE_CONFIG_START( megaplay, mplay_state )
|
static MACHINE_CONFIG_START( megaplay, mplay_state )
|
||||||
|
@ -202,7 +202,6 @@ static INPUT_PORTS_START( megatech ) /* Genesis Input Ports */
|
|||||||
PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
|
PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
|
||||||
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
|
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
|
||||||
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
|
||||||
|
|
||||||
INPUT_PORTS_END
|
INPUT_PORTS_END
|
||||||
|
|
||||||
/* MEGATECH specific */
|
/* MEGATECH specific */
|
||||||
@ -211,7 +210,6 @@ READ8_MEMBER(mtech_state::megatech_cart_select_r )
|
|||||||
return m_mt_cart_select_reg;
|
return m_mt_cart_select_reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void mtech_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
void mtech_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||||
{
|
{
|
||||||
switch (id)
|
switch (id)
|
||||||
@ -227,6 +225,118 @@ void mtech_state::device_timer(emu_timer &timer, device_timer_id id, int param,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
READ8_MEMBER(mtech_state::sms_count_r)
|
||||||
|
{
|
||||||
|
address_space &prg = machine().device("genesis_snd_z80")->memory().space(AS_PROGRAM);
|
||||||
|
if (offset & 0x01)
|
||||||
|
return m_vdp->hcount_read(prg, offset);
|
||||||
|
else
|
||||||
|
return m_vdp->vcount_read(prg, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* the SMS inputs should be more complex, like the megadrive ones */
|
||||||
|
READ8_MEMBER (mtech_state::sms_ioport_dc_r)
|
||||||
|
{
|
||||||
|
/* 2009-05 FP: would it be worth to give separate inputs to SMS? SMS has only 2 keys A,B (which are B,C on megadrive) */
|
||||||
|
/* bit 4: TL-A; bit 5: TR-A */
|
||||||
|
return (machine().root_device().ioport("PAD1")->read() & 0x3f) | ((machine().root_device().ioport("PAD2")->read() & 0x03) << 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
READ8_MEMBER (mtech_state::sms_ioport_dd_r)
|
||||||
|
{
|
||||||
|
/* 2009-05 FP: would it be worth to give separate inputs to SMS? SMS has only 2 keys A,B (which are B,C on megadrive) */
|
||||||
|
/* bit 2: TL-B; bit 3: TR-B; bit 4: RESET; bit 5: unused; bit 6: TH-A; bit 7: TH-B*/
|
||||||
|
return ((machine().root_device().ioport("PAD2")->read() & 0x3c) >> 2) | 0x10;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
WRITE8_MEMBER( mtech_state::mt_sms_standard_rom_bank_w )
|
||||||
|
{
|
||||||
|
int bank = data&0x1f;
|
||||||
|
//logerror("bank w %02x %02x\n", offset, data);
|
||||||
|
|
||||||
|
sms_mainram[0x1ffc+offset] = data;
|
||||||
|
switch (offset)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
logerror("bank w %02x %02x\n", offset, data);
|
||||||
|
space.install_rom(0x0000, 0xbfff, sms_rom);
|
||||||
|
space.unmap_write(0x0000, 0xbfff);
|
||||||
|
//printf("bank ram??\n");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
memcpy(sms_rom+0x0000, space.machine().root_device().memregion("maincpu")->base()+bank*0x4000, 0x4000);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
memcpy(sms_rom+0x4000, space.machine().root_device().memregion("maincpu")->base()+bank*0x4000, 0x4000);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
memcpy(sms_rom+0x8000, space.machine().root_device().memregion("maincpu")->base()+bank*0x4000, 0x4000);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void mtech_state::megatech_set_genz80_as_sms(const char* tag)
|
||||||
|
{
|
||||||
|
address_space &prg = machine().device(tag)->memory().space(AS_PROGRAM);
|
||||||
|
address_space &io = machine().device(tag)->memory().space(AS_IO);
|
||||||
|
sn76496_base_device *sn = machine().device<sn76496_base_device>("snsnd");
|
||||||
|
|
||||||
|
// main ram area
|
||||||
|
sms_mainram = (UINT8 *)prg.install_ram(0xc000, 0xdfff, 0, 0x2000);
|
||||||
|
memset(sms_mainram,0x00,0x2000);
|
||||||
|
|
||||||
|
// fixed rom bank area
|
||||||
|
sms_rom = (UINT8 *)prg.install_rom(0x0000, 0xbfff, NULL);
|
||||||
|
|
||||||
|
memcpy(sms_rom, machine().root_device().memregion("maincpu")->base(), 0xc000);
|
||||||
|
|
||||||
|
prg.install_write_handler(0xfffc, 0xffff, write8_delegate(FUNC(mtech_state::mt_sms_standard_rom_bank_w),this));
|
||||||
|
|
||||||
|
// ports
|
||||||
|
io.install_read_handler (0x40, 0x41, 0xff, 0x3e, read8_delegate(FUNC(mtech_state::sms_count_r),this));
|
||||||
|
io.install_write_handler (0x40, 0x41, 0xff, 0x3e, write8_delegate(FUNC(sn76496_device::write),sn));
|
||||||
|
io.install_readwrite_handler (0x80, 0x80, 0xff, 0x3e, read8_delegate(FUNC(sega315_5124_device::vram_read),(sega315_5124_device *)m_vdp), write8_delegate(FUNC(sega315_5124_device::vram_write),(sega315_5124_device *)m_vdp));
|
||||||
|
io.install_readwrite_handler (0x81, 0x81, 0xff, 0x3e, read8_delegate(FUNC(sega315_5124_device::register_read),(sega315_5124_device *)m_vdp), write8_delegate(FUNC(sega315_5124_device::register_write),(sega315_5124_device *)m_vdp));
|
||||||
|
|
||||||
|
io.install_read_handler (0x10, 0x10, read8_delegate(FUNC(mtech_state::sms_ioport_dd_r),this)); // super tetris
|
||||||
|
|
||||||
|
io.install_read_handler (0xdc, 0xdc, read8_delegate(FUNC(mtech_state::sms_ioport_dc_r),this));
|
||||||
|
io.install_read_handler (0xdd, 0xdd, read8_delegate(FUNC(mtech_state::sms_ioport_dd_r),this));
|
||||||
|
io.install_read_handler (0xde, 0xde, read8_delegate(FUNC(mtech_state::sms_ioport_dd_r),this));
|
||||||
|
io.install_read_handler (0xdf, 0xdf, read8_delegate(FUNC(mtech_state::sms_ioport_dd_r),this)); // adams family
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* sets the megadrive z80 to it's normal ports / map */
|
||||||
|
void mtech_state::megatech_set_genz80_as_md(const char* tag)
|
||||||
|
{
|
||||||
|
address_space &prg = machine().device(tag)->memory().space(AS_PROGRAM);
|
||||||
|
address_space &io = machine().device(tag)->memory().space(AS_IO);
|
||||||
|
ym2612_device *ym2612 = machine().device<ym2612_device>("ymsnd");
|
||||||
|
|
||||||
|
io.install_readwrite_handler(0x0000, 0xffff, read8_delegate(FUNC(mtech_state::z80_unmapped_port_r),this), write8_delegate(FUNC(mtech_state::z80_unmapped_port_w),this));
|
||||||
|
|
||||||
|
/* catch any addresses that don't get mapped */
|
||||||
|
prg.install_readwrite_handler(0x0000, 0xffff, read8_delegate(FUNC(mtech_state::z80_unmapped_r),this), write8_delegate(FUNC(mtech_state::z80_unmapped_w),this));
|
||||||
|
|
||||||
|
|
||||||
|
prg.install_readwrite_bank(0x0000, 0x1fff, "bank1");
|
||||||
|
machine().root_device().membank("bank1")->set_base(m_genz80.z80_prgram);
|
||||||
|
|
||||||
|
prg.install_ram(0x0000, 0x1fff, m_genz80.z80_prgram);
|
||||||
|
|
||||||
|
prg.install_readwrite_handler(0x4000, 0x4003, read8_delegate(FUNC(ym2612_device::read),ym2612), write8_delegate(FUNC(ym2612_device::write),ym2612));
|
||||||
|
prg.install_write_handler (0x6000, 0x6000, write8_delegate(FUNC(mtech_state::megadriv_z80_z80_bank_w),this));
|
||||||
|
prg.install_write_handler (0x6001, 0x6001, write8_delegate(FUNC(mtech_state::megadriv_z80_z80_bank_w),this));
|
||||||
|
prg.install_read_handler (0x6100, 0x7eff, read8_delegate(FUNC(mtech_state::megadriv_z80_unmapped_read),this));
|
||||||
|
prg.install_readwrite_handler(0x7f00, 0x7fff, read8_delegate(FUNC(mtech_state::megadriv_z80_vdp_read),this), write8_delegate(FUNC(mtech_state::megadriv_z80_vdp_write),this));
|
||||||
|
prg.install_readwrite_handler(0x8000, 0xffff, read8_delegate(FUNC(mtech_state::z80_read_68k_banked_data),this), write8_delegate(FUNC(mtech_state::z80_write_68k_banked_data),this));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TIMER_CALLBACK_MEMBER(mtech_state::megatech_z80_run_state )
|
TIMER_CALLBACK_MEMBER(mtech_state::megatech_z80_run_state )
|
||||||
{
|
{
|
||||||
@ -242,7 +352,7 @@ TIMER_CALLBACK_MEMBER(mtech_state::megatech_z80_run_state )
|
|||||||
{
|
{
|
||||||
printf("enabling SMS Z80\n");
|
printf("enabling SMS Z80\n");
|
||||||
m_current_game_is_sms = 1;
|
m_current_game_is_sms = 1;
|
||||||
megatech_set_genz80_as_sms_standard_map("genesis_snd_z80");
|
megatech_set_genz80_as_sms("genesis_snd_z80");
|
||||||
//m_z80snd->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
|
//m_z80snd->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
|
||||||
m_z80snd->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
|
m_z80snd->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
|
||||||
}
|
}
|
||||||
@ -250,7 +360,7 @@ TIMER_CALLBACK_MEMBER(mtech_state::megatech_z80_run_state )
|
|||||||
{
|
{
|
||||||
printf("disabling SMS Z80\n");
|
printf("disabling SMS Z80\n");
|
||||||
m_current_game_is_sms = 0;
|
m_current_game_is_sms = 0;
|
||||||
megatech_set_megadrive_z80_as_megadrive_z80("genesis_snd_z80");
|
megatech_set_genz80_as_md("genesis_snd_z80");
|
||||||
m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
|
m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
|
||||||
//m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
|
//m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
|
||||||
}
|
}
|
||||||
@ -273,8 +383,7 @@ TIMER_CALLBACK_MEMBER(mtech_state::megatech_z80_stop_state )
|
|||||||
machine().device("ymsnd")->reset();
|
machine().device("ymsnd")->reset();
|
||||||
|
|
||||||
megadriv_stop_scanline_timer();// stop the scanline timer for the genesis vdp... it can be restarted in video eof when needed
|
megadriv_stop_scanline_timer();// stop the scanline timer for the genesis vdp... it can be restarted in video eof when needed
|
||||||
megatech_sms_stop_scanline_timer();// stop the scanline timer for the sms vdp
|
m_vdp->reset();
|
||||||
|
|
||||||
|
|
||||||
/* if the regions exist we're fine */
|
/* if the regions exist we're fine */
|
||||||
if (game_region)
|
if (game_region)
|
||||||
@ -430,20 +539,14 @@ DRIVER_INIT_MEMBER(mtech_state,mt_crt)
|
|||||||
m_cart_is_genesis[0] = !pin[0] ? 1 : 0;;
|
m_cart_is_genesis[0] = !pin[0] ? 1 : 0;;
|
||||||
}
|
}
|
||||||
|
|
||||||
VIDEO_START_MEMBER(mtech_state,mtnew)
|
|
||||||
{
|
|
||||||
init_for_megadrive(); // create an sms vdp too, for compatibility mode
|
|
||||||
VIDEO_START_CALL_MEMBER(megadriv);
|
|
||||||
}
|
|
||||||
|
|
||||||
//attotime::never
|
|
||||||
UINT32 mtech_state::screen_update_mtnew(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
UINT32 mtech_state::screen_update_mtnew(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
/* if we're running an sms game then use the SMS update.. maybe this should be moved to the megadrive emulation core as compatibility mode is a feature of the chip */
|
/* if we're running an sms game then use the SMS update.. maybe this should be moved to the megadrive emulation core as compatibility mode is a feature of the chip */
|
||||||
if (!m_current_game_is_sms)
|
if (!m_current_game_is_sms)
|
||||||
screen_update_megadriv(screen, bitmap, cliprect);
|
screen_update_megadriv(screen, bitmap, cliprect);
|
||||||
else
|
else
|
||||||
screen_update_megatech_sms(screen, bitmap, cliprect);
|
m_vdp->screen_update(screen, bitmap, cliprect);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -451,16 +554,12 @@ void mtech_state::screen_eof_mtnew(screen_device &screen, bool state)
|
|||||||
{
|
{
|
||||||
if (!m_current_game_is_sms)
|
if (!m_current_game_is_sms)
|
||||||
screen_eof_megadriv(screen, state);
|
screen_eof_megadriv(screen, state);
|
||||||
else
|
|
||||||
screen_eof_megatech_md_sms(screen, state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_RESET_MEMBER(mtech_state,mtnew)
|
MACHINE_RESET_MEMBER(mtech_state,mtnew)
|
||||||
{
|
{
|
||||||
m_mt_bank_addr = 0;
|
m_mt_bank_addr = 0;
|
||||||
|
|
||||||
MACHINE_RESET_CALL_MEMBER(megadriv);
|
MACHINE_RESET_CALL_MEMBER(megadriv);
|
||||||
MACHINE_RESET_CALL_MEMBER(megatech_md_sms);
|
|
||||||
megatech_select_game(0);
|
megatech_select_game(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -472,16 +571,28 @@ UINT32 mtech_state::screen_update_megatech_menu(screen_device &screen, bitmap_rg
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
WRITE_LINE_MEMBER( mtech_state::int_callback )
|
WRITE_LINE_MEMBER( mtech_state::bios_int_callback )
|
||||||
{
|
{
|
||||||
m_bioscpu->set_input_line(0, state);
|
m_bioscpu->set_input_line(0, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const sega315_5124_interface bios_vdp_intf =
|
||||||
static const sega315_5124_interface _vdp_intf =
|
|
||||||
{
|
{
|
||||||
false,
|
false,
|
||||||
DEVCB_DRIVER_LINE_MEMBER(mtech_state, int_callback),
|
DEVCB_DRIVER_LINE_MEMBER(mtech_state, bios_int_callback),
|
||||||
|
DEVCB_NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER( mtech_state::snd_int_callback )
|
||||||
|
{
|
||||||
|
m_z80snd->set_input_line(0, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const sega315_5124_interface main_vdp_intf =
|
||||||
|
{
|
||||||
|
false,
|
||||||
|
DEVCB_DRIVER_LINE_MEMBER(mtech_state, snd_int_callback),
|
||||||
DEVCB_NULL,
|
DEVCB_NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -497,10 +608,23 @@ static MACHINE_CONFIG_START( megatech, mtech_state )
|
|||||||
|
|
||||||
MCFG_MACHINE_RESET_OVERRIDE(mtech_state,mtnew)
|
MCFG_MACHINE_RESET_OVERRIDE(mtech_state,mtnew)
|
||||||
|
|
||||||
MCFG_VIDEO_START_OVERRIDE(mtech_state,mtnew)
|
|
||||||
|
|
||||||
MCFG_DEFAULT_LAYOUT(layout_dualhovu)
|
MCFG_DEFAULT_LAYOUT(layout_dualhovu)
|
||||||
|
|
||||||
|
MCFG_SCREEN_MODIFY("megadriv")
|
||||||
|
MCFG_SCREEN_RAW_PARAMS(XTAL_10_738635MHz/2, \
|
||||||
|
SEGA315_5124_WIDTH , SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256, \
|
||||||
|
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT + 224)
|
||||||
|
MCFG_SCREEN_UPDATE_DRIVER(mtech_state, screen_update_mtnew)
|
||||||
|
MCFG_SCREEN_VBLANK_DRIVER(mtech_state, screen_eof_mtnew)
|
||||||
|
|
||||||
|
MCFG_DEVICE_REMOVE("gen_vdp")
|
||||||
|
MCFG_DEVICE_ADD("gen_vdp", SEGA_GEN_VDP, 0)
|
||||||
|
MCFG_DEVICE_CONFIG( main_vdp_intf )
|
||||||
|
MCFG_VIDEO_SET_SCREEN("megadriv")
|
||||||
|
sega_genesis_vdp_device::set_genesis_vdp_sndirqline_callback(*device, DEVCB2_WRITELINE(md_base_state, genesis_vdp_sndirqline_callback_genesis_z80));
|
||||||
|
sega_genesis_vdp_device::set_genesis_vdp_lv6irqline_callback(*device, DEVCB2_WRITELINE(md_base_state, genesis_vdp_lv6irqline_callback_genesis_68k));
|
||||||
|
sega_genesis_vdp_device::set_genesis_vdp_lv4irqline_callback(*device, DEVCB2_WRITELINE(md_base_state, genesis_vdp_lv4irqline_callback_genesis_68k));
|
||||||
|
|
||||||
MCFG_SCREEN_ADD("menu", RASTER)
|
MCFG_SCREEN_ADD("menu", RASTER)
|
||||||
// check frq
|
// check frq
|
||||||
MCFG_SCREEN_RAW_PARAMS(XTAL_10_738635MHz/2, \
|
MCFG_SCREEN_RAW_PARAMS(XTAL_10_738635MHz/2, \
|
||||||
@ -508,14 +632,9 @@ static MACHINE_CONFIG_START( megatech, mtech_state )
|
|||||||
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT + 224)
|
SEGA315_5124_HEIGHT_NTSC, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT, SEGA315_5124_TBORDER_START + SEGA315_5124_NTSC_224_TBORDER_HEIGHT + 224)
|
||||||
MCFG_SCREEN_UPDATE_DRIVER(mtech_state, screen_update_megatech_menu)
|
MCFG_SCREEN_UPDATE_DRIVER(mtech_state, screen_update_megatech_menu)
|
||||||
|
|
||||||
MCFG_SEGA315_5246_ADD("vdp1", _vdp_intf)
|
MCFG_SEGA315_5246_ADD("vdp1", bios_vdp_intf)
|
||||||
MCFG_SEGA315_5246_SET_SCREEN("menu")
|
MCFG_SEGA315_5246_SET_SCREEN("menu")
|
||||||
|
|
||||||
|
|
||||||
MCFG_SCREEN_MODIFY("megadriv")
|
|
||||||
MCFG_SCREEN_UPDATE_DRIVER(mtech_state, screen_update_mtnew)
|
|
||||||
MCFG_SCREEN_VBLANK_DRIVER(mtech_state, screen_eof_mtnew)
|
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
MCFG_SOUND_ADD("sn2", SN76496, MASTER_CLOCK/15)
|
MCFG_SOUND_ADD("sn2", SN76496, MASTER_CLOCK/15)
|
||||||
MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
|
MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
|
||||||
|
@ -338,10 +338,8 @@ public:
|
|||||||
UINT32 screen_update_megaplay_bios(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
UINT32 screen_update_megaplay_bios(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||||
UINT32 screen_update_megatech_sms(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
UINT32 screen_update_megatech_sms(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||||
void init_megaplay_legacy_overlay();
|
void init_megaplay_legacy_overlay();
|
||||||
DECLARE_MACHINE_RESET(megatech_bios);
|
DECLARE_MACHINE_RESET(megaplay_bios);
|
||||||
DECLARE_MACHINE_RESET(megatech_md_sms);
|
void screen_eof_megaplay_bios(screen_device &screen, bool state);
|
||||||
void screen_eof_megatech_bios(screen_device &screen, bool state);
|
|
||||||
void screen_eof_megatech_md_sms(screen_device &screen, bool state);
|
|
||||||
|
|
||||||
DECLARE_READ8_MEMBER( sms_vcounter_r );
|
DECLARE_READ8_MEMBER( sms_vcounter_r );
|
||||||
DECLARE_READ8_MEMBER( sms_vdp_data_r );
|
DECLARE_READ8_MEMBER( sms_vdp_data_r );
|
||||||
@ -349,17 +347,12 @@ public:
|
|||||||
DECLARE_READ8_MEMBER( sms_vdp_ctrl_r );
|
DECLARE_READ8_MEMBER( sms_vdp_ctrl_r );
|
||||||
DECLARE_WRITE8_MEMBER( sms_vdp_ctrl_w );
|
DECLARE_WRITE8_MEMBER( sms_vdp_ctrl_w );
|
||||||
|
|
||||||
void init_for_megadrive();
|
|
||||||
void megatech_sms_stop_scanline_timer();
|
|
||||||
void megatech_set_genz80_as_sms_standard_map(const char* tag);
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
UINT8* vdp1_vram_bank0;
|
UINT8* vdp1_vram_bank0;
|
||||||
UINT8* vdp1_vram_bank1;
|
UINT8* vdp1_vram_bank1;
|
||||||
UINT8* sms_mainram;
|
|
||||||
struct sms_vdp *vdp1;
|
struct sms_vdp *vdp1;
|
||||||
struct sms_vdp *md_sms_vdp;
|
struct sms_vdp *md_sms_vdp;
|
||||||
UINT8* sms_rom;
|
|
||||||
|
|
||||||
static int sms_vdp_null_irq_callback(running_machine &machine, int status);
|
static int sms_vdp_null_irq_callback(running_machine &machine, int status);
|
||||||
static int sms_vdp_cpu1_irq_callback(running_machine &machine, int status);
|
static int sms_vdp_cpu1_irq_callback(running_machine &machine, int status);
|
||||||
@ -380,20 +373,10 @@ private:
|
|||||||
TIMER_CALLBACK_MEMBER( sms_scanline_timer_callback );
|
TIMER_CALLBACK_MEMBER( sms_scanline_timer_callback );
|
||||||
void end_of_frame(screen_device &screen, struct sms_vdp *chip);
|
void end_of_frame(screen_device &screen, struct sms_vdp *chip);
|
||||||
|
|
||||||
READ8_MEMBER(md_sms_vdp_vcounter_r );
|
|
||||||
READ8_MEMBER(md_sms_vdp_data_r );
|
|
||||||
WRITE8_MEMBER(md_sms_vdp_data_w );
|
|
||||||
READ8_MEMBER(md_sms_vdp_ctrl_r );
|
|
||||||
WRITE8_MEMBER(md_sms_vdp_ctrl_w );
|
|
||||||
READ8_MEMBER( sms_z80_unmapped_port_r );
|
READ8_MEMBER( sms_z80_unmapped_port_r );
|
||||||
WRITE8_MEMBER( sms_z80_unmapped_port_w );
|
WRITE8_MEMBER( sms_z80_unmapped_port_w );
|
||||||
READ8_MEMBER(sms_z80_unmapped_r );
|
READ8_MEMBER(sms_z80_unmapped_r );
|
||||||
WRITE8_MEMBER( sms_z80_unmapped_w );
|
WRITE8_MEMBER( sms_z80_unmapped_w );
|
||||||
READ8_MEMBER (megatech_sms_ioport_dc_r);
|
|
||||||
READ8_MEMBER (megatech_sms_ioport_dd_r);
|
|
||||||
WRITE8_MEMBER( mt_sms_standard_rom_bank_w );
|
|
||||||
void megatech_set_genz80_as_sms_standard_ports(const char* tag);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -405,8 +388,6 @@ public:
|
|||||||
m_ic3_ram(*this, "ic3_ram"),
|
m_ic3_ram(*this, "ic3_ram"),
|
||||||
m_vdp1(*this, "vdp1"),
|
m_vdp1(*this, "vdp1"),
|
||||||
m_bioscpu(*this, "mtbios")
|
m_bioscpu(*this, "mtbios")
|
||||||
|
|
||||||
|
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
UINT32 m_bios_mode; // determines whether ROM banks or Game data
|
UINT32 m_bios_mode; // determines whether ROM banks or Game data
|
||||||
@ -479,8 +460,8 @@ public:
|
|||||||
required_device<cpu_device> m_bioscpu;
|
required_device<cpu_device> m_bioscpu;
|
||||||
|
|
||||||
|
|
||||||
DECLARE_WRITE_LINE_MEMBER( int_callback );
|
DECLARE_WRITE_LINE_MEMBER( snd_int_callback );
|
||||||
|
DECLARE_WRITE_LINE_MEMBER( bios_int_callback );
|
||||||
|
|
||||||
UINT8 m_mt_cart_select_reg;
|
UINT8 m_mt_cart_select_reg;
|
||||||
UINT32 m_bios_port_ctrl;
|
UINT32 m_bios_port_ctrl;
|
||||||
@ -504,7 +485,9 @@ public:
|
|||||||
void screen_eof_mtnew(screen_device &screen, bool state);
|
void screen_eof_mtnew(screen_device &screen, bool state);
|
||||||
UINT32 screen_update_megatech_menu(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
UINT32 screen_update_megatech_menu(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||||
|
|
||||||
void megatech_set_megadrive_z80_as_megadrive_z80(const char* tag);
|
void megatech_set_genz80_as_md(const char* tag);
|
||||||
|
void megatech_set_genz80_as_sms(const char* tag);
|
||||||
|
UINT32 screen_update_megatech_sms2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||||
|
|
||||||
DECLARE_READ8_MEMBER( megatech_cart_select_r );
|
DECLARE_READ8_MEMBER( megatech_cart_select_r );
|
||||||
TIMER_CALLBACK_MEMBER( megatech_z80_run_state );
|
TIMER_CALLBACK_MEMBER( megatech_z80_run_state );
|
||||||
@ -521,8 +504,16 @@ public:
|
|||||||
DECLARE_WRITE8_MEMBER( megatech_bios_port_ctrl_w );
|
DECLARE_WRITE8_MEMBER( megatech_bios_port_ctrl_w );
|
||||||
DECLARE_READ8_MEMBER( megatech_bios_joypad_r );
|
DECLARE_READ8_MEMBER( megatech_bios_joypad_r );
|
||||||
DECLARE_WRITE8_MEMBER (megatech_bios_port_7f_w);
|
DECLARE_WRITE8_MEMBER (megatech_bios_port_7f_w);
|
||||||
|
READ8_MEMBER(sms_count_r);
|
||||||
|
READ8_MEMBER(sms_ioport_dc_r);
|
||||||
|
READ8_MEMBER(sms_ioport_dd_r);
|
||||||
|
WRITE8_MEMBER(mt_sms_standard_rom_bank_w);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
|
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
|
||||||
|
|
||||||
|
UINT8* sms_mainram;
|
||||||
|
UINT8* sms_rom;
|
||||||
};
|
};
|
||||||
|
|
||||||
class _32x_state : public md_base_state
|
class _32x_state : public md_base_state
|
||||||
|
@ -1059,8 +1059,6 @@ MACHINE_CONFIG_FRAGMENT( md_pal )
|
|||||||
MCFG_SCREEN_UPDATE_DRIVER(md_base_state,screen_update_megadriv) /* Copies a bitmap */
|
MCFG_SCREEN_UPDATE_DRIVER(md_base_state,screen_update_megadriv) /* Copies a bitmap */
|
||||||
MCFG_SCREEN_VBLANK_DRIVER(md_base_state,screen_eof_megadriv) /* Used to Sync the timing */
|
MCFG_SCREEN_VBLANK_DRIVER(md_base_state,screen_eof_megadriv) /* Used to Sync the timing */
|
||||||
|
|
||||||
MCFG_PALETTE_ADD("palette", 0x200)
|
|
||||||
|
|
||||||
MCFG_VIDEO_START_OVERRIDE(md_base_state,megadriv)
|
MCFG_VIDEO_START_OVERRIDE(md_base_state,megadriv)
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
@ -1246,34 +1244,6 @@ WRITE8_MEMBER(md_base_state::z80_unmapped_w )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* sets the megadrive z80 to it's normal ports / map */
|
|
||||||
void mtech_state::megatech_set_megadrive_z80_as_megadrive_z80(const char* tag)
|
|
||||||
{
|
|
||||||
ym2612_device *ym2612 = machine().device<ym2612_device>("ymsnd");
|
|
||||||
|
|
||||||
/* INIT THE PORTS *********************************************************************************************/
|
|
||||||
machine().device(tag)->memory().space(AS_IO).install_readwrite_handler(0x0000, 0xffff, read8_delegate(FUNC(mtech_state::z80_unmapped_port_r),this), write8_delegate(FUNC(mtech_state::z80_unmapped_port_w),this));
|
|
||||||
|
|
||||||
/* catch any addresses that don't get mapped */
|
|
||||||
machine().device(tag)->memory().space(AS_PROGRAM).install_readwrite_handler(0x0000, 0xffff, read8_delegate(FUNC(mtech_state::z80_unmapped_r),this), write8_delegate(FUNC(mtech_state::z80_unmapped_w),this));
|
|
||||||
|
|
||||||
|
|
||||||
machine().device(tag)->memory().space(AS_PROGRAM).install_readwrite_bank(0x0000, 0x1fff, "bank1");
|
|
||||||
machine().root_device().membank("bank1")->set_base(m_genz80.z80_prgram);
|
|
||||||
|
|
||||||
machine().device(tag)->memory().space(AS_PROGRAM).install_ram(0x0000, 0x1fff, m_genz80.z80_prgram);
|
|
||||||
|
|
||||||
|
|
||||||
machine().device(tag)->memory().space(AS_PROGRAM).install_readwrite_handler(0x4000, 0x4003, read8_delegate(FUNC(ym2612_device::read),ym2612), write8_delegate(FUNC(ym2612_device::write),ym2612));
|
|
||||||
machine().device(tag)->memory().space(AS_PROGRAM).install_write_handler (0x6000, 0x6000, write8_delegate(FUNC(mtech_state::megadriv_z80_z80_bank_w),this));
|
|
||||||
machine().device(tag)->memory().space(AS_PROGRAM).install_write_handler (0x6001, 0x6001, write8_delegate(FUNC(mtech_state::megadriv_z80_z80_bank_w),this));
|
|
||||||
machine().device(tag)->memory().space(AS_PROGRAM).install_read_handler (0x6100, 0x7eff, read8_delegate(FUNC(mtech_state::megadriv_z80_unmapped_read),this));
|
|
||||||
machine().device(tag)->memory().space(AS_PROGRAM).install_readwrite_handler(0x7f00, 0x7fff, read8_delegate(FUNC(mtech_state::megadriv_z80_vdp_read),this), write8_delegate(FUNC(mtech_state::megadriv_z80_vdp_write),this));
|
|
||||||
machine().device(tag)->memory().space(AS_PROGRAM).install_readwrite_handler(0x8000, 0xffff, read8_delegate(FUNC(mtech_state::z80_read_68k_banked_data),this), write8_delegate(FUNC(mtech_state::z80_write_68k_banked_data),this));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void md_base_state::screen_eof_megadriv(screen_device &screen, bool state)
|
void md_base_state::screen_eof_megadriv(screen_device &screen, bool state)
|
||||||
{
|
{
|
||||||
|
@ -27,7 +27,7 @@ sega_genesis_vdp_device::sega_genesis_vdp_device(const machine_config &mconfig,
|
|||||||
{
|
{
|
||||||
m_use_alt_timing = 0;
|
m_use_alt_timing = 0;
|
||||||
m_palwrite_base = -1;
|
m_palwrite_base = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
// static_set_palette_tag: Set the tag of the
|
// static_set_palette_tag: Set the tag of the
|
||||||
@ -42,6 +42,7 @@ void sega_genesis_vdp_device::static_set_palette_tag(device_t &device, const cha
|
|||||||
|
|
||||||
static MACHINE_CONFIG_FRAGMENT( sega_genesis_vdp )
|
static MACHINE_CONFIG_FRAGMENT( sega_genesis_vdp )
|
||||||
MCFG_PALETTE_ADD("palette", 0x200)
|
MCFG_PALETTE_ADD("palette", 0x200)
|
||||||
|
MCFG_PALETTE_INIT_OWNER(sega315_5124_device, sega315_5124)
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
@ -188,6 +189,8 @@ void sega_genesis_vdp_device::device_start()
|
|||||||
|
|
||||||
m_space68k = &machine().device<m68000_base_device>(":maincpu")->space();
|
m_space68k = &machine().device<m68000_base_device>(":maincpu")->space();
|
||||||
m_cpu68k = machine().device<m68000_base_device>(":maincpu");
|
m_cpu68k = machine().device<m68000_base_device>(":maincpu");
|
||||||
|
|
||||||
|
sega315_5124_device::device_start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void sega_genesis_vdp_device::device_reset()
|
void sega_genesis_vdp_device::device_reset()
|
||||||
@ -206,6 +209,8 @@ void sega_genesis_vdp_device::device_reset()
|
|||||||
megadrive_irq6_pending = 0;
|
megadrive_irq6_pending = 0;
|
||||||
megadrive_irq4_pending = 0;
|
megadrive_irq4_pending = 0;
|
||||||
m_scanline_counter = 0;
|
m_scanline_counter = 0;
|
||||||
|
|
||||||
|
sega315_5124_device::device_reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void sega_genesis_vdp_device::device_reset_old()
|
void sega_genesis_vdp_device::device_reset_old()
|
||||||
@ -220,8 +225,6 @@ void sega_genesis_vdp_device::device_reset_old()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void sega_genesis_vdp_device::vdp_vram_write(UINT16 data)
|
void sega_genesis_vdp_device::vdp_vram_write(UINT16 data)
|
||||||
{
|
{
|
||||||
UINT16 sprite_base_address = MEGADRIVE_REG0C_RS1?((MEGADRIVE_REG05_SPRITE_ADDR&0x7e)<<9):((MEGADRIVE_REG05_SPRITE_ADDR&0x7f)<<9);
|
UINT16 sprite_base_address = MEGADRIVE_REG0C_RS1?((MEGADRIVE_REG05_SPRITE_ADDR&0x7e)<<9):((MEGADRIVE_REG05_SPRITE_ADDR&0x7f)<<9);
|
||||||
|
@ -171,7 +171,6 @@ public:
|
|||||||
|
|
||||||
int genesis_get_scanline_counter();
|
int genesis_get_scanline_counter();
|
||||||
|
|
||||||
|
|
||||||
void genesis_render_scanline();
|
void genesis_render_scanline();
|
||||||
void vdp_handle_scanline_callback(int scanline);
|
void vdp_handle_scanline_callback(int scanline);
|
||||||
void vdp_handle_irq6_on_timer_callback(int param);
|
void vdp_handle_irq6_on_timer_callback(int param);
|
||||||
|
@ -319,13 +319,6 @@ void *segamsys_state::start_vdp(int type)
|
|||||||
return chip;
|
return chip;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* stop timer and clear ram.. used on megatech when we switch between genesis and sms mode */
|
|
||||||
void segamsys_state::megatech_sms_stop_scanline_timer()
|
|
||||||
{
|
|
||||||
md_sms_vdp->sms_scanline_timer->adjust(attotime::never);
|
|
||||||
memset(md_sms_vdp->vram,0x00,0x4000);
|
|
||||||
}
|
|
||||||
|
|
||||||
UINT8 segamsys_state::vcounter_r(struct sms_vdp *chip)
|
UINT8 segamsys_state::vcounter_r(struct sms_vdp *chip)
|
||||||
{
|
{
|
||||||
// return vc_pal_224[sms_scanline_counter%(sizeof vc_pal_224)];
|
// return vc_pal_224[sms_scanline_counter%(sizeof vc_pal_224)];
|
||||||
@ -482,34 +475,6 @@ void segamsys_state::vdp_ctrl_w(address_space &space, UINT8 data, struct sms_vdp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* for the Genesis */
|
|
||||||
|
|
||||||
READ8_MEMBER(segamsys_state::md_sms_vdp_vcounter_r )
|
|
||||||
{
|
|
||||||
return vcounter_r(md_sms_vdp);
|
|
||||||
}
|
|
||||||
|
|
||||||
READ8_MEMBER(segamsys_state::md_sms_vdp_data_r )
|
|
||||||
{
|
|
||||||
return vdp_data_r(md_sms_vdp);
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE8_MEMBER(segamsys_state::md_sms_vdp_data_w )
|
|
||||||
{
|
|
||||||
vdp_data_w(space, data, md_sms_vdp);
|
|
||||||
}
|
|
||||||
|
|
||||||
READ8_MEMBER(segamsys_state::md_sms_vdp_ctrl_r )
|
|
||||||
{
|
|
||||||
return vdp_ctrl_r(space, md_sms_vdp);
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE8_MEMBER(segamsys_state::md_sms_vdp_ctrl_w )
|
|
||||||
{
|
|
||||||
vdp_ctrl_w(space, data, md_sms_vdp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Read / Write Handlers - call other functions */
|
/* Read / Write Handlers - call other functions */
|
||||||
|
|
||||||
READ8_MEMBER(segamsys_state::sms_vcounter_r )
|
READ8_MEMBER(segamsys_state::sms_vcounter_r )
|
||||||
@ -949,50 +914,19 @@ void segamsys_state::end_of_frame(screen_device &screen, struct sms_vdp *chip)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MACHINE_RESET_MEMBER(segamsys_state,megatech_md_sms)
|
MACHINE_RESET_MEMBER(segamsys_state, megaplay_bios)
|
||||||
{
|
|
||||||
md_sms_vdp->sms_scanline_timer->adjust(attotime::zero);
|
|
||||||
}
|
|
||||||
|
|
||||||
MACHINE_RESET_MEMBER(segamsys_state,megatech_bios)
|
|
||||||
{
|
{
|
||||||
vdp1->sms_scanline_timer->adjust(attotime::zero);
|
vdp1->sms_scanline_timer->adjust(attotime::zero);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void segamsys_state::screen_eof_megatech_md_sms(screen_device &screen, bool state)
|
void segamsys_state::screen_eof_megaplay_bios(screen_device &screen, bool state)
|
||||||
{
|
|
||||||
// rising edge
|
|
||||||
if (state)
|
|
||||||
end_of_frame(screen, md_sms_vdp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void segamsys_state::screen_eof_megatech_bios(screen_device &screen, bool state)
|
|
||||||
{
|
{
|
||||||
// rising edge
|
// rising edge
|
||||||
if (state)
|
if (state)
|
||||||
end_of_frame(screen, vdp1);
|
end_of_frame(screen, vdp1);
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT32 segamsys_state::screen_update_megatech_sms(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
|
||||||
{
|
|
||||||
int x,y;
|
|
||||||
|
|
||||||
for (y=0;y<224;y++)
|
|
||||||
{
|
|
||||||
UINT32* lineptr = &bitmap.pix32(y);
|
|
||||||
UINT32* srcptr = &md_sms_vdp->r_bitmap->pix32(y);
|
|
||||||
|
|
||||||
for (x=0;x<256;x++)
|
|
||||||
{
|
|
||||||
lineptr[x]=srcptr[x];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
UINT32 segamsys_state::screen_update_megaplay_bios(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
UINT32 segamsys_state::screen_update_megaplay_bios(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
int x,y;
|
int x,y;
|
||||||
@ -1014,19 +948,6 @@ UINT32 segamsys_state::screen_update_megaplay_bios(screen_device &screen, bitmap
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void segamsys_state::init_for_megadrive()
|
|
||||||
{
|
|
||||||
md_sms_vdp = (struct sms_vdp *)start_vdp(GEN_VDP);
|
|
||||||
md_sms_vdp->set_irq = segamsys_state::sms_vdp_cpu1_irq_callback;
|
|
||||||
md_sms_vdp->is_pal = 0;
|
|
||||||
md_sms_vdp->sms_total_scanlines = 262;
|
|
||||||
md_sms_vdp->sms_framerate = 60;
|
|
||||||
md_sms_vdp->chip_id = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void segamsys_state::init_megaplay_legacy_overlay()
|
void segamsys_state::init_megaplay_legacy_overlay()
|
||||||
{
|
{
|
||||||
vdp1 = (struct sms_vdp *)start_vdp(SMS2_VDP);
|
vdp1 = (struct sms_vdp *)start_vdp(SMS2_VDP);
|
||||||
@ -1040,119 +961,3 @@ void segamsys_state::init_megaplay_legacy_overlay()
|
|||||||
vdp1_vram_bank1 = auto_alloc_array(machine(), UINT8, 0x4000);
|
vdp1_vram_bank1 = auto_alloc_array(machine(), UINT8, 0x4000);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Functions to set up the Memory Map
|
|
||||||
|
|
||||||
-- these are needed because on a Genesis the Sound Z80 becomes the SMS Z80 in comptibility mode
|
|
||||||
so we need to be able to dynamically change the mapping
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
READ8_MEMBER( segamsys_state::sms_z80_unmapped_port_r )
|
|
||||||
{
|
|
||||||
// printf("unmapped z80 port read %04x\n",offset);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE8_MEMBER( segamsys_state::sms_z80_unmapped_port_w )
|
|
||||||
{
|
|
||||||
// printf("unmapped z80 port write %04x\n",offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
READ8_MEMBER( segamsys_state::sms_z80_unmapped_r )
|
|
||||||
{
|
|
||||||
printf("unmapped z80 read %04x\n",offset);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE8_MEMBER( segamsys_state::sms_z80_unmapped_w )
|
|
||||||
{
|
|
||||||
printf("unmapped z80 write %04x\n",offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* the SMS inputs should be more complex, like the megadrive ones */
|
|
||||||
READ8_MEMBER (segamsys_state::megatech_sms_ioport_dc_r)
|
|
||||||
{
|
|
||||||
/* 2009-05 FP: would it be worth to give separate inputs to SMS? SMS has only 2 keys A,B (which are B,C on megadrive) */
|
|
||||||
/* bit 4: TL-A; bit 5: TR-A */
|
|
||||||
return (machine().root_device().ioport("PAD1")->read() & 0x3f) | ((machine().root_device().ioport("PAD2")->read() & 0x03) << 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
READ8_MEMBER (segamsys_state::megatech_sms_ioport_dd_r)
|
|
||||||
{
|
|
||||||
/* 2009-05 FP: would it be worth to give separate inputs to SMS? SMS has only 2 keys A,B (which are B,C on megadrive) */
|
|
||||||
/* bit 2: TL-B; bit 3: TR-B; bit 4: RESET; bit 5: unused; bit 6: TH-A; bit 7: TH-B*/
|
|
||||||
return ((machine().root_device().ioport("PAD2")->read() & 0x3c) >> 2) | 0x10;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
WRITE8_MEMBER( segamsys_state::mt_sms_standard_rom_bank_w )
|
|
||||||
{
|
|
||||||
int bank = data&0x1f;
|
|
||||||
//logerror("bank w %02x %02x\n", offset, data);
|
|
||||||
|
|
||||||
sms_mainram[0x1ffc+offset] = data;
|
|
||||||
switch (offset)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
logerror("bank w %02x %02x\n", offset, data);
|
|
||||||
space.install_rom(0x0000, 0xbfff, sms_rom);
|
|
||||||
space.unmap_write(0x0000, 0xbfff);
|
|
||||||
//printf("bank ram??\n");
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
memcpy(sms_rom+0x0000, space.machine().root_device().memregion("maincpu")->base()+bank*0x4000, 0x4000);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
memcpy(sms_rom+0x4000, space.machine().root_device().memregion("maincpu")->base()+bank*0x4000, 0x4000);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
memcpy(sms_rom+0x8000, space.machine().root_device().memregion("maincpu")->base()+bank*0x4000, 0x4000);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void segamsys_state::megatech_set_genz80_as_sms_standard_ports(const char* tag)
|
|
||||||
{
|
|
||||||
/* INIT THE PORTS *********************************************************************************************/
|
|
||||||
|
|
||||||
address_space &io = machine().device(tag)->memory().space(AS_IO);
|
|
||||||
sn76496_base_device *sn = machine().device<sn76496_base_device>("snsnd");
|
|
||||||
|
|
||||||
io.install_readwrite_handler(0x0000, 0xffff, read8_delegate(FUNC(segamsys_state::z80_unmapped_port_r),this), write8_delegate(FUNC(segamsys_state::sms_z80_unmapped_port_w),this));
|
|
||||||
|
|
||||||
io.install_read_handler (0x7e, 0x7e, read8_delegate(FUNC(segamsys_state::md_sms_vdp_vcounter_r),this));
|
|
||||||
io.install_write_handler (0x7e, 0x7f, write8_delegate(FUNC(sn76496_device::write),sn));
|
|
||||||
io.install_readwrite_handler (0xbe, 0xbe, read8_delegate(FUNC(segamsys_state::md_sms_vdp_data_r),this), write8_delegate(FUNC(segamsys_state::md_sms_vdp_data_w),this));
|
|
||||||
io.install_readwrite_handler (0xbf, 0xbf, read8_delegate(FUNC(segamsys_state::md_sms_vdp_ctrl_r),this), write8_delegate(FUNC(segamsys_state::md_sms_vdp_ctrl_w),this));
|
|
||||||
|
|
||||||
io.install_read_handler (0x10, 0x10, read8_delegate(FUNC(segamsys_state::megatech_sms_ioport_dd_r),this)); // super tetris
|
|
||||||
|
|
||||||
io.install_read_handler (0xdc, 0xdc, read8_delegate(FUNC(segamsys_state::megatech_sms_ioport_dc_r),this));
|
|
||||||
io.install_read_handler (0xdd, 0xdd, read8_delegate(FUNC(segamsys_state::megatech_sms_ioport_dd_r),this));
|
|
||||||
io.install_read_handler (0xde, 0xde, read8_delegate(FUNC(segamsys_state::megatech_sms_ioport_dd_r),this));
|
|
||||||
io.install_read_handler (0xdf, 0xdf, read8_delegate(FUNC(segamsys_state::megatech_sms_ioport_dd_r),this)); // adams family
|
|
||||||
}
|
|
||||||
|
|
||||||
void segamsys_state::megatech_set_genz80_as_sms_standard_map(const char* tag)
|
|
||||||
{
|
|
||||||
/* INIT THE MEMMAP / BANKING *********************************************************************************/
|
|
||||||
|
|
||||||
/* catch any addresses that don't get mapped */
|
|
||||||
machine().device(tag)->memory().space(AS_PROGRAM).install_readwrite_handler(0x0000, 0xffff, read8_delegate(FUNC(segamsys_state::z80_unmapped_r),this), write8_delegate(FUNC(segamsys_state::z80_unmapped_w),this));
|
|
||||||
|
|
||||||
/* main ram area */
|
|
||||||
sms_mainram = (UINT8 *)machine().device(tag)->memory().space(AS_PROGRAM).install_ram(0xc000, 0xdfff, 0, 0x2000);
|
|
||||||
memset(sms_mainram,0x00,0x2000);
|
|
||||||
|
|
||||||
megatech_set_genz80_as_sms_standard_ports(tag);
|
|
||||||
|
|
||||||
/* fixed rom bank area */
|
|
||||||
sms_rom = (UINT8 *)machine().device(tag)->memory().space(AS_PROGRAM).install_rom(0x0000, 0xbfff, NULL);
|
|
||||||
|
|
||||||
memcpy(sms_rom, machine().root_device().memregion("maincpu")->base(), 0xc000);
|
|
||||||
|
|
||||||
machine().device(tag)->memory().space(AS_PROGRAM).install_write_handler(0xfffc, 0xffff, write8_delegate(FUNC(segamsys_state::mt_sms_standard_rom_bank_w),this));
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user