summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers
diff options
context:
space:
mode:
author holub <andrei.holub@gmail.com>2022-06-25 16:57:03 -0400
committer GitHub <noreply@github.com>2022-06-26 06:57:03 +1000
commit285f9520e74145105f818c648853ea4af25f4874 (patch)
tree1b0fbd74c930ee965b2089923dea7ac3aa9556ef /src/mame/drivers
parentcf45786813bbfcee558d6bf6f0198aa59e34aa89 (diff)
scorpion.cpp: Reviewed timings for Scorpion ZX-256 Yellow PCB, and cleaned up code. (#9750)
Diffstat (limited to 'src/mame/drivers')
-rw-r--r--src/mame/drivers/scorpion.cpp227
-rw-r--r--src/mame/drivers/spec128.cpp17
-rw-r--r--src/mame/drivers/specpls3.cpp1
3 files changed, 106 insertions, 139 deletions
diff --git a/src/mame/drivers/scorpion.cpp b/src/mame/drivers/scorpion.cpp
index 3f2887ca3ff..8633dd043d1 100644
--- a/src/mame/drivers/scorpion.cpp
+++ b/src/mame/drivers/scorpion.cpp
@@ -18,11 +18,8 @@ class scorpion_state : public spectrum_128_state
public:
scorpion_state(const machine_config &mconfig, device_type type, const char *tag)
: spectrum_128_state(mconfig, type, tag)
- , m_bank1(*this, "bank1")
- , m_bank2(*this, "bank2")
- , m_bank3(*this, "bank3")
- , m_bank4(*this, "bank4")
, m_beta(*this, BETA_DISK_TAG)
+ , m_bank0_rom(*this, "bank0_rom")
{ }
void scorpion(machine_config &config);
@@ -30,34 +27,29 @@ public:
void quorum(machine_config &config);
protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
+ void machine_start() override;
+ void machine_reset() override;
+ void video_start() override;
+
+ rectangle get_screen_area() override;
private:
- uint8_t beta_neutral_r(offs_t offset);
- uint8_t beta_enable_r(offs_t offset);
- uint8_t beta_disable_r(offs_t offset);
- void scorpion_0000_w(offs_t offset, uint8_t data);
- void scorpion_port_7ffd_w(uint8_t data);
- void scorpion_port_1ffd_w(uint8_t data);
+ u8 beta_neutral_r(offs_t offset);
+ u8 beta_enable_r(offs_t offset);
+ u8 beta_disable_r(offs_t offset);
+ void port_7ffd_w(offs_t offset, u8 data);
+ void port_1ffd_w(offs_t offset, u8 data);
TIMER_DEVICE_CALLBACK_MEMBER(nmi_check_callback);
void scorpion_io(address_map &map);
void scorpion_mem(address_map &map);
void scorpion_switch(address_map &map);
-
void scorpion_update_memory();
- required_memory_bank m_bank1;
- required_memory_bank m_bank2;
- required_memory_bank m_bank3;
- required_memory_bank m_bank4;
required_device<beta_disk_device> m_beta;
- uint8_t *m_ram_0000;
+ memory_view m_bank0_rom;
address_space *m_program;
- uint8_t *m_p_ram;
- uint16_t m_rom_selection;
};
/****************************************************************************************************/
@@ -90,44 +82,26 @@ D6-D7 - not used. ( yet ? )
void scorpion_state::scorpion_update_memory()
{
- uint8_t *messram = m_ram->pointer();
-
- m_screen_location = messram + ((m_port_7ffd_data & 8) ? (7<<14) : (5<<14));
+ m_screen->update_now();
+ m_screen_location = m_ram->pointer() + (((m_port_7ffd_data & 8) ? 7 : 5) << 14);
- m_bank4->set_base(messram + (((m_port_7ffd_data & 0x07) | ((m_port_1ffd_data & 0x10)>>1)) * 0x4000));
+ m_bank_ram[3]->set_entry((m_port_7ffd_data & 0x07) | ((m_port_1ffd_data & 0x10)>>1));
- if ((m_port_1ffd_data & 0x01)==0x01)
+ if (BIT(m_port_1ffd_data, 0))
{
- m_ram_0000 = messram+(8<<14);
- m_bank1->set_base(messram+(8<<14));
- logerror("RAM\n");
+ m_bank_ram[0]->set_entry(8);
+ m_bank0_rom.disable();
}
else
{
- if ((m_port_1ffd_data & 0x02)==0x02)
- m_rom_selection = 2;
- else
- m_rom_selection = BIT(m_port_7ffd_data, 4);
-
- m_bank1->set_base(&m_p_ram[0x10000 + (m_rom_selection<<14)]);
- }
-}
-
-void scorpion_state::scorpion_0000_w(offs_t offset, uint8_t data)
-{
- if ( ! m_ram_0000 )
- return;
-
- if ((m_port_1ffd_data & 0x01)==0x01)
- {
- if ( ! m_ram_disabled_by_beta )
- m_ram_0000[offset] = data;
+ m_bank_rom[0]->set_entry(BIT(m_port_1ffd_data, 1) ? 2 : BIT(m_port_7ffd_data, 4));
+ m_bank0_rom.select(0);
}
}
TIMER_DEVICE_CALLBACK_MEMBER(scorpion_state::nmi_check_callback)
{
- if ((m_io_nmi->read() & 1)==1)
+ if (m_io_nmi->read() & 0x01)
{
m_port_1ffd_data |= 0x02;
scorpion_update_memory();
@@ -135,61 +109,60 @@ TIMER_DEVICE_CALLBACK_MEMBER(scorpion_state::nmi_check_callback)
}
}
-void scorpion_state::scorpion_port_7ffd_w(uint8_t data)
+void scorpion_state::port_7ffd_w(offs_t offset, u8 data)
{
/* disable paging */
if (m_port_7ffd_data & 0x20)
return;
- /* store new state */
m_port_7ffd_data = data;
-
- /* update memory */
scorpion_update_memory();
}
-void scorpion_state::scorpion_port_1ffd_w(uint8_t data)
+void scorpion_state::port_1ffd_w(offs_t offset, u8 data)
{
m_port_1ffd_data = data;
scorpion_update_memory();
}
-uint8_t scorpion_state::beta_neutral_r(offs_t offset)
+u8 scorpion_state::beta_neutral_r(offs_t offset)
{
+ if (m_maincpu->total_cycles() & 1) m_maincpu->eat_cycles(1);
+
return m_program->read_byte(offset);
}
-uint8_t scorpion_state::beta_enable_r(offs_t offset)
+u8 scorpion_state::beta_enable_r(offs_t offset)
{
- if (m_rom_selection == 1) {
- m_rom_selection = 3;
- if (m_beta->started()) {
- m_beta->enable();
- m_bank1->set_base(&m_p_ram[0x10000 + (m_rom_selection<<14)]);
- m_ram_disabled_by_beta = 1;
- }
+ if (m_maincpu->total_cycles() & 1) m_maincpu->eat_cycles(1);
+
+ if(m_beta->started() && m_bank_rom[0]->entry() == 1) {
+ m_beta->enable();
+ m_bank_rom[0]->set_entry(3);
}
return m_program->read_byte(offset + 0x3d00);
}
-uint8_t scorpion_state::beta_disable_r(offs_t offset)
+u8 scorpion_state::beta_disable_r(offs_t offset)
{
+ if (m_maincpu->total_cycles() & 1) m_maincpu->eat_cycles(1);
+
if (m_beta->started() && m_beta->is_active()) {
- m_rom_selection = BIT(m_port_7ffd_data, 4);
m_beta->disable();
- m_bank1->set_base(&m_p_ram[0x10000 + (m_rom_selection<<14)]);
- m_ram_disabled_by_beta = 1;
- } else
- m_ram_disabled_by_beta = 0;
+ m_bank_rom[0]->set_entry(BIT(m_port_7ffd_data, 4));
+ }
return m_program->read_byte(offset + 0x4000);
}
void scorpion_state::scorpion_mem(address_map &map)
{
- map(0x0000, 0x3fff).bankr("bank1").w(FUNC(scorpion_state::scorpion_0000_w));
- map(0x4000, 0x7fff).bankrw("bank2");
- map(0x8000, 0xbfff).bankrw("bank3");
- map(0xc000, 0xffff).bankrw("bank4");
+ map(0x0000, 0x3fff).bankr(m_bank_ram[0]).w(FUNC(scorpion_state::spectrum_128_ram_w<0>));
+ map(0x0000, 0x3fff).view(m_bank0_rom);
+ m_bank0_rom[0](0x0000, 0x3fff).bankr(m_bank_rom[0]);
+
+ map(0x4000, 0x7fff).bankr(m_bank_ram[1]).w(FUNC(scorpion_state::spectrum_128_ram_w<1>));
+ map(0x8000, 0xbfff).bankrw(m_bank_ram[2]);
+ map(0xc000, 0xffff).bankr(m_bank_ram[3]).w(FUNC(scorpion_state::spectrum_128_ram_w<3>));
}
void scorpion_state::scorpion_io(address_map &map)
@@ -201,10 +174,10 @@ void scorpion_state::scorpion_io(address_map &map)
map(0x007f, 0x007f).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::data_r), FUNC(beta_disk_device::data_w));
map(0x00fe, 0x00fe).select(0xff00).rw(FUNC(scorpion_state::spectrum_ula_r), FUNC(scorpion_state::spectrum_ula_w));
map(0x00ff, 0x00ff).mirror(0xff00).rw(m_beta, FUNC(beta_disk_device::state_r), FUNC(beta_disk_device::param_w));
- map(0x4021, 0x4021).mirror(0x3fdc).w(FUNC(scorpion_state::scorpion_port_7ffd_w));
+ map(0x4021, 0x4021).mirror(0x3fdc).w(FUNC(scorpion_state::port_7ffd_w));
map(0x8021, 0x8021).mirror(0x3fdc).w("ay8912", FUNC(ay8910_device::data_w));
map(0xc021, 0xc021).mirror(0x3fdc).rw("ay8912", FUNC(ay8910_device::data_r), FUNC(ay8910_device::address_w));
- map(0x0021, 0x0021).mirror(0x3fdc).w(FUNC(scorpion_state::scorpion_port_1ffd_w));
+ map(0x0021, 0x0021).mirror(0x3fdc).w(FUNC(scorpion_state::port_1ffd_w));
}
void scorpion_state::scorpion_switch(address_map &map)
@@ -214,110 +187,108 @@ void scorpion_state::scorpion_switch(address_map &map)
map(0x4000, 0xffff).r(FUNC(scorpion_state::beta_disable_r));
}
-
void scorpion_state::machine_start()
{
spectrum_128_state::machine_start();
- m_rom_selection = 0;
+ save_item(NAME(m_port_1ffd_data));
+
+ // reconfigure ROMs
+ memory_region *rom = memregion("maincpu");
+ m_bank_rom[0]->configure_entries(0, 4*8, rom->base() + 0x10000, 0x4000);
+ m_bank_ram[0]->configure_entries(0, m_ram->size() / 0x4000, m_ram->pointer(), 0x4000);
- save_item(NAME(m_rom_selection));
+ m_program = &m_maincpu->space(AS_PROGRAM);
}
void scorpion_state::machine_reset()
{
- uint8_t *messram = m_ram->pointer();
- m_program = &m_maincpu->space(AS_PROGRAM);
- m_p_ram = memregion("maincpu")->base();
-
- m_ram_0000 = nullptr;
- m_program->install_read_bank(0x0000, 0x3fff, m_bank1);
- m_program->install_write_handler(0x0000, 0x3fff, write8sm_delegate(*this, FUNC(scorpion_state::scorpion_0000_w)));
-
+ m_bank0_rom.select(0);
m_beta->disable();
- memset(messram,0,256*1024);
-
- /* Bank 5 is always in 0x4000 - 0x7fff */
- m_bank2->set_base(messram + (5<<14));
-
- /* Bank 2 is always in 0x8000 - 0xbfff */
- m_bank3->set_base(messram + (2<<14));
-
+ m_port_fe_data = -1;
m_port_7ffd_data = 0;
m_port_1ffd_data = 0;
+
scorpion_update_memory();
}
+void scorpion_state::video_start()
+{
+ spectrum_state::video_start();
+ m_screen_location = m_ram->pointer() + (5 << 14);
+ m_contention_pattern = {};
+}
+
/* F4 Character Displayer */
static const gfx_layout spectrum_charlayout =
{
- 8, 8, /* 8 x 8 characters */
- 96, /* 96 characters */
- 1, /* 1 bits per pixel */
- { 0 }, /* no bitplanes */
- /* x offsets */
- { 0, 1, 2, 3, 4, 5, 6, 7 },
- /* y offsets */
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
- 8*8 /* every char takes 8 bytes */
+ 8, 8, /* 8 x 8 characters */
+ 96, /* 96 characters */
+ 1, /* 1 bits per pixel */
+ { 0 }, /* no bitplanes */
+ {STEP8(0, 1)}, /* x offsets */
+ {STEP8(0, 8)}, /* y offsets */
+ 8*8 /* every char takes 8 bytes */
};
static const gfx_layout quorum_charlayout =
{
- 8, 8, /* 8 x 8 characters */
- 160, /* 160 characters */
- 1, /* 1 bits per pixel */
- { 0 }, /* no bitplanes */
- /* x offsets */
- { 0, 1, 2, 3, 4, 5, 6, 7 },
- /* y offsets */
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
- 8*8 /* every char takes 8 bytes */
+ 8, 8, /* 8 x 8 characters */
+ 160, /* 160 characters */
+ 1, /* 1 bits per pixel */
+ { 0 }, /* no bitplanes */
+ {STEP8(0, 1)}, /* x offsets */
+ {STEP8(0, 8)}, /* y offsets */
+ 8*8 /* every char takes 8 bytes */
};
static const gfx_layout profi_8_charlayout =
{
- 8, 8, /* 8 x 8 characters */
- 224, /* 224 characters */
- 1, /* 1 bits per pixel */
- { 0 }, /* no bitplanes */
- /* x offsets */
- { 0, 1, 2, 3, 4, 5, 6, 7 },
- /* y offsets */
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
- 8*8 /* every char takes 8 bytes */
+ 8, 8, /* 8 x 8 characters */
+ 224, /* 224 characters */
+ 1, /* 1 bits per pixel */
+ { 0 }, /* no bitplanes */
+ {STEP8(0, 1)}, /* x offsets */
+ {STEP8(0, 8)}, /* y offsets */
+ 8*8 /* every char takes 8 bytes */
};
static GFXDECODE_START( gfx_scorpion )
- GFXDECODE_ENTRY( "maincpu", 0x17d00, spectrum_charlayout, 0, 8 )
+ GFXDECODE_ENTRY( "maincpu", 0x17d00, spectrum_charlayout, 7, 8 )
GFXDECODE_END
static GFXDECODE_START( gfx_profi )
- GFXDECODE_ENTRY( "maincpu", 0x17d00, spectrum_charlayout, 0, 8 )
- GFXDECODE_ENTRY( "maincpu", 0x1abfc, profi_8_charlayout, 0, 8 )
+ GFXDECODE_ENTRY( "maincpu", 0x17d00, spectrum_charlayout, 7, 8 )
+ GFXDECODE_ENTRY( "maincpu", 0x1abfc, profi_8_charlayout, 7, 8 )
/* There are more characters after this, that haven't been decoded */
GFXDECODE_END
static GFXDECODE_START( gfx_quorum )
- GFXDECODE_ENTRY( "maincpu", 0x1fb00, quorum_charlayout, 0, 8 )
+ GFXDECODE_ENTRY( "maincpu", 0x1fb00, quorum_charlayout, 7, 8 )
GFXDECODE_END
+rectangle scorpion_state::get_screen_area()
+{
+ return spectrum_state::get_screen_area();
+}
+
void scorpion_state::scorpion(machine_config &config)
{
- spectrum_128(config);
+ // Yellow PCB
+ spectrum(config);
+ m_ram->set_default_size("256K");
m_maincpu->set_addrmap(AS_PROGRAM, &scorpion_state::scorpion_mem);
m_maincpu->set_addrmap(AS_IO, &scorpion_state::scorpion_io);
m_maincpu->set_addrmap(AS_OPCODES, &scorpion_state::scorpion_switch);
+ m_maincpu->nomreq_cb().set_nop();
subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_scorpion);
- BETA_DISK(config, m_beta, 0);
-
- /* internal ram */
- m_ram->set_default_size("256K");
+ AY8912(config, "ay8912", X1 / 8).add_route(ALL_OUTPUTS, "mono", 0.25);
+ BETA_DISK(config, m_beta, 0);
TIMER(config, "nmi_timer").configure_periodic(FUNC(scorpion_state::nmi_check_callback), attotime::from_hz(50));
config.device_remove("exp");
diff --git a/src/mame/drivers/spec128.cpp b/src/mame/drivers/spec128.cpp
index aaa8d0ef3bb..c1ab6e53476 100644
--- a/src/mame/drivers/spec128.cpp
+++ b/src/mame/drivers/spec128.cpp
@@ -197,8 +197,7 @@ u8 spectrum_128_state::spectrum_128_rom_r(offs_t offset)
: ((u8*)m_bank_rom[0]->base())[offset];
}
-template <u8 Bank>
-void spectrum_128_state::spectrum_128_ram_w(offs_t offset, u8 data)
+template <u8 Bank> void spectrum_128_state::spectrum_128_ram_w(offs_t offset, u8 data)
{
u16 addr = 0x4000 * Bank + offset;
if (is_contended(addr)) content_early();
@@ -206,9 +205,10 @@ void spectrum_128_state::spectrum_128_ram_w(offs_t offset, u8 data)
((u8*)m_bank_ram[Bank]->base())[offset] = data;
}
+// Base 128 models typically don't share RAM in bank0. Reserved for extension in 256+.
+template void spectrum_128_state::spectrum_128_ram_w<0>(offs_t offset, u8 data);
-template <u8 Bank>
-u8 spectrum_128_state::spectrum_128_ram_r(offs_t offset)
+template <u8 Bank> u8 spectrum_128_state::spectrum_128_ram_r(offs_t offset)
{
u16 addr = 0x4000 * Bank + offset;
if (is_contended(addr)) content_early();
@@ -300,16 +300,13 @@ void spectrum_128_state::machine_start()
for (auto i = 1; i < 4; i++)
m_bank_ram[i]->configure_entries(0, m_ram->size() / 0x4000, m_ram->pointer(), 0x4000);
+
+ m_bank_ram[1]->set_entry(5); /* Bank 5 is always in 0x4000 - 0x7fff */
+ m_bank_ram[2]->set_entry(2); /* Bank 2 is always in 0x8000 - 0xbfff */
}
void spectrum_128_state::machine_reset()
{
- /* Bank 5 is always in 0x4000 - 0x7fff */
- m_bank_ram[1]->set_entry(5);
-
- /* Bank 2 is always in 0x8000 - 0xbfff */
- m_bank_ram[2]->set_entry(2);
-
spectrum_state::machine_reset();
/* set initial ram config */
diff --git a/src/mame/drivers/specpls3.cpp b/src/mame/drivers/specpls3.cpp
index f9c792ae584..952ac2eddb1 100644
--- a/src/mame/drivers/specpls3.cpp
+++ b/src/mame/drivers/specpls3.cpp
@@ -251,7 +251,6 @@ uint8_t specpls3_state::rom_r(offs_t offset)
: (m_port_1ffd_data & 0x01)
? ((u8*)m_bank_ram[0]->base())[offset]
: ((u8*)m_bank_rom[0]->base())[offset];
-
}
void specpls3_state::port_7ffd_w(offs_t offset, uint8_t data)