diff options
Diffstat (limited to 'src/mess')
-rw-r--r-- | src/mess/includes/ondra.h | 46 | ||||
-rw-r--r-- | src/mess/machine/ondra.c | 71 | ||||
-rw-r--r-- | src/mess/video/ondra.c | 4 |
3 files changed, 84 insertions, 37 deletions
diff --git a/src/mess/includes/ondra.h b/src/mess/includes/ondra.h index 427441c4763..ca2cac6b647 100644 --- a/src/mess/includes/ondra.h +++ b/src/mess/includes/ondra.h @@ -7,11 +7,33 @@ #ifndef ONDRA_H_ #define ONDRA_H_ +#include "imagedev/cassette.h" +#include "machine/ram.h" + class ondra_state : public driver_device { public: ondra_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) { } + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_cassette(*this, CASSETTE_TAG) + , m_ram(*this, RAM_TAG) + , m_region_maincpu(*this, "maincpu") + , m_bank1(*this, "bank1") + , m_bank2(*this, "bank2") + , m_bank3(*this, "bank3") + , m_line0(*this, "LINE0") + , m_line1(*this, "LINE1") + , m_line2(*this, "LINE2") + , m_line3(*this, "LINE3") + , m_line4(*this, "LINE4") + , m_line5(*this, "LINE5") + , m_line6(*this, "LINE6") + , m_line7(*this, "LINE7") + , m_line8(*this, "LINE8") + , m_line9(*this, "LINE9") + , m_nmi(*this, "NMI") + { } UINT8 m_video_enable; UINT8 m_bank1_status; @@ -26,6 +48,28 @@ public: UINT32 screen_update_ondra(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(ondra_interrupt); TIMER_CALLBACK_MEMBER(nmi_check_callback); + +protected: + required_device<cpu_device> m_maincpu; + required_device<cassette_image_device> m_cassette; + required_device<ram_device> m_ram; + required_memory_region m_region_maincpu; + required_memory_bank m_bank1; + required_memory_bank m_bank2; + required_memory_bank m_bank3; + required_ioport m_line0; + required_ioport m_line1; + required_ioport m_line2; + required_ioport m_line3; + required_ioport m_line4; + required_ioport m_line5; + required_ioport m_line6; + required_ioport m_line7; + required_ioport m_line8; + required_ioport m_line9; + required_ioport m_nmi; + + void ondra_update_banks(); }; #endif diff --git a/src/mess/machine/ondra.c b/src/mess/machine/ondra.c index f51bd814a35..83e75302fe3 100644 --- a/src/mess/machine/ondra.c +++ b/src/mess/machine/ondra.c @@ -9,52 +9,55 @@ #include "emu.h" #include "cpu/z80/z80.h" -#include "imagedev/cassette.h" #include "includes/ondra.h" -#include "machine/ram.h" - - -static cassette_image_device *cassette_device_image(running_machine &machine) -{ - return machine.device<cassette_image_device>(CASSETTE_TAG); -} READ8_MEMBER(ondra_state::ondra_keyboard_r) { UINT8 retVal = 0x00; - UINT8 ondra_keyboard_line = offset & 0x000f; - static const char *const keynames[] = { "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8", "LINE9" }; - double valcas = (cassette_device_image(machine())->input()); + double valcas = m_cassette->input(); + if ( valcas < 0.00) { retVal = 0x80; } - if (ondra_keyboard_line > 9) { - retVal |= 0x1f; - } else { - retVal |= ioport(keynames[ondra_keyboard_line])->read(); + + switch ( offset & 0x0f ) + { + case 0: retVal |= m_line0->read(); break; + case 1: retVal |= m_line1->read(); break; + case 2: retVal |= m_line2->read(); break; + case 3: retVal |= m_line3->read(); break; + case 4: retVal |= m_line4->read(); break; + case 5: retVal |= m_line5->read(); break; + case 6: retVal |= m_line6->read(); break; + case 7: retVal |= m_line7->read(); break; + case 8: retVal |= m_line8->read(); break; + case 9: retVal |= m_line9->read(); break; + default: retVal |= 0x1f; break; } + return retVal; } -static void ondra_update_banks(running_machine &machine) +void ondra_state::ondra_update_banks() { - ondra_state *state = machine.driver_data<ondra_state>(); - UINT8 *mem = state->memregion("maincpu")->base(); - if (state->m_bank1_status==0) { - machine.device("maincpu")->memory().space(AS_PROGRAM).unmap_write(0x0000, 0x3fff); - state->membank("bank1")->set_base(mem + 0x010000); + address_space &space = m_maincpu->space(AS_PROGRAM); + UINT8 *mem = m_region_maincpu->base(); + + if (m_bank1_status==0) { + space.unmap_write(0x0000, 0x3fff); + m_bank1->set_base(mem + 0x010000); } else { - machine.device("maincpu")->memory().space(AS_PROGRAM).install_write_bank(0x0000, 0x3fff, "bank1"); - state->membank("bank1")->set_base(machine.device<ram_device>(RAM_TAG)->pointer() + 0x0000); + space.install_write_bank(0x0000, 0x3fff, "bank1"); + m_bank1->set_base(m_ram->pointer() + 0x0000); } - state->membank("bank2")->set_base(machine.device<ram_device>(RAM_TAG)->pointer() + 0x4000); - if (state->m_bank2_status==0) { - machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_bank(0xe000, 0xffff, "bank3"); - state->membank("bank3")->set_base(machine.device<ram_device>(RAM_TAG)->pointer() + 0xe000); + 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 { - machine.device("maincpu")->memory().space(AS_PROGRAM).unmap_write(0xe000, 0xffff); - machine.device("maincpu")->memory().space(AS_PROGRAM).install_read_handler (0xe000, 0xffff, read8_delegate(FUNC(ondra_state::ondra_keyboard_r),state)); + space.unmap_write(0xe000, 0xffff); + space.install_read_handler (0xe000, 0xffff, read8_delegate(FUNC(ondra_state::ondra_keyboard_r),this)); } } @@ -63,8 +66,8 @@ WRITE8_MEMBER(ondra_state::ondra_port_03_w) m_video_enable = data & 1; m_bank1_status = (data >> 1) & 1; m_bank2_status = (data >> 2) & 1; - ondra_update_banks(machine()); - cassette_device_image(machine())->output(((data >> 3) & 1) ? -1.0 : +1.0); + ondra_update_banks(); + m_cassette->output(((data >> 3) & 1) ? -1.0 : +1.0); } WRITE8_MEMBER(ondra_state::ondra_port_09_w) @@ -77,9 +80,9 @@ WRITE8_MEMBER(ondra_state::ondra_port_0a_w) TIMER_CALLBACK_MEMBER(ondra_state::nmi_check_callback) { - if ((machine().root_device().ioport("NMI")->read() & 1) == 1) + if ((m_nmi->read() & 1) == 1) { - machine().device("maincpu")->execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE); + m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); } } @@ -87,7 +90,7 @@ void ondra_state::machine_reset() { m_bank1_status = 0; m_bank2_status = 0; - ondra_update_banks(machine()); + ondra_update_banks(); } void ondra_state::machine_start() diff --git a/src/mess/video/ondra.c b/src/mess/video/ondra.c index 49169f2d35b..f55385ebcdb 100644 --- a/src/mess/video/ondra.c +++ b/src/mess/video/ondra.c @@ -29,8 +29,8 @@ UINT32 ondra_state::screen_update_ondra(screen_device &screen, bitmap_ind16 &bit { for (y = 127; y >=0; y--) { - code1 = machine().device<ram_device>(RAM_TAG)->pointer()[0xd700 + Vaddr + 0x80]; - code2 = machine().device<ram_device>(RAM_TAG)->pointer()[0xd700 + Vaddr + 0x00]; + code1 = m_ram->pointer()[0xd700 + Vaddr + 0x80]; + code2 = m_ram->pointer()[0xd700 + Vaddr + 0x00]; for (b = 0; b < 8; b++) { bitmap.pix16(2*y, x*8+b) = ((code1 << b) & 0x80) ? 1 : 0; |