hexion.c: configured banking (nw)

This commit is contained in:
Ivan Vangelista 2015-07-12 15:04:04 +02:00
parent 4071cbb48e
commit 0aa5a8e5bb
3 changed files with 39 additions and 33 deletions

View File

@ -101,12 +101,12 @@ WRITE8_MEMBER(hexion_state::coincntr_w)
if ((data & 0xdc) != 0x10) popmessage("coincntr %02x",data);
}
WRITE_LINE_MEMBER(hexion_state::hexion_irq_ack_w)
WRITE_LINE_MEMBER(hexion_state::irq_ack_w)
{
m_maincpu->set_input_line(0, CLEAR_LINE);
}
WRITE_LINE_MEMBER(hexion_state::hexion_nmi_ack_w)
WRITE_LINE_MEMBER(hexion_state::nmi_ack_w)
{
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
}
@ -115,8 +115,8 @@ static ADDRESS_MAP_START( hexion_map, AS_PROGRAM, 8, hexion_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("bank1")
AM_RANGE(0xa000, 0xbfff) AM_RAM
AM_RANGE(0xc000, 0xdffe) AM_READWRITE(hexion_bankedram_r, hexion_bankedram_w)
AM_RANGE(0xdfff, 0xdfff) AM_WRITE(hexion_bankctrl_w)
AM_RANGE(0xc000, 0xdffe) AM_READWRITE(bankedram_r, bankedram_w)
AM_RANGE(0xdfff, 0xdfff) AM_WRITE(bankctrl_w)
AM_RANGE(0xe000, 0xe000) AM_NOP
AM_RANGE(0xe800, 0xe87f) AM_DEVREADWRITE("k051649", k051649_device, k051649_waveform_r, k051649_waveform_w)
AM_RANGE(0xe880, 0xe889) AM_DEVWRITE("k051649", k051649_device, k051649_frequency_w)
@ -131,9 +131,9 @@ static ADDRESS_MAP_START( hexion_map, AS_PROGRAM, 8, hexion_state )
AM_RANGE(0xf403, 0xf403) AM_READ_PORT("P2")
AM_RANGE(0xf440, 0xf440) AM_READ_PORT("DSW3")
AM_RANGE(0xf441, 0xf441) AM_READ_PORT("SYSTEM")
AM_RANGE(0xf480, 0xf480) AM_WRITE(hexion_bankswitch_w)
AM_RANGE(0xf480, 0xf480) AM_WRITE(bankswitch_w)
AM_RANGE(0xf4c0, 0xf4c0) AM_WRITE(coincntr_w)
AM_RANGE(0xf500, 0xf500) AM_WRITE(hexion_gfxrom_select_w)
AM_RANGE(0xf500, 0xf500) AM_WRITE(gfxrom_select_w)
AM_RANGE(0xf540, 0xf540) AM_READ(watchdog_reset_r)
ADDRESS_MAP_END
@ -141,8 +141,8 @@ static ADDRESS_MAP_START( hexionb_map, AS_PROGRAM, 8, hexion_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("bank1")
AM_RANGE(0xa000, 0xbfff) AM_RAM
AM_RANGE(0xc000, 0xdffe) AM_READWRITE(hexion_bankedram_r, hexion_bankedram_w)
AM_RANGE(0xdfff, 0xdfff) AM_WRITE(hexion_bankctrl_w)
AM_RANGE(0xc000, 0xdffe) AM_READWRITE(bankedram_r, bankedram_w)
AM_RANGE(0xdfff, 0xdfff) AM_WRITE(bankctrl_w)
AM_RANGE(0xe000, 0xe000) AM_NOP
AM_RANGE(0xe800, 0xe87f) AM_NOP // all the code to use the k051649 is still present
AM_RANGE(0xe880, 0xe889) AM_NOP // but the bootleg has an additional M6295 @ 0xf5c0 instead
@ -157,9 +157,9 @@ static ADDRESS_MAP_START( hexionb_map, AS_PROGRAM, 8, hexion_state )
AM_RANGE(0xf403, 0xf403) AM_READ_PORT("P2")
AM_RANGE(0xf440, 0xf440) AM_READ_PORT("DSW3")
AM_RANGE(0xf441, 0xf441) AM_READ_PORT("SYSTEM")
AM_RANGE(0xf480, 0xf480) AM_WRITE(hexion_bankswitch_w)
AM_RANGE(0xf480, 0xf480) AM_WRITE(bankswitch_w)
AM_RANGE(0xf4c0, 0xf4c0) AM_WRITE(coincntr_w)
AM_RANGE(0xf500, 0xf500) AM_WRITE(hexion_gfxrom_select_w)
AM_RANGE(0xf500, 0xf500) AM_WRITE(gfxrom_select_w)
AM_RANGE(0xf540, 0xf540) AM_READ(watchdog_reset_r)
AM_RANGE(0xf5c0, 0xf5c0) AM_DEVWRITE("oki2", okim6295_device, write)
ADDRESS_MAP_END
@ -224,7 +224,7 @@ static GFXDECODE_START( hexion )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 16 )
GFXDECODE_END
TIMER_DEVICE_CALLBACK_MEMBER(hexion_state::hexion_scanline)
TIMER_DEVICE_CALLBACK_MEMBER(hexion_state::scanline)
{
int scanline = param;
@ -240,11 +240,11 @@ static MACHINE_CONFIG_START( hexion, hexion_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_24MHz/4) /* Z80B 6 MHz @ 17F, xtal verified, divider not verified */
MCFG_CPU_PROGRAM_MAP(hexion_map)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", hexion_state, hexion_scanline, "screen", 0, 1)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", hexion_state, scanline, "screen", 0, 1)
MCFG_DEVICE_ADD("k053252", K053252, XTAL_24MHz/2) /* K053252, X0-010(?) @8D, xtal verified, divider not verified */
MCFG_K053252_INT1_ACK_CB(WRITELINE(hexion_state, hexion_irq_ack_w))
MCFG_K053252_INT2_ACK_CB(WRITELINE(hexion_state, hexion_nmi_ack_w))
MCFG_K053252_INT1_ACK_CB(WRITELINE(hexion_state, irq_ack_w))
MCFG_K053252_INT2_ACK_CB(WRITELINE(hexion_state, nmi_ack_w))
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
@ -252,7 +252,7 @@ static MACHINE_CONFIG_START( hexion, hexion_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(64*8, 36*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0*8, 32*8-1)
MCFG_SCREEN_UPDATE_DRIVER(hexion_state, screen_update_hexion)
MCFG_SCREEN_UPDATE_DRIVER(hexion_state, screen_update)
MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", hexion)

View File

@ -15,6 +15,7 @@ public:
required_device<cpu_device> m_maincpu;
required_device<k053252_device> m_k053252;
required_device<gfxdecode_device> m_gfxdecode;
UINT8 *m_vram[2];
UINT8 *m_unkram;
int m_bankctrl;
@ -22,18 +23,23 @@ public:
int m_pmcbank;
int m_gfxrom_select;
tilemap_t *m_bg_tilemap[2];
DECLARE_WRITE8_MEMBER(coincntr_w);
DECLARE_WRITE8_MEMBER(hexion_bankswitch_w);
DECLARE_READ8_MEMBER(hexion_bankedram_r);
DECLARE_WRITE8_MEMBER(hexion_bankedram_w);
DECLARE_WRITE8_MEMBER(hexion_bankctrl_w);
DECLARE_WRITE8_MEMBER(hexion_gfxrom_select_w);
DECLARE_WRITE_LINE_MEMBER(hexion_irq_ack_w);
DECLARE_WRITE_LINE_MEMBER(hexion_nmi_ack_w);
DECLARE_WRITE8_MEMBER(bankswitch_w);
DECLARE_READ8_MEMBER(bankedram_r);
DECLARE_WRITE8_MEMBER(bankedram_w);
DECLARE_WRITE8_MEMBER(bankctrl_w);
DECLARE_WRITE8_MEMBER(gfxrom_select_w);
DECLARE_WRITE_LINE_MEMBER(irq_ack_w);
DECLARE_WRITE_LINE_MEMBER(nmi_ack_w);
TILE_GET_INFO_MEMBER(get_tile_info0);
TILE_GET_INFO_MEMBER(get_tile_info1);
TIMER_DEVICE_CALLBACK_MEMBER(scanline);
virtual void video_start();
UINT32 screen_update_hexion(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(hexion_scanline);
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
inline void get_tile_info(tile_data &tileinfo,int tile_index,UINT8 *ram);
};

View File

@ -51,6 +51,8 @@ void hexion_state::video_start()
m_vram[0] = memregion("maincpu")->base() + 0x30000;
m_vram[1] = m_vram[0] + 0x2000;
m_unkram = m_vram[1] + 0x2000;
membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x2000);
}
@ -61,12 +63,10 @@ void hexion_state::video_start()
***************************************************************************/
WRITE8_MEMBER(hexion_state::hexion_bankswitch_w)
WRITE8_MEMBER(hexion_state::bankswitch_w)
{
UINT8 *rom = memregion("maincpu")->base() + 0x10000;
/* bits 0-3 select ROM bank */
membank("bank1")->set_base(rom + 0x2000 * (data & 0x0f));
membank("bank1")->set_entry(data & 0x0f);
/* does bit 6 trigger the 052591? */
if (data & 0x40)
@ -85,7 +85,7 @@ if (data & 0x30)
//logerror("%04x: bankswitch_w %02x\n",space.device().safe_pc(),data);
}
READ8_MEMBER(hexion_state::hexion_bankedram_r)
READ8_MEMBER(hexion_state::bankedram_r)
{
if (m_gfxrom_select && offset < 0x1000)
{
@ -106,7 +106,7 @@ READ8_MEMBER(hexion_state::hexion_bankedram_r)
}
}
WRITE8_MEMBER(hexion_state::hexion_bankedram_w)
WRITE8_MEMBER(hexion_state::bankedram_w)
{
if (m_bankctrl == 3 && offset == 0 && (data & 0xfe) == 0)
{
@ -138,13 +138,13 @@ WRITE8_MEMBER(hexion_state::hexion_bankedram_w)
logerror("%04x: bankedram_w offset %04x, data %02x, bankctrl = %02x\n",space.device().safe_pc(),offset,data,m_bankctrl);
}
WRITE8_MEMBER(hexion_state::hexion_bankctrl_w)
WRITE8_MEMBER(hexion_state::bankctrl_w)
{
//logerror("%04x: bankctrl_w %02x\n",space.device().safe_pc(),data);
m_bankctrl = data;
}
WRITE8_MEMBER(hexion_state::hexion_gfxrom_select_w)
WRITE8_MEMBER(hexion_state::gfxrom_select_w)
{
//logerror("%04x: gfxrom_select_w %02x\n",space.device().safe_pc(),data);
m_gfxrom_select = data;
@ -158,7 +158,7 @@ WRITE8_MEMBER(hexion_state::hexion_gfxrom_select_w)
***************************************************************************/
UINT32 hexion_state::screen_update_hexion(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
UINT32 hexion_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap[1]->draw(screen, bitmap, cliprect, 0,0);
m_bg_tilemap[0]->draw(screen, bitmap, cliprect, 0,0);