clean-up of the MegaPlay and MegaTech driver classes. nw.

This commit is contained in:
Fabio Priuli 2014-03-26 08:19:02 +00:00
parent c97f67ba1e
commit dc41389e02
4 changed files with 175 additions and 247 deletions

View File

@ -324,12 +324,12 @@ INPUT_PORTS_END
/*MEGAPLAY specific*/ /*MEGAPLAY specific*/
READ8_MEMBER(mplay_state::megaplay_bios_banksel_r) READ8_MEMBER(mplay_state::bios_banksel_r)
{ {
return m_bios_bank; return m_bios_bank;
} }
WRITE8_MEMBER(mplay_state::megaplay_bios_banksel_w) WRITE8_MEMBER(mplay_state::bios_banksel_w)
{ {
/* Multi-slot note: /* Multi-slot note:
Bits 0 and 1 appear to determine the selected game slot. Bits 0 and 1 appear to determine the selected game slot.
@ -341,12 +341,12 @@ WRITE8_MEMBER(mplay_state::megaplay_bios_banksel_w)
// logerror("BIOS: ROM bank %i selected [0x%02x]\n",bios_bank >> 6, data); // logerror("BIOS: ROM bank %i selected [0x%02x]\n",bios_bank >> 6, data);
} }
READ8_MEMBER(mplay_state::megaplay_bios_gamesel_r) READ8_MEMBER(mplay_state::bios_gamesel_r)
{ {
return m_bios_6403; return m_bios_6403;
} }
WRITE8_MEMBER(mplay_state::megaplay_bios_gamesel_w) WRITE8_MEMBER(mplay_state::bios_gamesel_w)
{ {
m_bios_6403 = data; m_bios_6403 = data;
@ -354,7 +354,7 @@ WRITE8_MEMBER(mplay_state::megaplay_bios_gamesel_w)
m_bios_mode = data & 0x10; m_bios_mode = data & 0x10;
} }
WRITE16_MEMBER(mplay_state::megaplay_io_write) WRITE16_MEMBER(mplay_state::mp_io_write)
{ {
if (offset == 0x03) if (offset == 0x03)
m_megadrive_io_data_regs[2] = (data & m_megadrive_io_ctrl_regs[2]) | (m_megadrive_io_data_regs[2] & ~m_megadrive_io_ctrl_regs[2]); m_megadrive_io_data_regs[2] = (data & m_megadrive_io_ctrl_regs[2]) | (m_megadrive_io_data_regs[2] & ~m_megadrive_io_ctrl_regs[2]);
@ -362,7 +362,7 @@ WRITE16_MEMBER(mplay_state::megaplay_io_write)
megadriv_68k_io_write(space, offset & 0x1f, data, 0xffff); megadriv_68k_io_write(space, offset & 0x1f, data, 0xffff);
} }
READ16_MEMBER(mplay_state::megaplay_io_read) READ16_MEMBER(mplay_state::mp_io_read)
{ {
if (offset == 0x03) if (offset == 0x03)
return m_megadrive_io_data_regs[2]; return m_megadrive_io_data_regs[2];
@ -373,7 +373,7 @@ READ16_MEMBER(mplay_state::megaplay_io_read)
READ8_MEMBER(mplay_state::bank_r) READ8_MEMBER(mplay_state::bank_r)
{ {
UINT8* bank = memregion("mtbios")->base(); UINT8* bank = memregion("mtbios")->base();
UINT32 fulladdress = m_mp_bios_bank_addr + offset; UINT32 fulladdress = m_bios_bank_addr + offset;
if (fulladdress <= 0x3fffff) // ROM Addresses if (fulladdress <= 0x3fffff) // ROM Addresses
{ {
@ -400,7 +400,7 @@ READ8_MEMBER(mplay_state::bank_r)
} }
else if (fulladdress >= 0xa10000 && fulladdress <= 0xa1001f) // IO Acess else if (fulladdress >= 0xa10000 && fulladdress <= 0xa1001f) // IO Acess
{ {
return megaplay_io_read(space, (offset & 0x1f) / 2, 0xffff); return mp_io_read(space, (offset & 0x1f) / 2, 0xffff);
} }
else else
{ {
@ -412,7 +412,7 @@ READ8_MEMBER(mplay_state::bank_r)
WRITE8_MEMBER(mplay_state::bank_w) WRITE8_MEMBER(mplay_state::bank_w)
{ {
UINT32 fulladdress = m_mp_bios_bank_addr + offset; UINT32 fulladdress = m_bios_bank_addr + offset;
if (fulladdress <= 0x3fffff) // ROM / Megaplay Custom Addresses if (fulladdress <= 0x3fffff) // ROM / Megaplay Custom Addresses
{ {
@ -429,7 +429,7 @@ WRITE8_MEMBER(mplay_state::bank_w)
} }
else if (fulladdress >= 0xa10000 && fulladdress <=0xa1001f) // IO Access else if (fulladdress >= 0xa10000 && fulladdress <=0xa1001f) // IO Access
{ {
megaplay_io_write(space, (offset & 0x1f) / 2, data, 0xffff); mp_io_write(space, (offset & 0x1f) / 2, data, 0xffff);
} }
else else
{ {
@ -441,38 +441,38 @@ WRITE8_MEMBER(mplay_state::bank_w)
/* Megaplay BIOS handles regs[2] at start in a different way compared to megadrive */ /* Megaplay BIOS handles regs[2] at start in a different way compared to megadrive */
/* other io data/ctrl regs are dealt with exactly like in the console */ /* other io data/ctrl regs are dealt with exactly like in the console */
READ8_MEMBER(mplay_state::megaplay_bios_6402_r) READ8_MEMBER(mplay_state::bios_6402_r)
{ {
return m_megadrive_io_data_regs[2];// & 0xfe; return m_megadrive_io_data_regs[2];// & 0xfe;
} }
WRITE8_MEMBER(mplay_state::megaplay_bios_6402_w) WRITE8_MEMBER(mplay_state::bios_6402_w)
{ {
m_megadrive_io_data_regs[2] = (m_megadrive_io_data_regs[2] & 0x07) | ((data & 0x70) >> 1); m_megadrive_io_data_regs[2] = (m_megadrive_io_data_regs[2] & 0x07) | ((data & 0x70) >> 1);
// logerror("BIOS: 0x6402 write: 0x%02x\n", data); // logerror("BIOS: 0x6402 write: 0x%02x\n", data);
} }
READ8_MEMBER(mplay_state::megaplay_bios_6204_r) READ8_MEMBER(mplay_state::bios_6204_r)
{ {
return m_megadrive_io_data_regs[2]; return m_megadrive_io_data_regs[2];
// return (m_bios_width & 0xf8) + (m_bios_6204 & 0x07); // return (m_bios_width & 0xf8) + (m_bios_6204 & 0x07);
} }
WRITE8_MEMBER(mplay_state::megaplay_bios_width_w) WRITE8_MEMBER(mplay_state::bios_width_w)
{ {
m_bios_width = data; m_bios_width = data;
m_megadrive_io_data_regs[2] = (m_megadrive_io_data_regs[2] & 0x07) | ((data & 0xf8)); m_megadrive_io_data_regs[2] = (m_megadrive_io_data_regs[2] & 0x07) | ((data & 0xf8));
// logerror("BIOS: 0x6204 - Width write: %02x\n", data); // logerror("BIOS: 0x6204 - Width write: %02x\n", data);
} }
READ8_MEMBER(mplay_state::megaplay_bios_6404_r) READ8_MEMBER(mplay_state::bios_6404_r)
{ {
// logerror("BIOS: 0x6404 read: returned 0x%02x\n",bios_6404 | (bios_6403 & 0x10) >> 4); // logerror("BIOS: 0x6404 read: returned 0x%02x\n",bios_6404 | (bios_6403 & 0x10) >> 4);
return (m_bios_6404 & 0xfe) | ((m_bios_6403 & 0x10) >> 4); return (m_bios_6404 & 0xfe) | ((m_bios_6403 & 0x10) >> 4);
// return m_bios_6404 | (m_bios_6403 & 0x10) >> 4; // return m_bios_6404 | (m_bios_6403 & 0x10) >> 4;
} }
WRITE8_MEMBER(mplay_state::megaplay_bios_6404_w) WRITE8_MEMBER(mplay_state::bios_6404_w)
{ {
if(((m_bios_6404 & 0x0c) == 0x00) && ((data & 0x0c) == 0x0c)) if(((m_bios_6404 & 0x0c) == 0x00) && ((data & 0x0c) == 0x0c))
m_maincpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE); m_maincpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
@ -481,7 +481,7 @@ WRITE8_MEMBER(mplay_state::megaplay_bios_6404_w)
// logerror("BIOS: 0x6404 write: 0x%02x\n", data); // logerror("BIOS: 0x6404 write: 0x%02x\n", data);
} }
READ8_MEMBER(mplay_state::megaplay_bios_6600_r) READ8_MEMBER(mplay_state::bios_6600_r)
{ {
/* Multi-slot note: /* Multi-slot note:
0x6600 appears to be used to check for extra slots being used. 0x6600 appears to be used to check for extra slots being used.
@ -492,13 +492,13 @@ READ8_MEMBER(mplay_state::megaplay_bios_6600_r)
return m_bios_6600;// & 0xfe; return m_bios_6600;// & 0xfe;
} }
WRITE8_MEMBER(mplay_state::megaplay_bios_6600_w) WRITE8_MEMBER(mplay_state::bios_6600_w)
{ {
m_bios_6600 = data; m_bios_6600 = data;
// logerror("BIOS: 0x6600 write: 0x%02x\n",data); // logerror("BIOS: 0x6600 write: 0x%02x\n",data);
} }
WRITE8_MEMBER(mplay_state::megaplay_game_w) WRITE8_MEMBER(mplay_state::game_w)
{ {
if (m_readpos == 1) if (m_readpos == 1)
m_game_banksel = 0; m_game_banksel = 0;
@ -514,24 +514,24 @@ WRITE8_MEMBER(mplay_state::megaplay_game_w)
logerror("BIOS [0x%04x]: 68K address space bank selected: 0x%03x\n", space.device().safe_pcbase(), m_game_banksel); logerror("BIOS [0x%04x]: 68K address space bank selected: 0x%03x\n", space.device().safe_pcbase(), m_game_banksel);
} }
m_mp_bios_bank_addr = ((m_mp_bios_bank_addr >> 1) | (data << 23)) & 0xff8000; m_bios_bank_addr = ((m_bios_bank_addr >> 1) | (data << 23)) & 0xff8000;
} }
static ADDRESS_MAP_START( megaplay_bios_map, AS_PROGRAM, 8, mplay_state ) static ADDRESS_MAP_START( megaplay_bios_map, AS_PROGRAM, 8, mplay_state )
AM_RANGE(0x0000, 0x3fff) AM_ROM AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x4fff) AM_RAM AM_RANGE(0x4000, 0x4fff) AM_RAM
AM_RANGE(0x5000, 0x5fff) AM_RAM AM_RANGE(0x5000, 0x5fff) AM_RAM
AM_RANGE(0x6000, 0x6000) AM_WRITE(megaplay_game_w) AM_RANGE(0x6000, 0x6000) AM_WRITE(game_w)
AM_RANGE(0x6200, 0x6200) AM_READ_PORT("DSW0") AM_RANGE(0x6200, 0x6200) AM_READ_PORT("DSW0")
AM_RANGE(0x6201, 0x6201) AM_READ_PORT("DSW1") AM_RANGE(0x6201, 0x6201) AM_READ_PORT("DSW1")
AM_RANGE(0x6203, 0x6203) AM_READWRITE(megaplay_bios_banksel_r, megaplay_bios_banksel_w) AM_RANGE(0x6203, 0x6203) AM_READWRITE(bios_banksel_r, bios_banksel_w)
AM_RANGE(0x6204, 0x6204) AM_READWRITE(megaplay_bios_6204_r, megaplay_bios_width_w) AM_RANGE(0x6204, 0x6204) AM_READWRITE(bios_6204_r, bios_width_w)
AM_RANGE(0x6400, 0x6400) AM_READ_PORT("TEST") AM_RANGE(0x6400, 0x6400) AM_READ_PORT("TEST")
AM_RANGE(0x6401, 0x6401) AM_READ_PORT("COIN") AM_RANGE(0x6401, 0x6401) AM_READ_PORT("COIN")
AM_RANGE(0x6402, 0x6402) AM_READWRITE(megaplay_bios_6402_r, megaplay_bios_6402_w) AM_RANGE(0x6402, 0x6402) AM_READWRITE(bios_6402_r, bios_6402_w)
AM_RANGE(0x6403, 0x6403) AM_READWRITE(megaplay_bios_gamesel_r, megaplay_bios_gamesel_w) AM_RANGE(0x6403, 0x6403) AM_READWRITE(bios_gamesel_r, bios_gamesel_w)
AM_RANGE(0x6404, 0x6404) AM_READWRITE(megaplay_bios_6404_r, megaplay_bios_6404_w) AM_RANGE(0x6404, 0x6404) AM_READWRITE(bios_6404_r, bios_6404_w)
AM_RANGE(0x6600, 0x6600) AM_READWRITE(megaplay_bios_6600_r, megaplay_bios_6600_w) AM_RANGE(0x6600, 0x6600) AM_READWRITE(bios_6600_r, bios_6600_w)
AM_RANGE(0x6001, 0x67ff) AM_WRITEONLY AM_RANGE(0x6001, 0x67ff) AM_WRITEONLY
AM_RANGE(0x6800, 0x77ff) AM_RAM AM_SHARE("ic3_ram") AM_RANGE(0x6800, 0x77ff) AM_RAM AM_SHARE("ic3_ram")
AM_RANGE(0x8000, 0xffff) AM_READWRITE(bank_r, bank_w) AM_RANGE(0x8000, 0xffff) AM_READWRITE(bank_r, bank_w)
@ -583,7 +583,7 @@ UINT32 mplay_state::screen_update_megplay(screen_device &screen, bitmap_rgb32 &b
MACHINE_RESET_MEMBER(mplay_state,megaplay) MACHINE_RESET_MEMBER(mplay_state,megaplay)
{ {
m_bios_mode = MP_ROM; m_bios_mode = MP_ROM;
m_mp_bios_bank_addr = 0; m_bios_bank_addr = 0;
m_readpos = 1; m_readpos = 1;
MACHINE_RESET_CALL_MEMBER(megadriv); MACHINE_RESET_CALL_MEMBER(megadriv);
} }
@ -808,12 +808,12 @@ void mplay_state::mplay_start()
} }
} }
READ16_MEMBER(mplay_state::megadriv_68k_read_z80_extra_ram ) READ16_MEMBER(mplay_state::extra_ram_r )
{ {
return m_ic36_ram[(offset << 1) ^ 1] | (m_ic36_ram[(offset << 1)] << 8); return m_ic36_ram[(offset << 1) ^ 1] | (m_ic36_ram[(offset << 1)] << 8);
} }
WRITE16_MEMBER(mplay_state::megadriv_68k_write_z80_extra_ram ) WRITE16_MEMBER(mplay_state::extra_ram_w )
{ {
if (!ACCESSING_BITS_0_7) // byte (MSB) access if (!ACCESSING_BITS_0_7) // byte (MSB) access
{ {
@ -835,20 +835,21 @@ DRIVER_INIT_MEMBER(mplay_state,megaplay)
/* to support the old code.. */ /* to support the old code.. */
m_ic36_ram = auto_alloc_array(machine(), UINT16, 0x10000 / 2); m_ic36_ram = auto_alloc_array(machine(), UINT16, 0x10000 / 2);
m_ic37_ram = auto_alloc_array(machine(), UINT8, 0x10000); m_ic37_ram = auto_alloc_array(machine(), UINT8, 0x10000);
m_genesis_io_ram = auto_alloc_array(machine(), UINT16, 0x20 / 2);
DRIVER_INIT_CALL(mpnew);
DRIVER_INIT_CALL(megadrij);
m_megadrive_io_read_data_port_ptr = read8_delegate(FUNC(md_base_state::megadrive_io_read_data_port_3button),this);
m_megadrive_io_write_data_port_ptr = write16_delegate(FUNC(md_base_state::megadrive_io_write_data_port_3button),this);
mplay_start(); mplay_start();
/* for now ... */ /* for now ... */
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa10000, 0xa1001f, read16_delegate(FUNC(mplay_state::megaplay_io_read),this), write16_delegate(FUNC(mplay_state::megaplay_io_write),this)); m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa10000, 0xa1001f, read16_delegate(FUNC(mplay_state::mp_io_read),this), write16_delegate(FUNC(mplay_state::mp_io_write),this));
/* megaplay has ram shared with the bios cpu here */ /* megaplay has ram shared with the bios cpu here */
m_z80snd->space(AS_PROGRAM).install_ram(0x2000, 0x3fff, &m_ic36_ram[0]); m_z80snd->space(AS_PROGRAM).install_ram(0x2000, 0x3fff, &m_ic36_ram[0]);
/* instead of a RAM mirror the 68k sees the extra ram of the 2nd z80 too */ /* instead of a RAM mirror the 68k sees the extra ram of the 2nd z80 too */
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa02000, 0xa03fff, read16_delegate(FUNC(mplay_state::megadriv_68k_read_z80_extra_ram),this), write16_delegate(FUNC(mplay_state::megadriv_68k_write_z80_extra_ram),this)); m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa02000, 0xa03fff, read16_delegate(FUNC(mplay_state::extra_ram_r),this), write16_delegate(FUNC(mplay_state::extra_ram_w),this));
} }
/* /*

View File

@ -205,7 +205,7 @@ static INPUT_PORTS_START( megatech ) /* Genesis Input Ports */
INPUT_PORTS_END INPUT_PORTS_END
/* MEGATECH specific */ /* MEGATECH specific */
READ8_MEMBER(mtech_state::megatech_cart_select_r ) READ8_MEMBER(mtech_state::cart_select_r )
{ {
return m_mt_cart_select_reg; return m_mt_cart_select_reg;
} }
@ -215,10 +215,10 @@ void mtech_state::device_timer(emu_timer &timer, device_timer_id id, int param,
switch (id) switch (id)
{ {
case TIMER_Z80_RUN_STATE: case TIMER_Z80_RUN_STATE:
megatech_z80_run_state(ptr, param); z80_run_state(ptr, param);
break; break;
case TIMER_Z80_STOP_STATE: case TIMER_Z80_STOP_STATE:
megatech_z80_stop_state(ptr, param); z80_stop_state(ptr, param);
break; break;
default: default:
assert_always(FALSE, "Unknown id in mtech_state::device_timer"); assert_always(FALSE, "Unknown id in mtech_state::device_timer");
@ -227,7 +227,7 @@ void mtech_state::device_timer(emu_timer &timer, device_timer_id id, int param,
READ8_MEMBER(mtech_state::sms_count_r) READ8_MEMBER(mtech_state::sms_count_r)
{ {
address_space &prg = machine().device("genesis_snd_z80")->memory().space(AS_PROGRAM); address_space &prg = m_z80snd->space(AS_PROGRAM);
if (offset & 0x01) if (offset & 0x01)
return m_vdp->hcount_read(prg, offset); return m_vdp->hcount_read(prg, offset);
else else
@ -235,7 +235,6 @@ READ8_MEMBER(mtech_state::sms_count_r)
} }
/* the SMS inputs should be more complex, like the megadrive ones */
READ8_MEMBER (mtech_state::sms_ioport_dc_r) 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) */ /* 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) */
@ -253,10 +252,10 @@ READ8_MEMBER (mtech_state::sms_ioport_dd_r)
WRITE8_MEMBER( mtech_state::mt_sms_standard_rom_bank_w ) WRITE8_MEMBER( mtech_state::mt_sms_standard_rom_bank_w )
{ {
int bank = data&0x1f; int bank = data & 0x1f;
//logerror("bank w %02x %02x\n", offset, data); //logerror("bank w %02x %02x\n", offset, data);
sms_mainram[0x1ffc+offset] = data; sms_mainram[0x1ffc + offset] = data;
switch (offset) switch (offset)
{ {
case 0: case 0:
@ -278,10 +277,10 @@ WRITE8_MEMBER( mtech_state::mt_sms_standard_rom_bank_w )
} }
} }
void mtech_state::megatech_set_genz80_as_sms(const char* tag) void mtech_state::set_genz80_as_sms()
{ {
address_space &prg = machine().device(tag)->memory().space(AS_PROGRAM); address_space &prg = machine().device("genesis_snd_z80")->memory().space(AS_PROGRAM);
address_space &io = machine().device(tag)->memory().space(AS_IO); address_space &io = machine().device("genesis_snd_z80")->memory().space(AS_IO);
sn76496_base_device *sn = machine().device<sn76496_base_device>("snsnd"); sn76496_base_device *sn = machine().device<sn76496_base_device>("snsnd");
// main ram area // main ram area
@ -311,18 +310,11 @@ void mtech_state::megatech_set_genz80_as_sms(const char* tag)
/* sets the megadrive z80 to it's normal ports / map */ /* sets the megadrive z80 to it's normal ports / map */
void mtech_state::megatech_set_genz80_as_md(const char* tag) void mtech_state::set_genz80_as_md()
{ {
address_space &prg = machine().device(tag)->memory().space(AS_PROGRAM); address_space &prg = machine().device("genesis_snd_z80")->memory().space(AS_PROGRAM);
address_space &io = machine().device(tag)->memory().space(AS_IO);
ym2612_device *ym2612 = machine().device<ym2612_device>("ymsnd"); 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"); prg.install_readwrite_bank(0x0000, 0x1fff, "bank1");
machine().root_device().membank("bank1")->set_base(m_genz80.z80_prgram); machine().root_device().membank("bank1")->set_base(m_genz80.z80_prgram);
@ -337,8 +329,7 @@ void mtech_state::megatech_set_genz80_as_md(const char* tag)
} }
TIMER_CALLBACK_MEMBER(mtech_state::z80_run_state )
TIMER_CALLBACK_MEMBER(mtech_state::megatech_z80_run_state )
{ {
char tempname[20]; char tempname[20];
UINT8* game_region; UINT8* game_region;
@ -350,28 +341,27 @@ TIMER_CALLBACK_MEMBER(mtech_state::megatech_z80_run_state )
if (!m_cart_is_genesis[param]) if (!m_cart_is_genesis[param])
{ {
printf("enabling SMS Z80\n"); logerror("enabling SMS Z80\n");
m_current_game_is_sms = 1; m_current_game_is_sms = 1;
megatech_set_genz80_as_sms("genesis_snd_z80"); set_genz80_as_sms();
//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);
} }
else else
{ {
printf("disabling SMS Z80\n"); logerror("disabling SMS Z80\n");
m_current_game_is_sms = 0; m_current_game_is_sms = 0;
megatech_set_genz80_as_md("genesis_snd_z80"); set_genz80_as_md();
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);
} }
} }
TIMER_CALLBACK_MEMBER(mtech_state::megatech_z80_stop_state ) TIMER_CALLBACK_MEMBER(mtech_state::z80_stop_state )
{ {
UINT8* game_region; UINT8* game_region;
char tempname[20]; char tempname[20];
logerror("select game %d\n", param + 1);
printf("megatech_select_game %d\n", param+1);
sprintf(tempname, "game%d", param); sprintf(tempname, "game%d", param);
game_region = memregion(tempname)->base(); game_region = memregion(tempname)->base();
@ -400,20 +390,14 @@ TIMER_CALLBACK_MEMBER(mtech_state::megatech_z80_stop_state )
return; return;
} }
void mtech_state::megatech_select_game(int gameno) WRITE8_MEMBER(mtech_state::cart_select_w )
{
timer_set(attotime::zero, TIMER_Z80_STOP_STATE, gameno);
}
WRITE8_MEMBER(mtech_state::megatech_cart_select_w )
{ {
/* seems to write the slot number.. /* seems to write the slot number..
but it stores something in (banked?) ram but it stores something in (banked?) ram
because it always seems to show the because it always seems to show the
same instructions ... */ same instructions ... */
m_mt_cart_select_reg = data; m_mt_cart_select_reg = data;
timer_set(attotime::zero, TIMER_Z80_STOP_STATE, m_mt_cart_select_reg);
megatech_select_game(m_mt_cart_select_reg);
} }
@ -443,14 +427,14 @@ WRITE8_MEMBER(mtech_state::bios_ctrl_w )
/* this sets 0x300000 which may indicate that the 68k can see the instruction rom /* this sets 0x300000 which may indicate that the 68k can see the instruction rom
there, this limiting the max game rom capacity to 3meg. */ there, this limiting the max game rom capacity to 3meg. */
READ8_MEMBER(mtech_state::megatech_z80_read_68k_banked_data ) READ8_MEMBER(mtech_state::read_68k_banked_data )
{ {
address_space &space68k = m_maincpu->space(); address_space &space68k = m_maincpu->space();
UINT8 ret = space68k.read_byte(m_mt_bank_addr + offset); UINT8 ret = space68k.read_byte(m_mt_bank_addr + offset);
return ret; return ret;
} }
WRITE8_MEMBER(mtech_state::megatech_z80_write_68k_banked_data ) WRITE8_MEMBER(mtech_state::write_68k_banked_data )
{ {
address_space &space68k = m_maincpu->space(); address_space &space68k = m_maincpu->space();
space68k.write_byte(m_mt_bank_addr + offset,data); space68k.write_byte(m_mt_bank_addr + offset,data);
@ -461,47 +445,63 @@ WRITE8_MEMBER(mtech_state::mt_z80_bank_w )
m_mt_bank_addr = ((m_mt_bank_addr >> 1) | (data << 23)) & 0xff8000; m_mt_bank_addr = ((m_mt_bank_addr >> 1) | (data << 23)) & 0xff8000;
} }
READ8_MEMBER(mtech_state::megatech_banked_ram_r ) READ8_MEMBER(mtech_state::banked_ram_r )
{ {
return m_megatech_banked_ram[offset + 0x1000 * (m_mt_cart_select_reg & 0x07)]; return m_banked_ram[offset + 0x1000 * (m_mt_cart_select_reg & 0x07)];
} }
WRITE8_MEMBER(mtech_state::megatech_banked_ram_w ) WRITE8_MEMBER(mtech_state::banked_ram_w )
{ {
m_megatech_banked_ram[offset + 0x1000 * (m_mt_cart_select_reg & 0x07)] = data; m_banked_ram[offset + 0x1000 * (m_mt_cart_select_reg & 0x07)] = data;
} }
static ADDRESS_MAP_START( megatech_bios_map, AS_PROGRAM, 8, mtech_state ) static ADDRESS_MAP_START( megatech_bios_map, AS_PROGRAM, 8, mtech_state )
AM_RANGE(0x0000, 0x2fff) AM_ROM // from bios rom (0x0000-0x2fff populated in ROM) AM_RANGE(0x0000, 0x2fff) AM_ROM // from bios rom (0x0000-0x2fff populated in ROM)
AM_RANGE(0x3000, 0x3fff) AM_READWRITE(megatech_banked_ram_r, megatech_banked_ram_w) // copies instruction data here at startup, must be banked AM_RANGE(0x3000, 0x3fff) AM_READWRITE(banked_ram_r, banked_ram_w) // copies instruction data here at startup, must be banked
AM_RANGE(0x4000, 0x5fff) AM_RAM // plain ram? AM_RANGE(0x4000, 0x5fff) AM_RAM // plain ram?
AM_RANGE(0x6000, 0x6000) AM_WRITE(mt_z80_bank_w ) AM_RANGE(0x6000, 0x6000) AM_WRITE(mt_z80_bank_w )
AM_RANGE(0x6400, 0x6400) AM_READ_PORT("BIOS_DSW0") AM_RANGE(0x6400, 0x6400) AM_READ_PORT("BIOS_DSW0")
AM_RANGE(0x6401, 0x6401) AM_READ_PORT("BIOS_DSW1") AM_RANGE(0x6401, 0x6401) AM_READ_PORT("BIOS_DSW1")
AM_RANGE(0x6404, 0x6404) AM_READWRITE(megatech_cart_select_r, megatech_cart_select_w) // cart select & ram bank AM_RANGE(0x6404, 0x6404) AM_READWRITE(cart_select_r, cart_select_w) // cart select & ram bank
AM_RANGE(0x6800, 0x6800) AM_READ_PORT("BIOS_IN0") AM_RANGE(0x6800, 0x6800) AM_READ_PORT("BIOS_IN0")
AM_RANGE(0x6801, 0x6801) AM_READ_PORT("BIOS_IN1") AM_RANGE(0x6801, 0x6801) AM_READ_PORT("BIOS_IN1")
AM_RANGE(0x6802, 0x6807) AM_READWRITE(bios_ctrl_r, bios_ctrl_w) AM_RANGE(0x6802, 0x6807) AM_READWRITE(bios_ctrl_r, bios_ctrl_w)
// AM_RANGE(0x6805, 0x6805) AM_READ_PORT("???") // AM_RANGE(0x6805, 0x6805) AM_READ_PORT("???")
AM_RANGE(0x7000, 0x77ff) AM_ROM // from bios rom (0x7000-0x77ff populated in ROM) AM_RANGE(0x7000, 0x77ff) AM_ROM // from bios rom (0x7000-0x77ff populated in ROM)
//AM_RANGE(0x7800, 0x7fff) AM_RAM // ? //AM_RANGE(0x7800, 0x7fff) AM_RAM // ?
AM_RANGE(0x8000, 0x9fff) AM_READWRITE(megatech_z80_read_68k_banked_data, megatech_z80_write_68k_banked_data) // window into 68k address space, reads instr rom and writes to reset banks on z80 carts? AM_RANGE(0x8000, 0x9fff) AM_READWRITE(read_68k_banked_data, write_68k_banked_data) // window into 68k address space, reads instr rom and writes to reset banks on z80 carts?
ADDRESS_MAP_END ADDRESS_MAP_END
WRITE8_MEMBER(mtech_state::megatech_bios_port_ctrl_w ) WRITE8_MEMBER(mtech_state::bios_port_ctrl_w )
{ {
m_bios_port_ctrl = data; m_bios_port_ctrl = data;
} }
READ8_MEMBER(mtech_state::megatech_bios_joypad_r ) /* the test mode accesses the joypad/stick inputs like this */
READ8_MEMBER(mtech_state::bios_joypad_r )
{ {
return megatech_bios_port_cc_dc_r(offset, m_bios_port_ctrl); UINT8 retdata = 0;
if (m_bios_port_ctrl == 0x55)
{
/* A keys */
retdata = ((m_io_pad_3b[0]->read() & 0x40) >> 2) | ((m_io_pad_3b[1]->read() & 0x40) >> 4) | 0xeb;
}
else
{
if (offset == 0)
retdata = (m_io_pad_3b[0]->read() & 0x3f) | ((m_io_pad_3b[1]->read() & 0x03) << 6);
else
retdata = ((m_io_pad_3b[1]->read() & 0x3c) >> 2) | 0xf0;
}
return retdata;
} }
WRITE8_MEMBER(mtech_state::megatech_bios_port_7f_w) WRITE8_MEMBER(mtech_state::bios_port_7f_w)
{ {
// popmessage("CPU #3: I/O port 0x7F write, data %02x", data); // popmessage("CPU #3: I/O port 0x7F write, data %02x", data);
} }
@ -518,21 +518,21 @@ READ8_MEMBER(mtech_state::vdp1_count_r)
static ADDRESS_MAP_START( megatech_bios_portmap, AS_IO, 8, mtech_state ) static ADDRESS_MAP_START( megatech_bios_portmap, AS_IO, 8, mtech_state )
ADDRESS_MAP_GLOBAL_MASK(0xff) ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x3f, 0x3f) AM_WRITE(megatech_bios_port_ctrl_w) AM_RANGE(0x3f, 0x3f) AM_WRITE(bios_port_ctrl_w)
AM_RANGE(0x7f, 0x7f) AM_WRITE(megatech_bios_port_7f_w) AM_RANGE(0x7f, 0x7f) AM_WRITE(bios_port_7f_w)
AM_RANGE(0x40, 0x41) AM_MIRROR(0x3e) AM_READ(vdp1_count_r) AM_RANGE(0x40, 0x41) AM_MIRROR(0x3e) AM_READ(vdp1_count_r)
AM_RANGE(0x80, 0x80) AM_MIRROR(0x3e) AM_DEVREADWRITE("vdp1", sega315_5124_device, vram_read, vram_write) AM_RANGE(0x80, 0x80) AM_MIRROR(0x3e) AM_DEVREADWRITE("vdp1", sega315_5124_device, vram_read, vram_write)
AM_RANGE(0x81, 0x81) AM_MIRROR(0x3e) AM_DEVREADWRITE("vdp1", sega315_5124_device, register_read, register_write) AM_RANGE(0x81, 0x81) AM_MIRROR(0x3e) AM_DEVREADWRITE("vdp1", sega315_5124_device, register_read, register_write)
AM_RANGE(0xdc, 0xdd) AM_READ(megatech_bios_joypad_r) // player inputs AM_RANGE(0xdc, 0xdd) AM_READ(bios_joypad_r) // player inputs
ADDRESS_MAP_END ADDRESS_MAP_END
DRIVER_INIT_MEMBER(mtech_state,mt_slot) DRIVER_INIT_MEMBER(mtech_state,mt_slot)
{ {
m_megatech_banked_ram = auto_alloc_array(machine(), UINT8, 0x1000*8); m_banked_ram = auto_alloc_array(machine(), UINT8, 0x1000*8);
DRIVER_INIT_CALL(megadriv); DRIVER_INIT_CALL(megadriv);
@ -549,7 +549,7 @@ DRIVER_INIT_MEMBER(mtech_state,mt_crt)
} }
UINT32 mtech_state::screen_update_mtnew(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) UINT32 mtech_state::screen_update_main(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)
@ -569,20 +569,20 @@ UINT32 mtech_state::screen_update_mtnew(screen_device &screen, bitmap_rgb32 &bit
return 0; return 0;
} }
void mtech_state::screen_eof_mtnew(screen_device &screen, bool state) void mtech_state::screen_eof_main(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);
} }
MACHINE_RESET_MEMBER(mtech_state,mtnew) MACHINE_RESET_MEMBER(mtech_state, megatech)
{ {
m_mt_bank_addr = 0; m_mt_bank_addr = 0;
MACHINE_RESET_CALL_MEMBER(megadriv); MACHINE_RESET_CALL_MEMBER(megadriv);
megatech_select_game(0); timer_set(attotime::zero, TIMER_Z80_STOP_STATE, 0);
} }
UINT32 mtech_state::screen_update_megatech_menu(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) UINT32 mtech_state::screen_update_menu(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
m_vdp1->screen_update(screen,bitmap,cliprect); m_vdp1->screen_update(screen,bitmap,cliprect);
return 0; return 0;
@ -625,7 +625,7 @@ static MACHINE_CONFIG_START( megatech, mtech_state )
MCFG_CPU_PROGRAM_MAP(megatech_bios_map) MCFG_CPU_PROGRAM_MAP(megatech_bios_map)
MCFG_CPU_IO_MAP(megatech_bios_portmap) MCFG_CPU_IO_MAP(megatech_bios_portmap)
MCFG_MACHINE_RESET_OVERRIDE(mtech_state,mtnew) MCFG_MACHINE_RESET_OVERRIDE(mtech_state, megatech)
MCFG_DEFAULT_LAYOUT(layout_dualhovu) MCFG_DEFAULT_LAYOUT(layout_dualhovu)
@ -633,8 +633,8 @@ static MACHINE_CONFIG_START( megatech, mtech_state )
MCFG_SCREEN_RAW_PARAMS(XTAL_10_738635MHz/2, \ 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_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) 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_UPDATE_DRIVER(mtech_state, screen_update_main)
MCFG_SCREEN_VBLANK_DRIVER(mtech_state, screen_eof_mtnew) MCFG_SCREEN_VBLANK_DRIVER(mtech_state, screen_eof_main)
MCFG_DEVICE_REMOVE("gen_vdp") MCFG_DEVICE_REMOVE("gen_vdp")
MCFG_DEVICE_ADD("gen_vdp", SEGA_GEN_VDP, 0) MCFG_DEVICE_ADD("gen_vdp", SEGA_GEN_VDP, 0)
@ -649,7 +649,7 @@ static MACHINE_CONFIG_START( megatech, mtech_state )
MCFG_SCREEN_RAW_PARAMS(XTAL_10_738635MHz/2, \ 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_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) 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_menu)
MCFG_SEGA315_5246_ADD("vdp1", bios_vdp_intf) MCFG_SEGA315_5246_ADD("vdp1", bios_vdp_intf)
MCFG_SEGA315_5246_SET_SCREEN("menu") MCFG_SEGA315_5246_SET_SCREEN("menu")

