summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/ondra.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/ondra.cpp')
-rw-r--r--src/mame/machine/ondra.cpp131
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));
}