summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers
diff options
context:
space:
mode:
author holub <andrei.holub@gmail.com>2022-05-13 03:21:15 -0400
committer GitHub <noreply@github.com>2022-05-13 17:21:15 +1000
commit51a0b7020883510300296cf77e3c8c22f70a6a02 (patch)
treed125288fea5d49dc5432f434c694af9253780975 /src/mame/drivers
parent98b14fa8ae8451ccf1bb6ff6b82c1db775b9d8cf (diff)
zx spectrum drivers: Restore irq length == 32 / border timings. (#9711)
Diffstat (limited to 'src/mame/drivers')
-rw-r--r--src/mame/drivers/pentagon.cpp4
-rw-r--r--src/mame/drivers/spec128.cpp19
-rw-r--r--src/mame/drivers/specpls3.cpp5
-rw-r--r--src/mame/drivers/spectrum.cpp16
4 files changed, 23 insertions, 21 deletions
diff --git a/src/mame/drivers/pentagon.cpp b/src/mame/drivers/pentagon.cpp
index 9040db14f7f..22df60484dd 100644
--- a/src/mame/drivers/pentagon.cpp
+++ b/src/mame/drivers/pentagon.cpp
@@ -217,8 +217,8 @@ void pentagon_state::machine_reset()
void pentagon_state::video_start()
{
- m_frame_invert_count = 16;
- m_screen_location = m_ram->pointer() + (5 << 14);
+ spectrum_128_state::video_start();
+ m_contention_pattern = {};
}
static const gfx_layout spectrum_charlayout =
diff --git a/src/mame/drivers/spec128.cpp b/src/mame/drivers/spec128.cpp
index 4c545b9adb4..f22f6b2af68 100644
--- a/src/mame/drivers/spec128.cpp
+++ b/src/mame/drivers/spec128.cpp
@@ -167,9 +167,9 @@ resulting mess can be seen in the F4 viewer display.
void spectrum_128_state::video_start()
{
- m_frame_invert_count = 16;
+ spectrum_state::video_start();
m_screen_location = m_ram->pointer() + (5 << 14);
- m_contention_pattern = {6, 5, 4, 3, 2, 1, 0, 0};
+ m_border4t_render_at = 6;
}
uint8_t spectrum_128_state::spectrum_128_pre_opcode_fetch_r(offs_t offset)
@@ -230,8 +230,6 @@ void spectrum_128_state::spectrum_128_port_7ffd_w(offs_t offset, uint8_t data)
/* disable paging? */
if (m_port_7ffd_data & 0x20) return;
- if ((m_port_7ffd_data ^ data) & 0x08) m_screen->update_now();
-
/* store new state */
m_port_7ffd_data = data;
@@ -293,6 +291,10 @@ void spectrum_128_state::spectrum_128_fetch(address_map &map)
void spectrum_128_state::machine_start()
{
+ spectrum_state::machine_start();
+
+ save_item(NAME(m_port_7ffd_data));
+
/* rom 0 is 128K rom, rom 1 is 48 BASIC */
memory_region *rom = memregion("maincpu");
m_bank_rom[0]->configure_entries(0, 2, rom->base() + 0x10000, 0x4000);
@@ -313,22 +315,19 @@ void spectrum_128_state::machine_reset()
/* set initial ram config */
m_port_7ffd_data = 0;
- m_port_1ffd_data = -1;
spectrum_128_update_memory();
}
bool spectrum_128_state::is_vram_write(offs_t offset) {
- // TODO respect banks 2,5 mapped to 0xc000
- return (BIT(m_port_7ffd_data, 3))
- ? offset >= 0x8000 && offset < 0x9b00
+ return (BIT(m_port_7ffd_data, 3) && m_bank_ram[3]->entry() == 7)
+ ? offset >= 0xc000 && offset < 0xdb00
: spectrum_state::is_vram_write(offset);
}
bool spectrum_128_state::is_contended(offs_t offset) {
- // Memory banks 1,3,5 and 7 are contended
u8 bank = m_bank_ram[3]->entry();
return spectrum_state::is_contended(offset)
- || ((offset >= 0xc000 && offset <= 0xffff) && (bank && 1));
+ || ((offset >= 0xc000 && offset <= 0xffff) && (bank && 1)); // Memory banks 1,3,5 and 7 are contended
}
static const gfx_layout spectrum_charlayout =
diff --git a/src/mame/drivers/specpls3.cpp b/src/mame/drivers/specpls3.cpp
index ac8f1a99db6..a65c8faf458 100644
--- a/src/mame/drivers/specpls3.cpp
+++ b/src/mame/drivers/specpls3.cpp
@@ -266,8 +266,6 @@ void specpls3_state::port_7ffd_w(offs_t offset, uint8_t data)
/* paging disabled? */
if (m_port_7ffd_data & 0x20) return;
- if ((m_port_7ffd_data ^ data) & 0x08) m_screen->update_now();
-
/* store new state */
m_port_7ffd_data = data;
@@ -342,6 +340,8 @@ void specpls3_state::machine_start()
{
spectrum_128_state::machine_start();
+ save_item(NAME(m_port_1ffd_data));
+
// reconfigure ROMs
memory_region *rom = memregion("maincpu");
m_bank_rom[0]->configure_entries(0, 4, rom->base() + 0x10000, 0x4000);
@@ -352,6 +352,7 @@ void specpls3_state::machine_start()
void specpls3_state::machine_reset()
{
/* Initial configuration */
+ m_port_fe_data = -1;
m_port_7ffd_data = 0;
m_port_1ffd_data = 0;
plus3_update_memory();
diff --git a/src/mame/drivers/spectrum.cpp b/src/mame/drivers/spectrum.cpp
index 4b1d5cecac2..b99227983df 100644
--- a/src/mame/drivers/spectrum.cpp
+++ b/src/mame/drivers/spectrum.cpp
@@ -727,10 +727,14 @@ void spectrum_state::init_spectrum()
void spectrum_state::machine_start()
{
save_item(NAME(m_port_fe_data));
+ save_item(NAME(m_int_at));
}
void spectrum_state::machine_reset()
{
+ /* Initial value/behaviour of FE port is not confirmed. Startup of real devices produce 'random' border
+ color which need to be investigated. */
+ m_port_fe_data = -1;
m_port_7ffd_data = -1;
m_port_1ffd_data = -1;
}
@@ -756,8 +760,10 @@ void spectrum_state::device_timer(emu_timer &timer, device_timer_id id, int para
switch (id)
{
case TIMER_IRQ_ON:
- m_maincpu->set_input_line(0, HOLD_LINE);
- timer_set(m_maincpu->clocks_to_attotime(32), TIMER_IRQ_OFF, 0);
+ m_int_at = m_maincpu->total_cycles();
+ m_int_at -= m_maincpu->attotime_to_cycles(m_maincpu->local_time() - machine().time());
+ m_maincpu->set_input_line(0, ASSERT_LINE);
+ m_irq_off_timer->adjust(m_maincpu->clocks_to_attotime(32));
break;
case TIMER_IRQ_OFF:
m_maincpu->set_input_line(0, CLEAR_LINE);
@@ -767,13 +773,9 @@ void spectrum_state::device_timer(emu_timer &timer, device_timer_id id, int para
}
}
-attotime spectrum_state::time_until_int() {
- return m_screen->time_until_pos(0, get_screen_area().left());
-};
-
INTERRUPT_GEN_MEMBER(spectrum_state::spec_interrupt)
{
- timer_set(time_until_int(), TIMER_IRQ_ON, 0);
+ timer_set(m_screen->time_until_pos(0, get_screen_area().left()), TIMER_IRQ_ON);
}
void spectrum_state::spectrum_common(machine_config &config)