From fa2e53132143ac5d28baea7716f56f9c04e898d6 Mon Sep 17 00:00:00 2001 From: npwoods Date: Sun, 16 Jul 2017 08:55:59 -0400 Subject: Cleaned up the MC-10 driver (#2480) --- src/mame/drivers/mc10.cpp | 209 +++++++++++++++++++++++++--------------------- 1 file changed, 112 insertions(+), 97 deletions(-) diff --git a/src/mame/drivers/mc10.cpp b/src/mame/drivers/mc10.cpp index 70649853210..3afe1d2f451 100644 --- a/src/mame/drivers/mc10.cpp +++ b/src/mame/drivers/mc10.cpp @@ -24,14 +24,8 @@ #include "formats/coco_cas.h" -//printer state -enum +namespace { - PRINTER_WAIT, - PRINTER_REC, - PRINTER_DONE -}; - /*************************************************************************** TYPE DEFINITIONS @@ -40,16 +34,32 @@ enum class mc10_state : public driver_device { public: - mc10_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_mc6847(*this, "mc6847") - , m_ef9345(*this, "ef9345") - , m_dac(*this, "dac") - , m_ram(*this, RAM_TAG) - , m_cassette(*this, "cassette") - , m_printer(*this, "printer") - { } + mc10_state(const machine_config &mconfig, device_type type, const char *tag); + + DECLARE_READ8_MEMBER(mc10_bfff_r); + DECLARE_WRITE8_MEMBER(mc10_bfff_w); + DECLARE_READ8_MEMBER(mc10_port1_r); + DECLARE_WRITE8_MEMBER(mc10_port1_w); + DECLARE_READ8_MEMBER(mc10_port2_r); + DECLARE_WRITE8_MEMBER(mc10_port2_w); + DECLARE_READ8_MEMBER(alice90_bfff_r); + DECLARE_WRITE8_MEMBER(alice32_bfff_w); + + DECLARE_READ8_MEMBER(mc6847_videoram_r); + TIMER_DEVICE_CALLBACK_MEMBER(alice32_scanline); + +protected: + // device-level overrides + virtual void driver_start() override; + +private: + //printer state + enum class printer_state : uint8_t + { + WAIT, + REC, + DONE + }; required_device m_maincpu; optional_device m_mc6847; @@ -58,6 +68,9 @@ public: required_device m_ram; required_device m_cassette; required_device m_printer; + required_ioport_array<8> m_pb; + required_memory_bank m_bank1; + required_memory_bank m_bank2; uint8_t *m_ram_base; uint32_t m_ram_size; @@ -67,19 +80,9 @@ public: // printer uint8_t m_pr_buffer; uint8_t m_pr_counter; - uint8_t m_pr_state; - - DECLARE_READ8_MEMBER( mc10_bfff_r ); - DECLARE_WRITE8_MEMBER( mc10_bfff_w ); - DECLARE_READ8_MEMBER( alice90_bfff_r ); - DECLARE_WRITE8_MEMBER( alice32_bfff_w ); - DECLARE_READ8_MEMBER( mc10_port1_r ); - DECLARE_WRITE8_MEMBER( mc10_port1_w ); - DECLARE_READ8_MEMBER( mc10_port2_r ); - DECLARE_WRITE8_MEMBER( mc10_port2_w ); - DECLARE_READ8_MEMBER( mc6847_videoram_r ); - DECLARE_DRIVER_INIT(mc10); - TIMER_DEVICE_CALLBACK_MEMBER(alice32_scanline); + printer_state m_pr_state; + + uint8_t read_keyboard_strobe(bool single_line); }; @@ -87,48 +90,36 @@ public: MEMORY MAPPED I/O ***************************************************************************/ -READ8_MEMBER( mc10_state::mc10_bfff_r ) +uint8_t mc10_state::read_keyboard_strobe(bool single_line) { + bool read = false; uint8_t result = 0xff; - if (!BIT(m_keyboard_strobe, 0)) result &= ioport("pb0")->read(); - if (!BIT(m_keyboard_strobe, 1)) result &= ioport("pb1")->read(); - if (!BIT(m_keyboard_strobe, 2)) result &= ioport("pb2")->read(); - if (!BIT(m_keyboard_strobe, 3)) result &= ioport("pb3")->read(); - if (!BIT(m_keyboard_strobe, 4)) result &= ioport("pb4")->read(); - if (!BIT(m_keyboard_strobe, 5)) result &= ioport("pb5")->read(); - if (!BIT(m_keyboard_strobe, 6)) result &= ioport("pb6")->read(); - if (!BIT(m_keyboard_strobe, 7)) result &= ioport("pb7")->read(); - + for (int i = m_pb.size() - 1; (i >= 0) && (!read || !single_line); i--) + { + if (!BIT(m_keyboard_strobe, i)) + { + result &= m_pb[i]->read(); + read = true; + } + } return result; } -READ8_MEMBER( mc10_state::alice90_bfff_r ) -{ - uint8_t result = 0xff; - if (!BIT(m_keyboard_strobe, 7)) result &= ioport("pb7")->read(); - else - if (!BIT(m_keyboard_strobe, 6)) result &= ioport("pb6")->read(); - else - if (!BIT(m_keyboard_strobe, 5)) result &= ioport("pb5")->read(); - else - if (!BIT(m_keyboard_strobe, 4)) result &= ioport("pb4")->read(); - else - if (!BIT(m_keyboard_strobe, 3)) result &= ioport("pb3")->read(); - else - if (!BIT(m_keyboard_strobe, 2)) result &= ioport("pb2")->read(); - else - if (!BIT(m_keyboard_strobe, 1)) result &= ioport("pb1")->read(); - else - if (!BIT(m_keyboard_strobe, 0)) result &= ioport("pb0")->read(); +READ8_MEMBER( mc10_state::mc10_bfff_r ) +{ + return read_keyboard_strobe(false); +} - return result; +READ8_MEMBER( mc10_state::alice90_bfff_r ) +{ + return read_keyboard_strobe(true); } WRITE8_MEMBER( mc10_state::mc10_bfff_w ) { - /* bit 2 to 6, mc6847 mode lines */ + // bit 2 to 6, mc6847 mode lines m_mc6847->gm2_w(BIT(data, 2)); m_mc6847->intext_w(BIT(data, 2)); m_mc6847->gm1_w(BIT(data, 3)); @@ -136,13 +127,13 @@ WRITE8_MEMBER( mc10_state::mc10_bfff_w ) m_mc6847->ag_w(BIT(data, 5)); m_mc6847->css_w(BIT(data, 6)); - /* bit 7, dac output */ + // bit 7, dac output m_dac->write(BIT(data, 7)); } WRITE8_MEMBER( mc10_state::alice32_bfff_w ) { - /* bit 7, dac output */ + // bit 7, dac output m_dac->write(BIT(data, 7)); } @@ -167,47 +158,47 @@ READ8_MEMBER( mc10_state::mc10_port2_r ) { uint8_t result = 0xeb; - /* bit 1, keyboard line pa6 */ - if (!BIT(m_keyboard_strobe, 0)) result &= ioport("pb0")->read() >> 5; - if (!BIT(m_keyboard_strobe, 2)) result &= ioport("pb2")->read() >> 5; - if (!BIT(m_keyboard_strobe, 7)) result &= ioport("pb7")->read() >> 5; + // bit 1, keyboard line pa6 + if (!BIT(m_keyboard_strobe, 0)) result &= m_pb[0]->read() >> 5; + if (!BIT(m_keyboard_strobe, 2)) result &= m_pb[2]->read() >> 5; + if (!BIT(m_keyboard_strobe, 7)) result &= m_pb[7]->read() >> 5; - /* bit 2, printer ots input */ - result |= (m_printer->is_ready() ? 0 : 4); + // bit 2, printer ots input + result |= (m_printer->is_ready() ? 1 : 0) << 2; - /* bit 3, rs232 input */ + // bit 3, rs232 input - /* bit 4, cassette input */ - result |= ((m_cassette)->input() >= 0 ? 1 : 0) << 4; + // bit 4, cassette input + result |= (m_cassette->input() >= 0 ? 1 : 0) << 4; return result; } WRITE8_MEMBER( mc10_state::mc10_port2_w ) { - /* bit 0, cassette & printer output */ + // bit 0, cassette & printer output m_cassette->output( BIT(data, 0) ? +1.0 : -1.0); switch (m_pr_state) { - case PRINTER_WAIT: + case printer_state::WAIT: if (BIT(m_port2, 0) && !BIT(data, 0)) { - m_pr_state = PRINTER_REC; + m_pr_state = printer_state::REC; m_pr_counter = 8; m_pr_buffer = 0; } break; - case PRINTER_REC: + case printer_state::REC: if (m_pr_counter--) m_pr_buffer |= (BIT(data,0)<<(7-m_pr_counter)); else - m_pr_state = PRINTER_DONE; + m_pr_state = printer_state::DONE; break; - case PRINTER_DONE: + case printer_state::DONE: if (BIT(data,0)) m_printer->output(m_pr_buffer); - m_pr_state = PRINTER_WAIT; + m_pr_state = printer_state::WAIT; break; } @@ -237,8 +228,27 @@ TIMER_DEVICE_CALLBACK_MEMBER(mc10_state::alice32_scanline) DRIVER INIT ***************************************************************************/ -DRIVER_INIT_MEMBER(mc10_state,mc10) +mc10_state::mc10_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_mc6847(*this, "mc6847") + , m_ef9345(*this, "ef9345") + , m_dac(*this, "dac") + , m_ram(*this, RAM_TAG) + , m_cassette(*this, "cassette") + , m_printer(*this, "printer") + , m_pb(*this, "pb%u", 0) + , m_bank1(*this, "bank1") + , m_bank2(*this, "bank2") { +} + + +void mc10_state::driver_start() +{ + // call base device_start + driver_device::driver_start(); + address_space &prg = m_maincpu->space(AS_PROGRAM); /* initialize keyboard strobe */ @@ -247,20 +257,22 @@ DRIVER_INIT_MEMBER(mc10_state,mc10) /* initialize memory */ m_ram_base = m_ram->pointer(); m_ram_size = m_ram->size(); - m_pr_state = PRINTER_WAIT; + m_pr_state = printer_state::WAIT; - membank("bank1")->set_base(m_ram_base); + m_bank1->set_base(m_ram_base); /* initialize memory expansion */ if (m_ram_size == 20*1024) - membank("bank2")->set_base(m_ram_base + 0x1000); + m_bank2->set_base(m_ram_base + 0x1000); else if (m_ram_size == 24*1024) - membank("bank2")->set_base(m_ram_base + 0x2000); + m_bank2->set_base(m_ram_base + 0x2000); else if (m_ram_size != 32*1024) //ensure that is not alice90 prg.nop_readwrite(0x5000, 0x8fff); /* register for state saving */ save_item(NAME(m_keyboard_strobe)); + save_item(NAME(m_pr_state)); + save_item(NAME(m_pr_counter)); //for alice32 force port4 DDR to 0xff at startup if (!strcmp(machine().system().name, "alice32") || !strcmp(machine().system().name, "alice90")) @@ -272,7 +284,7 @@ DRIVER_INIT_MEMBER(mc10_state,mc10) ADDRESS MAPS ***************************************************************************/ -static ADDRESS_MAP_START( mc10_mem, AS_PROGRAM, 8 , mc10_state) +ADDRESS_MAP_START( mc10_mem, AS_PROGRAM, 8 , mc10_state) AM_RANGE(0x0100, 0x3fff) AM_NOP /* unused */ AM_RANGE(0x4000, 0x4fff) AM_RAMBANK("bank1") /* 4k internal ram */ AM_RANGE(0x5000, 0x8fff) AM_RAMBANK("bank2") /* 16k memory expansion */ @@ -281,12 +293,12 @@ static ADDRESS_MAP_START( mc10_mem, AS_PROGRAM, 8 , mc10_state) AM_RANGE(0xe000, 0xffff) AM_ROM AM_REGION("maincpu", 0x0000) /* ROM */ ADDRESS_MAP_END -static ADDRESS_MAP_START( mc10_io, AS_IO, 8 , mc10_state) +ADDRESS_MAP_START( mc10_io, AS_IO, 8 , mc10_state) AM_RANGE(M6801_PORT1, M6801_PORT1) AM_READWRITE(mc10_port1_r, mc10_port1_w) AM_RANGE(M6801_PORT2, M6801_PORT2) AM_READWRITE(mc10_port2_r, mc10_port2_w) ADDRESS_MAP_END -static ADDRESS_MAP_START( alice32_mem, AS_PROGRAM, 8 , mc10_state) +ADDRESS_MAP_START( alice32_mem, AS_PROGRAM, 8 , mc10_state) AM_RANGE(0x0100, 0x2fff) AM_NOP /* unused */ AM_RANGE(0x3000, 0x4fff) AM_RAMBANK("bank1") /* 8k internal ram */ AM_RANGE(0x5000, 0x8fff) AM_RAMBANK("bank2") /* 16k memory expansion */ @@ -296,7 +308,7 @@ static ADDRESS_MAP_START( alice32_mem, AS_PROGRAM, 8 , mc10_state) AM_RANGE(0xc000, 0xffff) AM_ROM AM_REGION("maincpu", 0x0000) /* ROM */ ADDRESS_MAP_END -static ADDRESS_MAP_START( alice90_mem, AS_PROGRAM, 8 , mc10_state) +ADDRESS_MAP_START( alice90_mem, AS_PROGRAM, 8 , mc10_state) AM_RANGE(0x0100, 0x2fff) AM_NOP /* unused */ AM_RANGE(0x3000, 0xafff) AM_RAMBANK("bank1") /* 32k internal ram */ AM_RANGE(0xbf20, 0xbf29) AM_DEVREADWRITE("ef9345", ef9345_device, data_r, data_w) @@ -321,7 +333,7 @@ ADDRESS_MAP_END */ /* Port Key description Emulated key Natural key Shift 1 Shift 2 (Ctrl) */ -static INPUT_PORTS_START( mc10 ) +INPUT_PORTS_START( mc10 ) PORT_START("pb0") /* KEY ROW 0 */ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("@ INPUT") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H THEN") PORT_CODE(KEYCODE_H) PORT_CHAR('H') @@ -400,7 +412,7 @@ INPUT_PORTS_END /* Alice uses an AZERTY keyboard */ /* Port Key description Emulated key Natural key Shift 1 Shift 2 (Ctrl) */ -static INPUT_PORTS_START( alice ) +INPUT_PORTS_START( alice ) PORT_START("pb0") /* KEY ROW 0 */ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("@ INPUT") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H THEN") PORT_CODE(KEYCODE_H) PORT_CHAR('H') @@ -477,12 +489,11 @@ static INPUT_PORTS_START( alice ) PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED) INPUT_PORTS_END - /*************************************************************************** MACHINE DRIVERS ***************************************************************************/ -static MACHINE_CONFIG_START( mc10 ) +MACHINE_CONFIG_START( mc10 ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6803, XTAL_3_579545MHz) /* 0,894886 MHz */ @@ -518,7 +529,7 @@ static MACHINE_CONFIG_START( mc10 ) MCFG_SOFTWARE_LIST_ADD("cass_list", "mc10") MACHINE_CONFIG_END -static MACHINE_CONFIG_START( alice32 ) +MACHINE_CONFIG_START( alice32 ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6803, XTAL_3_579545MHz) @@ -561,7 +572,7 @@ static MACHINE_CONFIG_START( alice32 ) MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("mc10_cass", "mc10") MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( alice90, alice32 ) +MACHINE_CONFIG_DERIVED( alice90, alice32 ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(alice90_mem) @@ -574,6 +585,8 @@ static MACHINE_CONFIG_DERIVED( alice90, alice32 ) MCFG_DEVICE_REMOVE("mc10_cass") MACHINE_CONFIG_END +} + /*************************************************************************** ROM DEFINITIONS @@ -605,12 +618,14 @@ ROM_START( alice90 ) ROM_LOAD( "charset.rom", 0x0000, 0x2000, BAD_DUMP CRC(b2f49eb3) SHA1(d0ef530be33bfc296314e7152302d95fdf9520fc) ) // from dcvg5k ROM_END +ALLOW_SAVE_TYPE(mc10_state::printer_state); + /*************************************************************************** GAME DRIVERS ***************************************************************************/ // YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS -COMP( 1983, mc10, 0, 0, mc10, mc10, mc10_state, mc10, "Tandy Radio Shack", "MC-10", MACHINE_SUPPORTS_SAVE ) -COMP( 1983, alice, mc10, 0, mc10, alice, mc10_state, mc10, "Matra & Hachette", "Alice", MACHINE_SUPPORTS_SAVE ) -COMP( 1984, alice32, 0, 0, alice32, alice, mc10_state, mc10, "Matra & Hachette", "Alice 32", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -COMP( 1985, alice90, alice32, 0, alice90, alice, mc10_state, mc10, "Matra & Hachette", "Alice 90", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +COMP( 1983, mc10, 0, 0, mc10, mc10, mc10_state, 0, "Tandy Radio Shack", "MC-10", MACHINE_SUPPORTS_SAVE ) +COMP( 1983, alice, mc10, 0, mc10, alice, mc10_state, 0, "Matra & Hachette", "Alice", MACHINE_SUPPORTS_SAVE ) +COMP( 1984, alice32, 0, 0, alice32, alice, mc10_state, 0, "Matra & Hachette", "Alice 32", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +COMP( 1985, alice90, alice32, 0, alice90, alice, mc10_state, 0, "Matra & Hachette", "Alice 90", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -- cgit v1.2.3