mirror of
https://github.com/holub/mame
synced 2025-07-03 17:08:39 +03:00
fm77av: converted various MMU functions to use bankdev. Dragon Buster is now
almost 3 times faster than it was. memory.c: increased static handler limit, so that having a larger number of address map bank devices don't hit it.
This commit is contained in:
parent
3a282f173e
commit
7ff958da7c
@ -204,7 +204,7 @@ enum
|
|||||||
{
|
{
|
||||||
STATIC_INVALID = 0, // invalid - should never be used
|
STATIC_INVALID = 0, // invalid - should never be used
|
||||||
STATIC_BANK1 = 1, // first memory bank
|
STATIC_BANK1 = 1, // first memory bank
|
||||||
STATIC_BANKMAX = 124, // last memory bank
|
STATIC_BANKMAX = 252, // last memory bank
|
||||||
STATIC_NOP, // NOP - reads = unmapped value; writes = no-op
|
STATIC_NOP, // NOP - reads = unmapped value; writes = no-op
|
||||||
STATIC_UNMAP, // unmapped - same as NOP except we log errors
|
STATIC_UNMAP, // unmapped - same as NOP except we log errors
|
||||||
STATIC_WATCHPOINT, // watchpoint - used internally
|
STATIC_WATCHPOINT, // watchpoint - used internally
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
- Keyboard repeat is not implemented
|
- Keyboard repeat is not implemented
|
||||||
- Optional Kanji ROM use is not implemented
|
- Optional Kanji ROM use is not implemented
|
||||||
- Other optional hardware is not implemented (RS232, Z80 card...)
|
- Other optional hardware is not implemented (RS232, Z80 card...)
|
||||||
- FM-77AV and later aren't working (extra features not yet implemented)
|
- FM-77AV20 and later aren't working (extra features not yet implemented)
|
||||||
|
|
||||||
************************************************************************************************/
|
************************************************************************************************/
|
||||||
|
|
||||||
@ -48,7 +48,6 @@
|
|||||||
#include "formats/fm7_cas.h"
|
#include "formats/fm7_cas.h"
|
||||||
#include "imagedev/flopdrv.h"
|
#include "imagedev/flopdrv.h"
|
||||||
#include "bus/centronics/dsjoy.h"
|
#include "bus/centronics/dsjoy.h"
|
||||||
|
|
||||||
#include "includes/fm7.h"
|
#include "includes/fm7.h"
|
||||||
|
|
||||||
/* key scancode conversion table
|
/* key scancode conversion table
|
||||||
@ -997,7 +996,11 @@ READ8_MEMBER(fm7_state::fm7_mmr_r)
|
|||||||
|
|
||||||
void fm7_state::fm7_update_bank(address_space & space, int bank, UINT8 physical)
|
void fm7_state::fm7_update_bank(address_space & space, int bank, UINT8 physical)
|
||||||
{
|
{
|
||||||
UINT8* RAM = memregion("maincpu")->base();
|
address_map_bank_device* avbank[16] = { m_avbank1, m_avbank2, m_avbank3, m_avbank4, m_avbank5, m_avbank6, m_avbank7
|
||||||
|
, m_avbank8, m_avbank9, m_avbank10, m_avbank11, m_avbank12, m_avbank13, m_avbank14, m_avbank15, m_avbank16 };
|
||||||
|
|
||||||
|
avbank[bank]->set_bank(physical);
|
||||||
|
/* UINT8* RAM = memregion("maincpu")->base();
|
||||||
UINT16 size = 0xfff;
|
UINT16 size = 0xfff;
|
||||||
char bank_name[10];
|
char bank_name[10];
|
||||||
|
|
||||||
@ -1095,6 +1098,7 @@ void fm7_state::fm7_update_bank(address_space & space, int bank, UINT8 physical)
|
|||||||
}
|
}
|
||||||
space.install_readwrite_bank(bank*0x1000,(bank*0x1000)+size,bank_name);
|
space.install_readwrite_bank(bank*0x1000,(bank*0x1000)+size,bank_name);
|
||||||
membank(bank_name)->set_base(RAM+(physical<<12));
|
membank(bank_name)->set_base(RAM+(physical<<12));
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void fm7_state::fm7_mmr_refresh(address_space& space)
|
void fm7_state::fm7_mmr_refresh(address_space& space)
|
||||||
@ -1127,6 +1131,28 @@ void fm7_state::fm7_mmr_refresh(address_space& space)
|
|||||||
membank("bank24")->set_base(RAM+window_addr);
|
membank("bank24")->set_base(RAM+window_addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
space.install_readwrite_handler(0x7000,0x7fff,read8_delegate(FUNC(address_map_bank_device::read8),(address_map_bank_device*)m_avbank8),write8_delegate(FUNC(address_map_bank_device::write8),(address_map_bank_device*)m_avbank8));
|
||||||
|
}
|
||||||
|
if(m_init_rom_en)
|
||||||
|
{
|
||||||
|
UINT8* ROM = memregion("init")->base();
|
||||||
|
membank("init_bank_r")->set_base(ROM);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
membank("init_bank_r")->set_base(RAM+0x36000);
|
||||||
|
}
|
||||||
|
if(m_basic_rom_en)
|
||||||
|
{
|
||||||
|
UINT8* ROM = memregion("fbasic")->base();
|
||||||
|
membank("fbasic_bank_r")->set_base(ROM);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
membank("fbasic_bank_r")->set_base(RAM+0x38000);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE8_MEMBER(fm7_state::fm7_mmr_w)
|
WRITE8_MEMBER(fm7_state::fm7_mmr_w)
|
||||||
@ -1581,22 +1607,22 @@ static ADDRESS_MAP_START( fm16_sub_mem, AS_PROGRAM, 8, fm7_state )
|
|||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
static ADDRESS_MAP_START( fm77av_mem, AS_PROGRAM, 8, fm7_state )
|
static ADDRESS_MAP_START( fm77av_mem, AS_PROGRAM, 8, fm7_state )
|
||||||
AM_RANGE(0x0000,0x0fff) AM_RAMBANK("bank1")
|
AM_RANGE(0x0000,0x0fff) AM_DEVREADWRITE("av_bank1", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0x1000,0x1fff) AM_RAMBANK("bank2")
|
AM_RANGE(0x1000,0x1fff) AM_DEVREADWRITE("av_bank2", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0x2000,0x2fff) AM_RAMBANK("bank3")
|
AM_RANGE(0x2000,0x2fff) AM_DEVREADWRITE("av_bank3", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0x3000,0x3fff) AM_RAMBANK("bank4")
|
AM_RANGE(0x3000,0x3fff) AM_DEVREADWRITE("av_bank4", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0x4000,0x4fff) AM_RAMBANK("bank5")
|
AM_RANGE(0x4000,0x4fff) AM_DEVREADWRITE("av_bank5", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0x5000,0x5fff) AM_RAMBANK("bank6")
|
AM_RANGE(0x5000,0x5fff) AM_DEVREADWRITE("av_bank6", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0x6000,0x6fff) AM_RAMBANK("bank7")
|
AM_RANGE(0x6000,0x6fff) AM_DEVREADWRITE("av_bank7", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0x7000,0x7fff) AM_RAMBANK("bank8")
|
AM_RANGE(0x7000,0x7fff) AM_DEVREADWRITE("av_bank8", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0x8000,0x8fff) AM_RAMBANK("bank9")
|
AM_RANGE(0x8000,0x8fff) AM_DEVREADWRITE("av_bank9", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0x9000,0x9fff) AM_RAMBANK("bank10")
|
AM_RANGE(0x9000,0x9fff) AM_DEVREADWRITE("av_bank10", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0xa000,0xafff) AM_RAMBANK("bank11")
|
AM_RANGE(0xa000,0xafff) AM_DEVREADWRITE("av_bank11", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0xb000,0xbfff) AM_RAMBANK("bank12")
|
AM_RANGE(0xb000,0xbfff) AM_DEVREADWRITE("av_bank12", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0xc000,0xcfff) AM_RAMBANK("bank13")
|
AM_RANGE(0xc000,0xcfff) AM_DEVREADWRITE("av_bank13", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0xd000,0xdfff) AM_RAMBANK("bank14")
|
AM_RANGE(0xd000,0xdfff) AM_DEVREADWRITE("av_bank14", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0xe000,0xefff) AM_RAMBANK("bank15")
|
AM_RANGE(0xe000,0xefff) AM_DEVREADWRITE("av_bank15", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0xf000,0xfbff) AM_RAMBANK("bank16")
|
AM_RANGE(0xf000,0xfbff) AM_DEVREADWRITE("av_bank16", address_map_bank_device, read8, write8)
|
||||||
AM_RANGE(0xfc00,0xfc7f) AM_RAM
|
AM_RANGE(0xfc00,0xfc7f) AM_RAM
|
||||||
AM_RANGE(0xfc80,0xfcff) AM_READWRITE(fm7_main_shared_r,fm7_main_shared_w)
|
AM_RANGE(0xfc80,0xfcff) AM_READWRITE(fm7_main_shared_r,fm7_main_shared_w)
|
||||||
// I/O space (FD00-FDFF)
|
// I/O space (FD00-FDFF)
|
||||||
@ -1657,6 +1683,42 @@ static ADDRESS_MAP_START( fm77av_sub_mem, AS_PROGRAM, 8, fm7_state )
|
|||||||
AM_RANGE(0xe000,0xffff) AM_ROMBANK("bank21")
|
AM_RANGE(0xe000,0xffff) AM_ROMBANK("bank21")
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
static ADDRESS_MAP_START( fm7_banked_mem, AS_PROGRAM, 8, fm7_state)
|
||||||
|
// Extended RAM
|
||||||
|
AM_RANGE(0x00000,0x0ffff) AM_RAM AM_REGION("maincpu",0x00000)
|
||||||
|
|
||||||
|
// Sub CPU space
|
||||||
|
AM_RANGE(0x10000,0x1bfff) AM_READWRITE(fm7_vram_r,fm7_vram_w) // VRAM
|
||||||
|
AM_RANGE(0x1c000,0x1cfff) AM_RAM AM_REGION("maincpu",0x1c000) // Console RAM
|
||||||
|
AM_RANGE(0x1d000,0x1d37f) AM_RAM AM_REGION("maincpu",0x1d000) // Work RAM
|
||||||
|
AM_RANGE(0x1d380,0x1d3ff) AM_RAM AM_SHARE("shared_ram")
|
||||||
|
// I/O space (D400-D4FF)
|
||||||
|
AM_RANGE(0x1d400,0x1d401) AM_READ(fm7_sub_keyboard_r)
|
||||||
|
AM_RANGE(0x1d402,0x1d402) AM_READ(fm7_cancel_ack)
|
||||||
|
AM_RANGE(0x1d403,0x1d403) AM_READ(fm7_sub_beeper_r)
|
||||||
|
AM_RANGE(0x1d404,0x1d404) AM_READ(fm7_attn_irq_r)
|
||||||
|
AM_RANGE(0x1d408,0x1d408) AM_READWRITE(fm7_crt_r,fm7_crt_w)
|
||||||
|
AM_RANGE(0x1d409,0x1d409) AM_READWRITE(fm7_vram_access_r,fm7_vram_access_w)
|
||||||
|
AM_RANGE(0x1d40a,0x1d40a) AM_READWRITE(fm7_sub_busyflag_r,fm7_sub_busyflag_w)
|
||||||
|
AM_RANGE(0x1d40e,0x1d40f) AM_WRITE(fm7_vram_offset_w)
|
||||||
|
AM_RANGE(0x1d410,0x1d42b) AM_READWRITE(fm77av_alu_r, fm77av_alu_w)
|
||||||
|
AM_RANGE(0x1d430,0x1d430) AM_READWRITE(fm77av_video_flags_r,fm77av_video_flags_w)
|
||||||
|
AM_RANGE(0x1d431,0x1d432) AM_READWRITE(fm77av_key_encoder_r,fm77av_key_encoder_w)
|
||||||
|
AM_RANGE(0x1d500,0x1d7ff) AM_RAM AM_REGION("maincpu",0x1d500) // Work RAM
|
||||||
|
AM_RANGE(0x1d800,0x1dfff) AM_ROMBANK("bank20")
|
||||||
|
AM_RANGE(0x1e000,0x1ffff) AM_ROMBANK("bank21")
|
||||||
|
|
||||||
|
// more RAM?
|
||||||
|
AM_RANGE(0x20000,0x2ffff) AM_RAM AM_REGION("maincpu",0x20000)
|
||||||
|
|
||||||
|
// Main CPU space
|
||||||
|
AM_RANGE(0x30000,0x35fff) AM_RAM AM_REGION("maincpu",0x30000)
|
||||||
|
AM_RANGE(0x36000,0x37fff) AM_READ_BANK("init_bank_r") AM_WRITE_BANK("init_bank_w")
|
||||||
|
AM_RANGE(0x38000,0x3fbff) AM_READ_BANK("fbasic_bank_r") AM_WRITE_BANK("fbasic_bank_w")
|
||||||
|
AM_RANGE(0x3fc00,0x3ffff) AM_RAM AM_REGION("maincpu",0x3fc00)
|
||||||
|
|
||||||
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
/* Input ports */
|
/* Input ports */
|
||||||
INPUT_PORTS_START( fm7_keyboard )
|
INPUT_PORTS_START( fm7_keyboard )
|
||||||
PORT_START("key1")
|
PORT_START("key1")
|
||||||
@ -1953,6 +2015,8 @@ void fm7_state::machine_reset()
|
|||||||
if(m_type == SYS_FM77AV || m_type == SYS_FM77AV40EX || m_type == SYS_FM11)
|
if(m_type == SYS_FM77AV || m_type == SYS_FM77AV40EX || m_type == SYS_FM11)
|
||||||
{
|
{
|
||||||
fm7_mmr_refresh(m_maincpu->space(AS_PROGRAM));
|
fm7_mmr_refresh(m_maincpu->space(AS_PROGRAM));
|
||||||
|
membank("fbasic_bank_w")->set_base(RAM+0x38000);
|
||||||
|
membank("init_bank_w")->set_base(RAM+0x36000);
|
||||||
}
|
}
|
||||||
if(m_type == SYS_FM11)
|
if(m_type == SYS_FM11)
|
||||||
{
|
{
|
||||||
@ -1970,6 +2034,14 @@ static const floppy_interface fm7_floppy_interface =
|
|||||||
"floppy_5_25"
|
"floppy_5_25"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MCFG_ADDRESS_BANK(tag) \
|
||||||
|
MCFG_DEVICE_ADD(tag, ADDRESS_MAP_BANK, 0) \
|
||||||
|
MCFG_DEVICE_PROGRAM_MAP(fm7_banked_mem) \
|
||||||
|
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) \
|
||||||
|
MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8) \
|
||||||
|
MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000)
|
||||||
|
|
||||||
|
|
||||||
static MACHINE_CONFIG_START( fm7, fm7_state )
|
static MACHINE_CONFIG_START( fm7, fm7_state )
|
||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
MCFG_CPU_ADD("maincpu", M6809, XTAL_2MHz)
|
MCFG_CPU_ADD("maincpu", M6809, XTAL_2MHz)
|
||||||
@ -2108,6 +2180,23 @@ static MACHINE_CONFIG_START( fm77av, fm7_state )
|
|||||||
|
|
||||||
MCFG_MACHINE_START_OVERRIDE(fm7_state,fm77av)
|
MCFG_MACHINE_START_OVERRIDE(fm7_state,fm77av)
|
||||||
|
|
||||||
|
MCFG_ADDRESS_BANK("av_bank1")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank2")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank3")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank4")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank5")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank6")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank7")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank8")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank9")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank10")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank11")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank12")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank13")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank14")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank15")
|
||||||
|
MCFG_ADDRESS_BANK("av_bank16")
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
MCFG_SCREEN_ADD("screen", RASTER)
|
MCFG_SCREEN_ADD("screen", RASTER)
|
||||||
MCFG_SCREEN_REFRESH_RATE(60)
|
MCFG_SCREEN_REFRESH_RATE(60)
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "sound/beep.h"
|
#include "sound/beep.h"
|
||||||
#include "sound/2203intf.h"
|
#include "sound/2203intf.h"
|
||||||
#include "machine/wd17xx.h"
|
#include "machine/wd17xx.h"
|
||||||
|
#include "machine/bankdev.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
@ -141,7 +142,23 @@ public:
|
|||||||
m_joy1(*this, "joy1"),
|
m_joy1(*this, "joy1"),
|
||||||
m_joy2(*this, "joy2"),
|
m_joy2(*this, "joy2"),
|
||||||
m_dsw(*this, "DSW"),
|
m_dsw(*this, "DSW"),
|
||||||
m_palette(*this, "palette")
|
m_palette(*this, "palette"),
|
||||||
|
m_avbank1(*this, "av_bank1"),
|
||||||
|
m_avbank2(*this, "av_bank2"),
|
||||||
|
m_avbank3(*this, "av_bank3"),
|
||||||
|
m_avbank4(*this, "av_bank4"),
|
||||||
|
m_avbank5(*this, "av_bank5"),
|
||||||
|
m_avbank6(*this, "av_bank6"),
|
||||||
|
m_avbank7(*this, "av_bank7"),
|
||||||
|
m_avbank8(*this, "av_bank8"),
|
||||||
|
m_avbank9(*this, "av_bank9"),
|
||||||
|
m_avbank10(*this, "av_bank10"),
|
||||||
|
m_avbank11(*this, "av_bank11"),
|
||||||
|
m_avbank12(*this, "av_bank12"),
|
||||||
|
m_avbank13(*this, "av_bank13"),
|
||||||
|
m_avbank14(*this, "av_bank14"),
|
||||||
|
m_avbank15(*this, "av_bank15"),
|
||||||
|
m_avbank16(*this, "av_bank16")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -342,6 +359,23 @@ public:
|
|||||||
required_ioport m_dsw;
|
required_ioport m_dsw;
|
||||||
required_device<palette_device> m_palette;
|
required_device<palette_device> m_palette;
|
||||||
|
|
||||||
|
optional_device<address_map_bank_device> m_avbank1;
|
||||||
|
optional_device<address_map_bank_device> m_avbank2;
|
||||||
|
optional_device<address_map_bank_device> m_avbank3;
|
||||||
|
optional_device<address_map_bank_device> m_avbank4;
|
||||||
|
optional_device<address_map_bank_device> m_avbank5;
|
||||||
|
optional_device<address_map_bank_device> m_avbank6;
|
||||||
|
optional_device<address_map_bank_device> m_avbank7;
|
||||||
|
optional_device<address_map_bank_device> m_avbank8;
|
||||||
|
optional_device<address_map_bank_device> m_avbank9;
|
||||||
|
optional_device<address_map_bank_device> m_avbank10;
|
||||||
|
optional_device<address_map_bank_device> m_avbank11;
|
||||||
|
optional_device<address_map_bank_device> m_avbank12;
|
||||||
|
optional_device<address_map_bank_device> m_avbank13;
|
||||||
|
optional_device<address_map_bank_device> m_avbank14;
|
||||||
|
optional_device<address_map_bank_device> m_avbank15;
|
||||||
|
optional_device<address_map_bank_device> m_avbank16;
|
||||||
|
|
||||||
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);
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user