View File

@ -113,10 +113,6 @@ public:
DECLARE_WRITE8_MEMBER( megadriv_z80_vdp_write ); DECLARE_WRITE8_MEMBER( megadriv_z80_vdp_write );
DECLARE_READ8_MEMBER( megadriv_z80_vdp_read ); DECLARE_READ8_MEMBER( megadriv_z80_vdp_read );
DECLARE_READ8_MEMBER( megadriv_z80_unmapped_read ); DECLARE_READ8_MEMBER( megadriv_z80_unmapped_read );
DECLARE_READ8_MEMBER( z80_unmapped_port_r );
DECLARE_WRITE8_MEMBER( z80_unmapped_port_w );
DECLARE_READ8_MEMBER( z80_unmapped_r );
DECLARE_WRITE8_MEMBER( z80_unmapped_w );
TIMER_CALLBACK_MEMBER(megadriv_z80_run_state); TIMER_CALLBACK_MEMBER(megadriv_z80_run_state);
/* Megadrive / Genesis has 3 I/O ports */ /* Megadrive / Genesis has 3 I/O ports */
@ -136,7 +132,6 @@ public:
void megadrive_reset_io(); void megadrive_reset_io();
DECLARE_READ8_MEMBER(megadrive_io_read_data_port_6button); DECLARE_READ8_MEMBER(megadrive_io_read_data_port_6button);
DECLARE_READ8_MEMBER(megadrive_io_read_data_port_3button); DECLARE_READ8_MEMBER(megadrive_io_read_data_port_3button);
UINT8 megatech_bios_port_cc_dc_r(int offset, int ctrl);
UINT8 megadrive_io_read_ctrl_port(int portnum); UINT8 megadrive_io_read_ctrl_port(int portnum);
UINT8 megadrive_io_read_tx_port(int portnum); UINT8 megadrive_io_read_tx_port(int portnum);
UINT8 megadrive_io_read_rx_port(int portnum); UINT8 megadrive_io_read_rx_port(int portnum);
@ -156,7 +151,6 @@ public:
DECLARE_VIDEO_START( megadriv ); DECLARE_VIDEO_START( megadriv );
UINT32 screen_update_megadriv(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); UINT32 screen_update_megadriv(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void screen_eof_megadriv(screen_device &screen, bool state); void screen_eof_megadriv(screen_device &screen, bool state);
}; };
class md_boot_state : public md_base_state class md_boot_state : public md_base_state
@ -295,55 +289,55 @@ public:
m_bioscpu(*this, "mtbios") m_bioscpu(*this, "mtbios")
{ } { }
UINT32 m_bios_mode; // determines whether ROM banks or Game data DECLARE_READ16_MEMBER(extra_ram_r);
// is to read from 0x8000-0xffff DECLARE_WRITE16_MEMBER(extra_ram_w);
DECLARE_READ8_MEMBER(bios_banksel_r);
DECLARE_WRITE8_MEMBER(bios_banksel_w);
DECLARE_READ8_MEMBER(bios_gamesel_r);
DECLARE_WRITE8_MEMBER(bios_gamesel_w);
DECLARE_WRITE16_MEMBER(mp_io_write);
DECLARE_READ16_MEMBER(mp_io_read);
DECLARE_READ8_MEMBER(bank_r);
DECLARE_WRITE8_MEMBER(bank_w);
DECLARE_READ8_MEMBER(bios_6402_r);
DECLARE_WRITE8_MEMBER(bios_6402_w);
DECLARE_READ8_MEMBER(bios_6204_r);
DECLARE_WRITE8_MEMBER(bios_width_w);
DECLARE_READ8_MEMBER(bios_6404_r);
DECLARE_WRITE8_MEMBER(bios_6404_w);
DECLARE_READ8_MEMBER(bios_6600_r);
DECLARE_WRITE8_MEMBER(bios_6600_w);
DECLARE_WRITE8_MEMBER(game_w);
DECLARE_READ8_MEMBER(vdp_count_r);
DECLARE_WRITE_LINE_MEMBER(bios_int_callback);
void mplay_start();
DECLARE_DRIVER_INIT(megaplay);
DECLARE_VIDEO_START(megplay);
DECLARE_MACHINE_RESET(megaplay);
UINT32 screen_update_megplay(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
private:
UINT32 m_bios_mode; // determines whether ROM banks or Game data is to read from 0x8000-0xffff
UINT32 m_bios_bank; // ROM bank selection UINT32 m_bios_bank; // ROM bank selection
UINT16 m_game_banksel; // Game bank selection UINT16 m_game_banksel; // Game bank selection
UINT32 m_readpos; // serial bank selection position (9-bit) UINT32 m_readpos; // serial bank selection position (9-bit)
UINT32 m_mp_bios_bank_addr; UINT32 m_bios_bank_addr;
UINT32 m_bios_width; // determines the way the game info ROM is read UINT32 m_bios_width; // determines the way the game info ROM is read
UINT8 m_bios_ctrl[6]; UINT8 m_bios_ctrl[6];
UINT8 m_bios_6600; UINT8 m_bios_6600;
UINT8 m_bios_6403; UINT8 m_bios_6403;
UINT8 m_bios_6404; UINT8 m_bios_6404;
UINT16 *m_ic36_ram;
UINT8* m_ic37_ram;
UINT16 *m_genesis_io_ram; required_shared_ptr<UINT8> m_ic3_ram;
required_shared_ptr<UINT8> m_ic3_ram;
optional_device<sega315_5124_device> m_vdp1; optional_device<sega315_5124_device> m_vdp1;
required_device<cpu_device> m_bioscpu; required_device<cpu_device> m_bioscpu;
UINT8* m_ic37_ram;
UINT16 *m_ic36_ram;
DECLARE_WRITE_LINE_MEMBER( bios_int_callback );
READ8_MEMBER(vdp_count_r);
DECLARE_DRIVER_INIT(megaplay);
DECLARE_VIDEO_START(megplay);
DECLARE_MACHINE_RESET(megaplay);
UINT32 screen_update_megplay(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void screen_eof_megaplay(screen_device &screen, bool state);
DECLARE_READ8_MEMBER( megaplay_bios_banksel_r );
DECLARE_WRITE8_MEMBER( megaplay_bios_banksel_w );
DECLARE_READ8_MEMBER( megaplay_bios_gamesel_r );
DECLARE_WRITE8_MEMBER( megaplay_bios_gamesel_w );
DECLARE_WRITE16_MEMBER( megaplay_io_write );
DECLARE_READ16_MEMBER( megaplay_io_read );
DECLARE_READ8_MEMBER( bank_r );
DECLARE_WRITE8_MEMBER( bank_w );
DECLARE_READ8_MEMBER( megaplay_bios_6402_r );
DECLARE_WRITE8_MEMBER( megaplay_bios_6402_w );
DECLARE_READ8_MEMBER( megaplay_bios_6204_r );
DECLARE_WRITE8_MEMBER( megaplay_bios_width_w );
DECLARE_READ8_MEMBER( megaplay_bios_6404_r );
DECLARE_WRITE8_MEMBER( megaplay_bios_6404_w );
DECLARE_READ8_MEMBER( megaplay_bios_6600_r );
DECLARE_WRITE8_MEMBER( megaplay_bios_6600_w );
DECLARE_WRITE8_MEMBER( megaplay_game_w );
void mplay_start();
DECLARE_READ16_MEMBER( megadriv_68k_read_z80_extra_ram );
DECLARE_WRITE16_MEMBER( megadriv_68k_write_z80_extra_ram );
}; };
class mtech_state : public md_base_state class mtech_state : public md_base_state
@ -361,66 +355,59 @@ public:
m_bioscpu(*this, "mtbios") m_bioscpu(*this, "mtbios")
{ } { }
required_device<sega315_5124_device> m_vdp1;
required_device<cpu_device> m_bioscpu;
DECLARE_WRITE_LINE_MEMBER( snd_int_callback ); DECLARE_WRITE_LINE_MEMBER( snd_int_callback );
DECLARE_WRITE_LINE_MEMBER( bios_int_callback ); DECLARE_WRITE_LINE_MEMBER( bios_int_callback );
DECLARE_READ8_MEMBER(cart_select_r);
DECLARE_WRITE8_MEMBER(cart_select_w);
DECLARE_READ8_MEMBER(bios_ctrl_r);
DECLARE_WRITE8_MEMBER(bios_ctrl_w);
DECLARE_READ8_MEMBER(read_68k_banked_data);
DECLARE_WRITE8_MEMBER(write_68k_banked_data);
DECLARE_WRITE8_MEMBER(mt_z80_bank_w);
DECLARE_READ8_MEMBER(banked_ram_r);
DECLARE_WRITE8_MEMBER(banked_ram_w);
DECLARE_WRITE8_MEMBER(bios_port_ctrl_w);
DECLARE_READ8_MEMBER(bios_joypad_r);
DECLARE_WRITE8_MEMBER(bios_port_7f_w);
DECLARE_READ8_MEMBER(vdp1_count_r);
DECLARE_READ8_MEMBER(sms_count_r);
DECLARE_READ8_MEMBER(sms_ioport_dc_r);
DECLARE_READ8_MEMBER(sms_ioport_dd_r);
DECLARE_WRITE8_MEMBER(mt_sms_standard_rom_bank_w);
DECLARE_DRIVER_INIT(mt_crt);
DECLARE_DRIVER_INIT(mt_slot);
DECLARE_MACHINE_RESET(megatech);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(megatech_cart);
UINT32 screen_update_main(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
UINT32 screen_update_menu(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void screen_eof_main(screen_device &screen, bool state);
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private:
UINT8 m_mt_cart_select_reg; UINT8 m_mt_cart_select_reg;
UINT32 m_bios_port_ctrl; UINT32 m_bios_port_ctrl;
int m_current_game_is_sms; // is the current game SMS based (running on genesis z80, in VDP compatibility mode) int m_current_game_is_sms; // is the current game SMS based (running on genesis z80, in VDP compatibility mode)
UINT32 m_bios_ctrl_inputs; UINT32 m_bios_ctrl_inputs;
UINT8 m_bios_ctrl[6]; UINT8 m_bios_ctrl[6];
int m_mt_bank_addr; int m_mt_bank_addr;
int m_cart_is_genesis[8]; int m_cart_is_genesis[8];
DECLARE_DEVICE_IMAGE_LOAD_MEMBER( megatech_cart ); void set_genz80_as_md();
void set_genz80_as_sms();
/* Megatech BIOS specific */ TIMER_CALLBACK_MEMBER(z80_run_state);
UINT8* m_megatech_banked_ram; TIMER_CALLBACK_MEMBER(z80_stop_state);
DECLARE_DRIVER_INIT(mt_crt);
DECLARE_DRIVER_INIT(mt_slot);
DECLARE_VIDEO_START(mtnew);
DECLARE_MACHINE_RESET(mtnew);
UINT32 screen_update_mtnew(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void screen_eof_mtnew(screen_device &screen, bool state);
UINT32 screen_update_megatech_menu(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
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 );
TIMER_CALLBACK_MEMBER( megatech_z80_run_state );
TIMER_CALLBACK_MEMBER( megatech_z80_stop_state );
void megatech_select_game(int gameno);
DECLARE_WRITE8_MEMBER( megatech_cart_select_w );
DECLARE_READ8_MEMBER( bios_ctrl_r );
DECLARE_WRITE8_MEMBER( bios_ctrl_w );
DECLARE_READ8_MEMBER( megatech_z80_read_68k_banked_data );
DECLARE_WRITE8_MEMBER( megatech_z80_write_68k_banked_data );
DECLARE_WRITE8_MEMBER( mt_z80_bank_w );
DECLARE_READ8_MEMBER( megatech_banked_ram_r );
DECLARE_WRITE8_MEMBER( megatech_banked_ram_w );
DECLARE_WRITE8_MEMBER( megatech_bios_port_ctrl_w );
DECLARE_READ8_MEMBER( megatech_bios_joypad_r );
DECLARE_WRITE8_MEMBER (megatech_bios_port_7f_w);
READ8_MEMBER(vdp1_count_r);
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:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
UINT8* m_banked_ram;
UINT8* sms_mainram; UINT8* sms_mainram;
UINT8* sms_rom; UINT8* sms_rom;
required_device<sega315_5124_device> m_vdp1;
required_device<cpu_device> m_bioscpu;
}; };
class _32x_state : public md_base_state class _32x_state : public md_base_state

View File

@ -25,7 +25,6 @@ Known Non-Issues (confirmed on Real Genesis)
#include "includes/megadriv.h" #include "includes/megadriv.h"
MACHINE_CONFIG_EXTERN( megadriv ); MACHINE_CONFIG_EXTERN( megadriv );
void megadriv_z80_hold(running_machine &machine) void megadriv_z80_hold(running_machine &machine)
@ -274,33 +273,6 @@ READ8_MEMBER(md_base_state::megadrive_io_read_data_port_3button)
return retdata; return retdata;
} }
/* used by megatech bios, the test mode accesses the joypad/stick inputs like this */
UINT8 md_base_state::megatech_bios_port_cc_dc_r(int offset, int ctrl)
{
UINT8 retdata;
if (ctrl == 0x55)
{
/* A keys */
retdata = ((m_io_pad_3b[0]->read() & 0x40) >> 2) |
((m_io_pad_3b[1]->read() & 0x40) >> 4) | 0xeb;
}
else
{
if (offset == 0)
{
retdata = (m_io_pad_3b[0]->read() & 0x3f) | ((m_io_pad_3b[1]->read() & 0x03) << 6);
}
else
{
retdata = ((m_io_pad_3b[1]->read() & 0x3c) >> 2) | 0xf0;
}
}
return retdata;
}
UINT8 md_base_state::megadrive_io_read_ctrl_port(int portnum) UINT8 md_base_state::megadrive_io_read_ctrl_port(int portnum)
{ {
UINT8 retdata; UINT8 retdata;
@ -1213,38 +1185,6 @@ DRIVER_INIT_MEMBER(md_base_state,megadrie)
m_pal = 1; m_pal = 1;
} }
DRIVER_INIT_MEMBER(md_base_state,mpnew)
{
DRIVER_INIT_CALL(megadrij);
m_megadrive_io_read_data_port_ptr = read8_delegate(FUNC(md_base_state::megadrive_io_read_data_port_3button),this);
m_megadrive_io_write_data_port_ptr = write16_delegate(FUNC(md_base_state::megadrive_io_write_data_port_3button),this);
}
/* used by megatech */
READ8_MEMBER(md_base_state::z80_unmapped_port_r )
{
// printf("unmapped z80 port read %04x\n",offset);
return 0;
}
WRITE8_MEMBER(md_base_state::z80_unmapped_port_w )
{
// printf("unmapped z80 port write %04x\n",offset);
}
READ8_MEMBER(md_base_state::z80_unmapped_r )
{
printf("unmapped z80 read %04x\n",offset);
return 0;
}
WRITE8_MEMBER(md_base_state::z80_unmapped_w )
{
printf("unmapped z80 write %04x\n",offset);
}
void md_base_state::screen_eof_megadriv(screen_device &screen, bool state) void md_base_state::screen_eof_megadriv(screen_device &screen, bool state)
{ {
if (m_io_reset->read_safe(0x00) & 0x01) if (m_io_reset->read_safe(0x00) & 0x01)