mirror of
https://github.com/holub/mame
synced 2025-07-04 17:38:08 +03:00
s550: Improve RAM banking
This commit is contained in:
parent
c85054ada8
commit
c0f61c5374
@ -36,7 +36,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void s50(machine_config &config);
|
void s50(machine_config &config);
|
||||||
void s550(machine_config &config);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void machine_start() override;
|
virtual void machine_start() override;
|
||||||
@ -44,7 +43,6 @@ protected:
|
|||||||
TIMER_DEVICE_CALLBACK_MEMBER(vdp_timer);
|
TIMER_DEVICE_CALLBACK_MEMBER(vdp_timer);
|
||||||
|
|
||||||
void p2_w(u8 data);
|
void p2_w(u8 data);
|
||||||
void ioga_out_w(u8 data);
|
|
||||||
u8 floppy_status_r();
|
u8 floppy_status_r();
|
||||||
u8 floppy_unknown_r();
|
u8 floppy_unknown_r();
|
||||||
u16 key_r(offs_t offset);
|
u16 key_r(offs_t offset);
|
||||||
@ -54,9 +52,10 @@ protected:
|
|||||||
void vram_map(address_map &map);
|
void vram_map(address_map &map);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void ioga_out_w(u8 data);
|
||||||
|
|
||||||
void mem_map(address_map &map);
|
void mem_map(address_map &map);
|
||||||
void s50_io_map(address_map &map);
|
void io_map(address_map &map);
|
||||||
void s550_io_map(address_map &map);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
required_device<i8x9x_device> m_maincpu;
|
required_device<i8x9x_device> m_maincpu;
|
||||||
@ -69,6 +68,27 @@ protected:
|
|||||||
optional_device<mb63h149_device> m_keyscan;
|
optional_device<mb63h149_device> m_keyscan;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class roland_s550_state : public roland_s50_state
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
roland_s550_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||||
|
: roland_s50_state(mconfig, type, tag)
|
||||||
|
, m_lowmem(*this, "lowmem")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void s550(machine_config &config);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void sram_bank_w(u8 data);
|
||||||
|
|
||||||
|
void mem_map(address_map &map);
|
||||||
|
void io_map(address_map &map);
|
||||||
|
void lowmem_map(address_map &map);
|
||||||
|
|
||||||
|
required_device<address_map_bank_device> m_lowmem;
|
||||||
|
};
|
||||||
|
|
||||||
class roland_w30_state : public roland_s50_state
|
class roland_w30_state : public roland_s50_state
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -132,6 +152,12 @@ void roland_s50_state::ioga_out_w(u8 data)
|
|||||||
m_sram->set_bank(BIT(data, 6, 2));
|
m_sram->set_bank(BIT(data, 6, 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void roland_s550_state::sram_bank_w(u8 data)
|
||||||
|
{
|
||||||
|
m_sram->set_bank(BIT(data, 0, 2));
|
||||||
|
m_lowmem->set_bank(BIT(data, 2, 3));
|
||||||
|
}
|
||||||
|
|
||||||
u8 roland_w30_state::psram_bank_r()
|
u8 roland_w30_state::psram_bank_r()
|
||||||
{
|
{
|
||||||
return m_psram_bank;
|
return m_psram_bank;
|
||||||
@ -178,7 +204,7 @@ void roland_s50_state::mem_map(address_map &map)
|
|||||||
map(0xc000, 0xffff).m(m_io, FUNC(address_map_bank_device::amap16));
|
map(0xc000, 0xffff).m(m_io, FUNC(address_map_bank_device::amap16));
|
||||||
}
|
}
|
||||||
|
|
||||||
void roland_s50_state::s50_io_map(address_map &map)
|
void roland_s50_state::io_map(address_map &map)
|
||||||
{
|
{
|
||||||
map(0x0000, 0x0000).w(FUNC(roland_s50_state::ioga_out_w));
|
map(0x0000, 0x0000).w(FUNC(roland_s50_state::ioga_out_w));
|
||||||
map(0x0200, 0x0200).r(FUNC(roland_s50_state::floppy_status_r));
|
map(0x0200, 0x0200).r(FUNC(roland_s50_state::floppy_status_r));
|
||||||
@ -191,16 +217,25 @@ void roland_s50_state::s50_io_map(address_map &map)
|
|||||||
map(0x4000, 0x4fff).mirror(0x3000).rw(FUNC(roland_s50_state::key_r), FUNC(roland_s50_state::key_w));
|
map(0x4000, 0x4fff).mirror(0x3000).rw(FUNC(roland_s50_state::key_r), FUNC(roland_s50_state::key_w));
|
||||||
}
|
}
|
||||||
|
|
||||||
void roland_s50_state::s550_io_map(address_map &map)
|
void roland_s550_state::mem_map(address_map &map)
|
||||||
{
|
{
|
||||||
map(0x0000, 0x0000).w(FUNC(roland_s50_state::ioga_out_w));
|
map(0x0000, 0x1fff).m(m_lowmem, FUNC(address_map_bank_device::amap16));
|
||||||
map(0x0200, 0x0200).r(FUNC(roland_s50_state::floppy_status_r));
|
map(0x2000, 0x3fff).rom().region("program", 0x2000);
|
||||||
map(0x0300, 0x0300).r(FUNC(roland_s50_state::floppy_unknown_r));
|
map(0x4000, 0x7fff).ram().share("common");
|
||||||
|
map(0x8000, 0xbfff).m(m_sram, FUNC(address_map_bank_device::amap16));
|
||||||
|
map(0xc000, 0xffff).m(m_io, FUNC(address_map_bank_device::amap16));
|
||||||
|
}
|
||||||
|
|
||||||
|
void roland_s550_state::io_map(address_map &map)
|
||||||
|
{
|
||||||
|
map(0x0200, 0x0200).r(FUNC(roland_s550_state::floppy_status_r));
|
||||||
|
map(0x0300, 0x0300).r(FUNC(roland_s550_state::floppy_unknown_r));
|
||||||
map(0x0800, 0x0807).rw(m_fdc, FUNC(wd1772_device::read), FUNC(wd1772_device::write)).umask16(0x00ff);
|
map(0x0800, 0x0807).rw(m_fdc, FUNC(wd1772_device::read), FUNC(wd1772_device::write)).umask16(0x00ff);
|
||||||
map(0x1000, 0x1000).r(m_vdp, FUNC(tms3556_device::vram_r));
|
map(0x1000, 0x1000).r(m_vdp, FUNC(tms3556_device::vram_r));
|
||||||
map(0x1002, 0x1002).rw(m_vdp, FUNC(tms3556_device::initptr_r), FUNC(tms3556_device::vram_w));
|
map(0x1002, 0x1002).rw(m_vdp, FUNC(tms3556_device::initptr_r), FUNC(tms3556_device::vram_w));
|
||||||
map(0x1004, 0x1004).rw(m_vdp, FUNC(tms3556_device::reg_r), FUNC(tms3556_device::reg_w));
|
map(0x1004, 0x1004).rw(m_vdp, FUNC(tms3556_device::reg_r), FUNC(tms3556_device::reg_w));
|
||||||
//map(0x1800, 0x181f).rw(m_tvf, FUNC(mb654419u_device::read), FUNC(mb654419u_device::write)).umask16(0x00ff);
|
//map(0x1800, 0x181f).rw(m_tvf, FUNC(mb654419u_device::read), FUNC(mb654419u_device::write)).umask16(0x00ff);
|
||||||
|
map(0x2000, 0x2000).w(FUNC(roland_s550_state::sram_bank_w));
|
||||||
map(0x2800, 0x281f).w("outas", FUNC(bu3905_device::write)).umask16(0x00ff);
|
map(0x2800, 0x281f).w("outas", FUNC(bu3905_device::write)).umask16(0x00ff);
|
||||||
//map(0x3800, 0x381f).rw(m_scsic, FUNC(mb89352_device::read), FUNC(mb89352_device::write)).umask16(0x00ff);
|
//map(0x3800, 0x381f).rw(m_scsic, FUNC(mb89352_device::read), FUNC(mb89352_device::write)).umask16(0x00ff);
|
||||||
//map(0x0000, 0x3fff).rw(m_wave, FUNC(rf5c16_device::read), FUNC(rf5c16_device::write)).umask16(0xff00);
|
//map(0x0000, 0x3fff).rw(m_wave, FUNC(rf5c16_device::read), FUNC(rf5c16_device::write)).umask16(0xff00);
|
||||||
@ -240,6 +275,12 @@ void roland_s50_state::sram_map(address_map &map)
|
|||||||
map(0x4000, 0xffff).ram();
|
map(0x4000, 0xffff).ram();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void roland_s550_state::lowmem_map(address_map &map)
|
||||||
|
{
|
||||||
|
map(0x0000, 0x1fff).rom().region("program", 0);
|
||||||
|
map(0x2000, 0xffff).ram();
|
||||||
|
}
|
||||||
|
|
||||||
void roland_w30_state::psram1_map(address_map &map)
|
void roland_w30_state::psram1_map(address_map &map)
|
||||||
{
|
{
|
||||||
map(0x0000, 0x1fff).rom().region("program", 0);
|
map(0x0000, 0x1fff).rom().region("program", 0);
|
||||||
@ -295,7 +336,7 @@ void roland_s50_state::s50(machine_config &config)
|
|||||||
m_io->set_data_width(16);
|
m_io->set_data_width(16);
|
||||||
m_io->set_addr_width(15);
|
m_io->set_addr_width(15);
|
||||||
m_io->set_stride(0x4000);
|
m_io->set_stride(0x4000);
|
||||||
m_io->set_addrmap(0, &roland_s50_state::s50_io_map);
|
m_io->set_addrmap(0, &roland_s50_state::io_map);
|
||||||
|
|
||||||
MB63H149(config, m_keyscan, 24_MHz_XTAL / 2);
|
MB63H149(config, m_keyscan, 24_MHz_XTAL / 2);
|
||||||
m_keyscan->int_callback().set_inputline(m_maincpu, i8x9x_device::EXTINT_LINE);
|
m_keyscan->int_callback().set_inputline(m_maincpu, i8x9x_device::EXTINT_LINE);
|
||||||
@ -331,11 +372,19 @@ void roland_s50_state::s50(machine_config &config)
|
|||||||
//m_wave->int_callback().set_inputline(m_maincpu, i8x9x_device::HSI0_LINE);
|
//m_wave->int_callback().set_inputline(m_maincpu, i8x9x_device::HSI0_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void roland_s50_state::s550(machine_config &config)
|
void roland_s550_state::s550(machine_config &config)
|
||||||
{
|
{
|
||||||
s50(config);
|
s50(config);
|
||||||
|
|
||||||
m_io->set_addrmap(0, &roland_s50_state::s550_io_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &roland_s550_state::mem_map);
|
||||||
|
m_io->set_addrmap(0, &roland_s550_state::io_map);
|
||||||
|
|
||||||
|
ADDRESS_MAP_BANK(config, m_lowmem);
|
||||||
|
m_lowmem->set_endianness(ENDIANNESS_LITTLE);
|
||||||
|
m_lowmem->set_data_width(16);
|
||||||
|
m_lowmem->set_addr_width(16);
|
||||||
|
m_lowmem->set_stride(0x2000);
|
||||||
|
m_lowmem->set_addrmap(0, &roland_s550_state::lowmem_map);
|
||||||
|
|
||||||
//UPD7537(config.device_replace(), "fipcpu", 400_kHz_XTAL);
|
//UPD7537(config.device_replace(), "fipcpu", 400_kHz_XTAL);
|
||||||
|
|
||||||
@ -479,6 +528,6 @@ ROM_END
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
SYST(1987, s50, 0, 0, s50, s50, roland_s50_state, empty_init, "Roland", "S-50 Digital Sampling Keyboard", MACHINE_IS_SKELETON)
|
SYST(1987, s50, 0, 0, s50, s50, roland_s50_state, empty_init, "Roland", "S-50 Digital Sampling Keyboard", MACHINE_IS_SKELETON)
|
||||||
SYST(1987, s550, s50, 0, s550, s550, roland_s50_state, empty_init, "Roland", "S-550 Digital Sampler", MACHINE_IS_SKELETON)
|
SYST(1987, s550, s50, 0, s550, s550, roland_s550_state, empty_init, "Roland", "S-550 Digital Sampler", MACHINE_IS_SKELETON)
|
||||||
SYST(1988, w30, 0, 0, w30, w30, roland_w30_state, empty_init, "Roland", "W-30 Music Workstation", MACHINE_IS_SKELETON)
|
SYST(1988, w30, 0, 0, w30, w30, roland_w30_state, empty_init, "Roland", "W-30 Music Workstation", MACHINE_IS_SKELETON)
|
||||||
//SYST(1988, s330, w30, 0, s330, s330, roland_w30_state, empty_init, "Roland", "S-330 Digital Sampler", MACHINE_IS_SKELETON)
|
//SYST(1988, s330, w30, 0, s330, s330, roland_w30_state, empty_init, "Roland", "S-330 Digital Sampler", MACHINE_IS_SKELETON)
|
||||||
|
Loading…
Reference in New Issue
Block a user