diff options
Diffstat (limited to 'src/mame/machine/ondra.cpp')
-rw-r--r-- | src/mame/machine/ondra.cpp | 131 |
1 files changed, 84 insertions, 47 deletions
diff --git a/src/mame/machine/ondra.cpp b/src/mame/machine/ondra.cpp index 35614a3f950..75c9875f9a5 100644 --- a/src/mame/machine/ondra.cpp +++ b/src/mame/machine/ondra.cpp @@ -12,81 +12,118 @@ #include "emu.h" #include "includes/ondra.h" -#include "cpu/z80/z80.h" - -uint8_t ondra_state::ondra_keyboard_r(offs_t offset) +u8 ondra_state::keyboard_r(offs_t offset) { - uint8_t retVal = 0x00; + u8 data = 0x60; + offset &= 15; - double const valcas = m_cassette->input(); - if (valcas < 0.00) - retVal |= 0x80; + data |= (m_cassette->input() < 0.00) ? 0x80: 0; - if ((offset & 0x0f) < m_lines.size()) - retVal |= m_lines[offset & 0x0f]->read(); + if (offset < m_io_keyboard.size()) + data |= (m_io_keyboard[offset]->read() & 0x1f); else - retVal |= 0x1f; + data |= 0x1f; - return retVal; + return data; } -void ondra_state::ondra_update_banks() +void ondra_state::update_banks() { address_space &space = m_maincpu->space(AS_PROGRAM); - uint8_t *mem = m_region_maincpu->base(); - - if (m_bank1_status==0) { - space.unmap_write(0x0000, 0x3fff); - m_bank1->set_base(mem + 0x010000); - } else { - space.install_write_bank(0x0000, 0x3fff, "bank1"); - m_bank1->set_base(m_ram->pointer() + 0x0000); + u8 *m = m_rom->base(); + u8 *r = m_ram->pointer(); + + if (BIT(m_bank_status, 0) != BIT(m_bank_old, 0)) + { + if (BIT(m_bank_status, 0)) + { + space.install_write_bank(0x0000, 0x3fff, "bank1"); + m_bank1->set_base(r); + } + else + { + space.unmap_write(0x0000, 0x3fff); + m_bank1->set_base(m); + } } - m_bank2->set_base(m_ram->pointer() + 0x4000); - if (m_bank2_status==0) { - space.install_readwrite_bank(0xe000, 0xffff, "bank3"); - m_bank3->set_base(m_ram->pointer() + 0xe000); - } else { - space.unmap_write(0xe000, 0xffff); - space.install_read_handler (0xe000, 0xffff, read8sm_delegate(*this, FUNC(ondra_state::ondra_keyboard_r))); + + if (BIT(m_bank_status, 1) != BIT(m_bank_old, 1)) + { + if (BIT(m_bank_status, 1)) + { + space.unmap_write(0xe000, 0xffff); + space.install_read_handler (0xe000, 0xffff, read8sm_delegate(*this, FUNC(ondra_state::keyboard_r))); + } + else + { + space.install_readwrite_bank(0xe000, 0xffff, "bank3"); + m_bank3->set_base(r + 0xe000); + } } -} -void ondra_state::ondra_port_03_w(uint8_t data) -{ - m_video_enable = data & 1; - m_bank1_status = (data >> 1) & 1; - m_bank2_status = (data >> 2) & 1; - ondra_update_banks(); - m_cassette->output(((data >> 3) & 1) ? -1.0 : +1.0); + m_bank_old = m_bank_status; } -void ondra_state::ondra_port_09_w(uint8_t data) +/* +0 - video on/off +1 - banking +2 - banking +3 - cassette out +4 - A0 on pits +5 - A1 on pits */ +void ondra_state::port03_w(u8 data) { + if (BIT(data, 1, 2) != m_bank_status) + { + m_bank_status = BIT(data, 1, 2); + update_banks(); + } + + m_video_enable = BIT(data, 0); + m_cassette->output(BIT(data, 3) ? -1.0 : +1.0); } -void ondra_state::ondra_port_0a_w(uint8_t data) + +// external connection +u8 ondra_state::port09_r() { + return 0xff; } -TIMER_CALLBACK_MEMBER(ondra_state::nmi_check_callback) +/* +0 - a LED next to keyboard +1 - a LED next to keyboard +2 - external +3 - external +4 - cassette relay +5 - speaker +6 - speaker +7 - speaker */ +void ondra_state::port0a_w(u8 data) { - if ((m_nmi->read() & 1) == 1) - { - m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); - } + static u16 tones[8] = { 0, 110, 156, 220, 311, 440, 622, 880 }; // a guess + + m_cassette->change_state(BIT(data,4) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR); + u16 tone = tones[BIT(data, 5, 3)]; + m_beep->set_state(tone? 1 : 0); + if (tone) + m_beep->set_clock(tone); } void ondra_state::machine_reset() { - m_bank1_status = 0; - m_bank2_status = 0; - ondra_update_banks(); + m_beep->set_state(0); + m_video_enable = 0; + m_bank_status = 0; + m_bank_old = 0xff; + update_banks(); + m_bank2->set_base(m_ram->pointer() + 0x4000); } void ondra_state::machine_start() { - m_nmi_check_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(ondra_state::nmi_check_callback), this)); - m_nmi_check_timer->adjust(attotime::from_hz(10), 0, attotime::from_hz(10)); + save_item(NAME(m_video_enable)); + save_item(NAME(m_bank_status)); + save_item(NAME(m_bank_old)); } |