diff --git a/src/emu/machine/mos6530n.c b/src/emu/machine/mos6530n.c index 5be58765405..85f8b316637 100644 --- a/src/emu/machine/mos6530n.c +++ b/src/emu/machine/mos6530n.c @@ -29,37 +29,49 @@ const device_type MOS6532n = &device_creator; DEVICE_ADDRESS_MAP_START( rom_map, 8, mos6530_t ) + ADDRESS_MAP_GLOBAL_MASK(0x3ff) AM_RANGE(0x000, 0x3ff) AM_READ(rom_r) ADDRESS_MAP_END DEVICE_ADDRESS_MAP_START( ram_map, 8, mos6530_t ) + ADDRESS_MAP_GLOBAL_MASK(0x3f) AM_RANGE(0x00, 0x3f) AM_READWRITE(ram_r, ram_w) ADDRESS_MAP_END DEVICE_ADDRESS_MAP_START( io_map, 8, mos6530_t ) - AM_RANGE(0x00, 0x00) AM_READWRITE(pa_data_r, pa_data_w) - AM_RANGE(0x01, 0x01) AM_READWRITE(pa_ddr_r, pa_ddr_w) - AM_RANGE(0x02, 0x02) AM_READWRITE(pb_data_r, pb_data_w) - AM_RANGE(0x03, 0x03) AM_READWRITE(pb_ddr_r, pb_ddr_w) - AM_RANGE(0x04, 0x0f) AM_READ(timer_r) - AM_RANGE(0x04, 0x0f) AM_WRITE(timer_w) + ADDRESS_MAP_GLOBAL_MASK(0xf) + AM_RANGE(0x00, 0x00) AM_MIRROR(0x8) AM_READWRITE(pa_data_r, pa_data_w) + AM_RANGE(0x01, 0x01) AM_MIRROR(0x8) AM_READWRITE(pa_ddr_r, pa_ddr_w) + AM_RANGE(0x02, 0x02) AM_MIRROR(0x8) AM_READWRITE(pb_data_r, pb_data_w) + AM_RANGE(0x03, 0x03) AM_MIRROR(0x8) AM_READWRITE(pb_ddr_r, pb_ddr_w) + AM_RANGE(0x04, 0x07) AM_WRITE(timer_off_w) + AM_RANGE(0x0c, 0x0f) AM_WRITE(timer_on_w) + AM_RANGE(0x04, 0x04) AM_MIRROR(0x2) AM_READ(timer_off_r) + AM_RANGE(0x0c, 0x0c) AM_MIRROR(0x2) AM_READ(timer_on_r) + AM_RANGE(0x05, 0x05) AM_MIRROR(0xa) AM_READ(irq_r) ADDRESS_MAP_END DEVICE_ADDRESS_MAP_START( ram_map, 8, mos6532_t ) + ADDRESS_MAP_GLOBAL_MASK(0x7f) AM_RANGE(0x00, 0x7f) AM_READWRITE(ram_r, ram_w) ADDRESS_MAP_END DEVICE_ADDRESS_MAP_START( io_map, 8, mos6532_t ) - AM_RANGE(0x00, 0x00) AM_READWRITE(pa_data_r, pa_data_w) - AM_RANGE(0x01, 0x01) AM_READWRITE(pa_ddr_r, pa_ddr_w) - AM_RANGE(0x02, 0x02) AM_READWRITE(pb_data_r, pb_data_w) - AM_RANGE(0x03, 0x03) AM_READWRITE(pb_ddr_r, pb_ddr_w) - AM_RANGE(0x04, 0x0f) AM_READ(timer_r) - AM_RANGE(0x04, 0x07) AM_WRITE(edge_w) - AM_RANGE(0x14, 0x1f) AM_WRITE(timer_w) + ADDRESS_MAP_GLOBAL_MASK(0x1f) + AM_RANGE(0x00, 0x00) AM_MIRROR(0x18) AM_READWRITE(pa_data_r, pa_data_w) + AM_RANGE(0x01, 0x01) AM_MIRROR(0x18) AM_READWRITE(pa_ddr_r, pa_ddr_w) + AM_RANGE(0x02, 0x02) AM_MIRROR(0x18) AM_READWRITE(pb_data_r, pb_data_w) + AM_RANGE(0x03, 0x03) AM_MIRROR(0x18) AM_READWRITE(pb_ddr_r, pb_ddr_w) + AM_RANGE(0x14, 0x17) AM_WRITE(timer_off_w) + AM_RANGE(0x1c, 0x1f) AM_WRITE(timer_on_w) + AM_RANGE(0x04, 0x04) AM_MIRROR(0x12) AM_READ(timer_off_r) + AM_RANGE(0x0c, 0x0c) AM_MIRROR(0x12) AM_READ(timer_on_r) + AM_RANGE(0x05, 0x05) AM_MIRROR(0x1a) AM_READ(irq_r) + AM_RANGE(0x04, 0x07) AM_MIRROR(0x8) AM_WRITE(edge_w) ADDRESS_MAP_END + //************************************************************************** // LIVE DEVICE //************************************************************************** @@ -235,13 +247,14 @@ void mos6530_base_t::device_reset() m_pb_ddr = 0; m_ie_timer = false; - m_irq_timer = true; + m_irq_timer = false; m_ie_edge = false; m_irq_edge = false; m_positive = false; update_pa(); update_pb(); + update_irq(); live_abort(); } @@ -573,43 +586,56 @@ WRITE8_MEMBER( mos6530_base_t::pb_ddr_w ) // timer_r - //------------------------------------------------- -READ8_MEMBER( mos6530_base_t::timer_r ) +READ8_MEMBER( mos6530_base_t::timer_off_r ) { - UINT8 data = 0; - if (space.debugger_access()) return 0; - if (offset & 0x01) - { - data |= get_irq_flags(); - } - else - { - live_sync(); + return timer_r(false); +} - data = cur_live.value; +READ8_MEMBER( mos6530_base_t::timer_on_r ) +{ + if (space.debugger_access()) + return 0; - checkpoint(); - live_run(); + return timer_r(true); +} - m_ie_timer = BIT(offset, 3) ? true : false; - } +UINT8 mos6530_base_t::timer_r(bool ie) +{ + UINT8 data = 0; - bool irq_dirty = false; + live_sync(); - if (m_irq_timer) { - m_irq_timer = false; - irq_dirty = true; - } + m_ie_timer = ie; + m_irq_timer = false; + update_irq(); - if (m_irq_edge) { - m_irq_edge = false; - irq_dirty = true; - } + data = cur_live.value; - if (irq_dirty) { - update_irq(); + if (LOG_TIMER) logerror("%s %s %s '%s' Timer read %02x IE %u\n", machine().time().as_string(), machine().describe_context(), name(), tag(), data, m_ie_timer ? 1 : 0); + + checkpoint(); + live_run(); + + return data; +} + + +//------------------------------------------------- +// irq_r - +//------------------------------------------------- + +READ8_MEMBER( mos6530_base_t::irq_r ) +{ + UINT8 data = get_irq_flags(); + + if (!space.debugger_access()) { + if (m_irq_edge) { + m_irq_edge = false; + update_irq(); + } } return data; @@ -620,7 +646,17 @@ READ8_MEMBER( mos6530_base_t::timer_r ) // timer_w - //------------------------------------------------- -WRITE8_MEMBER( mos6530_base_t::timer_w ) +WRITE8_MEMBER( mos6530_base_t::timer_off_w ) +{ + timer_w(offset, data, false); +} + +WRITE8_MEMBER( mos6530_base_t::timer_on_w ) +{ + timer_w(offset, data, true); +} + +void mos6530_base_t::timer_w(offs_t offset, UINT8 data, bool ie) { live_sync(); @@ -633,15 +669,12 @@ WRITE8_MEMBER( mos6530_base_t::timer_w ) case 3: m_shift = 1024; break; } - m_ie_timer = BIT(offset, 3) ? true : false; + m_ie_timer = ie; + m_irq_timer = false; + update_irq(); if (LOG_TIMER) logerror("%s %s %s '%s' Timer value %02x shift %u IE %u\n", machine().time().as_string(), machine().describe_context(), name(), tag(), data, m_shift, m_ie_timer ? 1 : 0); - if (m_irq_timer) { - m_irq_timer = false; - update_irq(); - } - checkpoint(); if (cur_live.state != IDLE) { @@ -690,7 +723,6 @@ void mos6530_base_t::live_start() cur_live.next_state = -1; cur_live.value = m_timer; - cur_live.irq = false; checkpoint_live = cur_live; @@ -746,8 +778,6 @@ void mos6530_base_t::live_abort() cur_live.tm = attotime::never; cur_live.state = IDLE; cur_live.next_state = -1; - - cur_live.irq = false; } void mos6530_base_t::live_run(const attotime &limit) @@ -779,7 +809,6 @@ void mos6530_base_t::live_run(const attotime &limit) return; cur_live.value--; - cur_live.irq = true; if (LOG_TIMER) logerror("%s %s '%s' timer %02x IRQ 0\n", cur_live.tm.as_string(), name(), tag(), cur_live.value); diff --git a/src/emu/machine/mos6530n.h b/src/emu/machine/mos6530n.h index 51fbe3988c4..5c003d63fc4 100644 --- a/src/emu/machine/mos6530n.h +++ b/src/emu/machine/mos6530n.h @@ -265,6 +265,8 @@ protected: void edge_detect(int old, int state); void pa_w(int bit, int state); void pb_w(int bit, int state); + void timer_w(offs_t offset, UINT8 data, bool ie); + UINT8 timer_r(bool ie); DECLARE_READ8_MEMBER( rom_r ) { return m_region->base()[offset]; } DECLARE_READ8_MEMBER( ram_r ) { return m_ram[offset]; } @@ -277,8 +279,11 @@ protected: DECLARE_WRITE8_MEMBER( pa_ddr_w ); DECLARE_READ8_MEMBER( pb_ddr_r ) { return m_pb_ddr; } DECLARE_WRITE8_MEMBER( pb_ddr_w ); - DECLARE_READ8_MEMBER( timer_r ); - DECLARE_WRITE8_MEMBER( timer_w ); + DECLARE_READ8_MEMBER( timer_off_r ); + DECLARE_READ8_MEMBER( timer_on_r ); + DECLARE_READ8_MEMBER( irq_r ); + DECLARE_WRITE8_MEMBER( timer_off_w ); + DECLARE_WRITE8_MEMBER( timer_on_w ); DECLARE_WRITE8_MEMBER( edge_w ); optional_shared_ptr m_ram; @@ -352,7 +357,6 @@ protected: attotime period; int state, next_state; UINT8 value; - bool irq; }; live_info cur_live, checkpoint_live;