diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index a5dc95b3a51..f0adaf172fc 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -2533,6 +2533,8 @@ if (BUSES["A2BUS"]~=null) then MAME_DIR .. "src/devices/bus/a2bus/a2vulcan.h", MAME_DIR .. "src/devices/bus/a2bus/a2zipdrive.cpp", MAME_DIR .. "src/devices/bus/a2bus/a2zipdrive.h", + MAME_DIR .. "src/devices/bus/a2bus/ace2x00.cpp", + MAME_DIR .. "src/devices/bus/a2bus/ace2x00.h", MAME_DIR .. "src/devices/bus/a2bus/agat_fdc.cpp", MAME_DIR .. "src/devices/bus/a2bus/agat_fdc.h", MAME_DIR .. "src/devices/bus/a2bus/agat7langcard.cpp", diff --git a/src/devices/bus/a2bus/ace2x00.cpp b/src/devices/bus/a2bus/ace2x00.cpp new file mode 100644 index 00000000000..ccea01c4ecc --- /dev/null +++ b/src/devices/bus/a2bus/ace2x00.cpp @@ -0,0 +1,160 @@ +// license:BSD-3-Clause +// copyright-holders:R. Belmont +/********************************************************************* + + ace2x00.c + + Helpers for the Franklin Ace 2x00's slot 1 and 6 internal peripherals + +*********************************************************************/ + +#include "emu.h" +#include "ace2x00.h" + +//#define VERBOSE 1 +#include "logmacro.h" + +/*************************************************************************** + PARAMETERS +***************************************************************************/ + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +DEFINE_DEVICE_TYPE(A2BUS_ACE2X00_SLOT1, a2bus_ace2x00_slot1_device, "ace2x00s1", "Franklin Ace 2x00 Parallel Port") +DEFINE_DEVICE_TYPE(A2BUS_ACE2X00_SLOT6, a2bus_ace2x00_slot6_device, "ace2x00s6", "Franklin Ace 2x00 Disk Port") + +/*************************************************************************** + FUNCTION PROTOTYPES +***************************************************************************/ + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +void a2bus_ace2x00_device::device_add_mconfig(machine_config &config) +{ +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +a2bus_ace2x00_device::a2bus_ace2x00_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, type, tag, owner, clock), + device_a2bus_card_interface(mconfig, *this), m_rom(nullptr) +{ +} + +a2bus_ace2x00_slot1_device::a2bus_ace2x00_slot1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + a2bus_ace2x00_device(mconfig, A2BUS_ACE2X00_SLOT1, tag, owner, clock) +{ +} + +a2bus_ace2x00_slot6_device::a2bus_ace2x00_slot6_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + a2bus_ace2x00_device(mconfig, A2BUS_ACE2X00_SLOT6, tag, owner, clock), + m_iwm(*this, "iwm"), + m_floppy(*this, "%u", 0U) +{ +} + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- +void a2bus_ace2x00_slot6_device::device_add_mconfig(machine_config &config) +{ + IWM(config, m_iwm, clock(), 1021800*2); + m_iwm->phases_cb().set(FUNC(a2bus_ace2x00_slot6_device::phases_w)); + m_iwm->devsel_cb().set(FUNC(a2bus_ace2x00_slot6_device::devsel_w)); + applefdintf_device::add_525(config, m_floppy[0]); + applefdintf_device::add_525(config, m_floppy[1]); +} + +/*------------------------------------------------- + read_c0nx - called for reads from this card's c0nx space +-------------------------------------------------*/ + +uint8_t a2bus_ace2x00_slot6_device::read_c0nx(u8 offset) +{ + return m_iwm->read(offset); +} + +/*------------------------------------------------- + write_c0nx - called for writes to this card's c0nx space +-------------------------------------------------*/ + +void a2bus_ace2x00_slot6_device::write_c0nx(u8 offset, u8 data) +{ + m_iwm->write(offset, data); +} + +void a2bus_ace2x00_slot6_device::devsel_w(u8 data) +{ + if (data & 1) + m_iwm->set_floppy(m_floppy[0]->get_device()); + else if (data & 2) + m_iwm->set_floppy(m_floppy[1]->get_device()); + else + m_iwm->set_floppy(nullptr); +} + +void a2bus_ace2x00_slot6_device::phases_w(u8 data) +{ + auto flp = m_iwm->get_floppy(); + if (flp) + flp->seek_phase_w(data); +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void a2bus_ace2x00_device::device_start() +{ +} + +void a2bus_ace2x00_device::device_reset() +{ + m_rom = device().machine().root_device().memregion("maincpu")->base(); +} + +uint8_t a2bus_ace2x00_device::read_cnxx(uint8_t offset) +{ + switch (slotno()) + { + case 1: + return m_rom[offset]; + + case 6: + return m_rom[offset + 0x4600]; + } + + return 0xff; +} + +uint8_t a2bus_ace2x00_device::read_c800(uint16_t offset) +{ + switch (slotno()) + { + case 6: + return m_rom[(offset & 0x7ff) + 0x4800]; + } + + return 0xff; +} + +void a2bus_ace2x00_device::write_c800(uint16_t offset, uint8_t data) +{ +} + +bool a2bus_ace2x00_device::take_c800() +{ + switch (slotno()) + { + case 6: + return true; + default: + return false; + } +} diff --git a/src/devices/bus/a2bus/ace2x00.h b/src/devices/bus/a2bus/ace2x00.h new file mode 100644 index 00000000000..9714f5aa965 --- /dev/null +++ b/src/devices/bus/a2bus/ace2x00.h @@ -0,0 +1,79 @@ +// license:BSD-3-Clause +// copyright-holders:R. Belmont +/********************************************************************* + + ace2x00.h + + Helpers for the Franklin Ace 2x00's slot 1 and 6 internal peripherals + +*********************************************************************/ + +#ifndef MAME_BUS_A2BUS_ACE2X00_H +#define MAME_BUS_A2BUS_ACE2X00_H + +#pragma once + +#include "a2bus.h" +#include "imagedev/floppy.h" +#include "formats/flopimg.h" +#include "machine/iwm.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class a2bus_ace2x00_device: + public device_t, + public device_a2bus_card_interface +{ +public: + // construction/destruction + a2bus_ace2x00_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + virtual void device_add_mconfig(machine_config &config) override; + + // overrides of standard a2bus slot functions + virtual uint8_t read_cnxx(uint8_t offset) override; + virtual uint8_t read_c800(uint16_t offset) override; + virtual void write_c800(uint16_t offset, uint8_t data) override; + virtual bool take_c800() override; + + uint8_t *m_rom; +}; + +class a2bus_ace2x00_slot1_device : public a2bus_ace2x00_device +{ +public: + a2bus_ace2x00_slot1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: +}; + +class a2bus_ace2x00_slot6_device : public a2bus_ace2x00_device +{ +public: + a2bus_ace2x00_slot6_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual void device_add_mconfig(machine_config &config) override; + + // overrides of standard a2bus slot functions + virtual uint8_t read_c0nx(u8 offset) override; + virtual void write_c0nx(u8 offset, u8 data) override; + + required_device m_iwm; + required_device_array m_floppy; + +private: + void devsel_w(u8 data); + void phases_w(u8 data); +}; + +// device type definition +DECLARE_DEVICE_TYPE(A2BUS_ACE2X00_SLOT1, a2bus_ace2x00_slot1_device) +DECLARE_DEVICE_TYPE(A2BUS_ACE2X00_SLOT6, a2bus_ace2x00_slot6_device) + +#endif // MAME_BUS_A2BUS_ACE2X00_H diff --git a/src/mame/drivers/apple2e.cpp b/src/mame/drivers/apple2e.cpp index 86da332723b..b9c1154046b 100644 --- a/src/mame/drivers/apple2e.cpp +++ b/src/mame/drivers/apple2e.cpp @@ -173,6 +173,7 @@ MIG RAM page 2 $CE02 is the speaker/slot bitfield and $CE03 is the paddle/accele #include "bus/a2bus/a2videoterm.h" #include "bus/a2bus/a2vulcan.h" #include "bus/a2bus/a2zipdrive.h" +#include "bus/a2bus/ace2x00.h" #include "bus/a2bus/booti.h" #include "bus/a2bus/byte8251.h" #include "bus/a2bus/cmsscsi.h" @@ -302,6 +303,8 @@ public: m_iscecm = false; m_iscec2000 = false; m_isace500 = false; + m_isace2200 = false; + m_ace2200_axxx_bank = false; m_pal = false; #if IICP_NEW_IWM m_cur_floppy = nullptr; @@ -377,6 +380,7 @@ public: u8 ram2000_r(offs_t offset); void ram2000_w(offs_t offset, u8 data); u8 ram4000_r(offs_t offset); + u8 ram4000_ace2200_r(offs_t offset); void ram4000_w(offs_t offset, u8 data); u8 cec4000_r(offs_t offset); u8 cec8000_r(offs_t offset); @@ -457,6 +461,7 @@ public: void laser128o(machine_config &config); void laser128ex2(machine_config &config); void ace500(machine_config &config); + void ace2200(machine_config &config); void apple2c_iwm(machine_config &config); void apple2c_mem(machine_config &config); void cec(machine_config &config); @@ -478,6 +483,7 @@ public: void inhbank_map(address_map &map); void laser128_map(address_map &map); void ace500_map(address_map &map); + void ace2200_map(address_map &map); void lcbank_map(address_map &map); void r0000bank_map(address_map &map); void r0200bank_map(address_map &map); @@ -485,11 +491,13 @@ public: void r0800bank_map(address_map &map); void r2000bank_map(address_map &map); void r4000bank_map(address_map &map); + void r4000bank_ace2200_map(address_map &map); void spectred_keyb_map(address_map &map); void init_laser128(); void init_128ex(); void init_pal(); void init_ace500(); + void init_ace2200(); bool m_35sel, m_hdsel, m_intdrive; @@ -530,7 +538,7 @@ private: u8 m_migram[0x800]; u16 m_migpage; - bool m_isace500, m_ace_cnxx_bank; + bool m_isace500, m_isace2200, m_ace_cnxx_bank, m_ace2200_axxx_bank; u16 m_ace500rombank; bool m_accel_unlocked; @@ -1041,10 +1049,10 @@ void apple2e_state::machine_start() for (int adr = 0; adr < ram_size; adr += 2) { - // invert the fill pattern order on the ACE 500, as it interacts with + // invert the fill pattern order on the ACE 500 and 2200, as it interacts with // Franklin's monitor not returning the same values as Apple's plus some // bugs in DOS 3.3. - if (m_isace500) + if ((m_isace500) || (m_isace2200)) { m_ram_ptr[adr] = 0xff; m_ram_ptr[adr+1] = 0; @@ -1114,7 +1122,7 @@ void apple2e_state::machine_start() m_iscec2000 = false; } - if ((m_has_laser_mouse) || (m_isace500)) + if ((m_has_laser_mouse) || (m_isace500) || (m_isace2200)) { m_strobe_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(apple2e_state::update_laserprn_strobe), this)); m_next_strobe = 1U; @@ -1194,6 +1202,8 @@ void apple2e_state::machine_start() save_item(NAME(m_next_strobe)); save_item(NAME(m_centronics_busy)); save_item(NAME(m_ace500rombank)); + save_item(NAME(m_ace_cnxx_bank)); + save_item(NAME(m_ace2200_axxx_bank)); } void apple2e_state::machine_reset() @@ -1328,6 +1338,11 @@ void apple2e_state::init_ace500() m_ace_cnxx_bank = false; } +void apple2e_state::init_ace2200() +{ + m_isace2200 = true; +} + void apple2e_state::init_pal() { m_pal = true; @@ -2075,6 +2090,12 @@ u8 apple2e_state::c000_r(offs_t offset) case 0x1f: // read 80COL return (m_video->m_80col ? 0x80 : 0x00) | m_transchar; + case 0x26: // Ace 2x00 DIP switches + if (m_isace2200) + { + return (m_sysconfig->read() & 0x80) | uFloatingBus7; + } + case 0x60: // cassette in case 0x68: if (m_cassette) @@ -2391,6 +2412,17 @@ void apple2e_state::c000_w(offs_t offset, u8 data) case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: + if (m_isace2200) + { + if (offset == 0x78) + { + m_ace2200_axxx_bank = false; + } + else if (offset == 0x79) + { + m_ace2200_axxx_bank = true; + } + } if (m_auxslotdevice) { m_auxslotdevice->write_c07x(offset & 0xf, data); @@ -3152,6 +3184,14 @@ u8 apple2e_state::ace500_c0bx_r(offs_t offset) { switch (offset) { + // Printer "auto-LF" DIP switch in bit 7 + case 0x0: + return (m_sysconfig->read() & 0x80); + + // Alt key status (0=pressed). Reads as pressed for function keys. + case 0x4: + return 0xff; + // Used by the IRQ handler. Appears to return altzp status in bit 7, same as $C016. case 0xc: return (m_altzp ? 0x80 : 0x00); @@ -3532,6 +3572,15 @@ u8 apple2e_state::ram4000_r(offs_t offset) { return m_ram_ptr[offset+ void apple2e_state::ram4000_w(offs_t offset, u8 data) { m_ram_ptr[offset+0x4000] = data; } void apple2e_state::ram8000_w(offs_t offset, u8 data) { m_ram_ptr[offset+0x8000] = data; } +u8 apple2e_state::ram4000_ace2200_r(offs_t offset) +{ + if ((offset >= 0x6000) && (m_ace2200_axxx_bank)) + { + return m_rom_ptr[0x4000 + (offset - 0x6000)]; + } + return m_ram_ptr[offset+0x4000]; +} + u8 apple2e_state::cec4000_r(offs_t offset) { //printf("cec4000_r: ofs %x\n", offset); @@ -3665,6 +3714,25 @@ void apple2e_state::ace500_map(address_map &map) map(0xd000, 0xffff).m(m_upperbank, FUNC(address_map_bank_device::amap8)); } +void apple2e_state::ace2200_map(address_map &map) +{ + map(0x0000, 0x01ff).m(m_0000bank, FUNC(address_map_bank_device::amap8)); + map(0x0200, 0x03ff).m(m_0200bank, FUNC(address_map_bank_device::amap8)); + map(0x0400, 0x07ff).m(m_0400bank, FUNC(address_map_bank_device::amap8)); + map(0x0800, 0x1fff).m(m_0800bank, FUNC(address_map_bank_device::amap8)); + map(0x2000, 0x3fff).m(m_2000bank, FUNC(address_map_bank_device::amap8)); + map(0x4000, 0xbfff).m(m_4000bank, FUNC(address_map_bank_device::amap8)); + map(0xc000, 0xc07f).rw(FUNC(apple2e_state::c000_r), FUNC(apple2e_state::c000_w)); + map(0xc080, 0xc0ff).rw(FUNC(apple2e_state::c080_r), FUNC(apple2e_state::c080_w)); + map(0xc090, 0xc097).w(FUNC(apple2e_state::laserprn_w)); + map(0xc100, 0xc2ff).m(m_c100bank, FUNC(address_map_bank_device::amap8)); + map(0xc1c1, 0xc1c1).r(FUNC(apple2e_state::laserprn_busy_r)); + map(0xc300, 0xc3ff).m(m_c300bank, FUNC(address_map_bank_device::amap8)); + map(0xc400, 0xc7ff).m(m_c400bank, FUNC(address_map_bank_device::amap8)); + map(0xc800, 0xcfff).m(m_c800bank, FUNC(address_map_bank_device::amap8)); + map(0xd000, 0xffff).m(m_upperbank, FUNC(address_map_bank_device::amap8)); +} + void apple2e_state::r0000bank_map(address_map &map) { map(0x0000, 0x01ff).rw(FUNC(apple2e_state::ram0000_r), FUNC(apple2e_state::ram0000_w)); @@ -3713,6 +3781,16 @@ void apple2e_state::r4000bank_map(address_map &map) map(0x24000, 0x27fff).rw(FUNC(apple2e_state::cec8000_r), FUNC(apple2e_state::ram8000_w)); } +void apple2e_state::r4000bank_ace2200_map(address_map &map) +{ + map(0x00000, 0x07fff).rw(FUNC(apple2e_state::ram4000_ace2200_r), FUNC(apple2e_state::ram4000_w)); + map(0x08000, 0x0ffff).rw(FUNC(apple2e_state::auxram4000_r), FUNC(apple2e_state::ram4000_w)); + map(0x10000, 0x17fff).rw(FUNC(apple2e_state::ram4000_r), FUNC(apple2e_state::auxram4000_w)); + map(0x18000, 0x1ffff).rw(FUNC(apple2e_state::auxram4000_r), FUNC(apple2e_state::auxram4000_w)); + map(0x20000, 0x23fff).rw(FUNC(apple2e_state::cec4000_r), FUNC(apple2e_state::ram4000_w)); + map(0x24000, 0x27fff).rw(FUNC(apple2e_state::cec8000_r), FUNC(apple2e_state::ram8000_w)); +} + void apple2e_state::c100bank_map(address_map &map) { map(0x0000, 0x01ff).rw(FUNC(apple2e_state::c100_r), FUNC(apple2e_state::c100_w)); @@ -4506,7 +4584,17 @@ INPUT_PORTS_END static INPUT_PORTS_START( ace500 ) PORT_INCLUDE( apple2e_common ) - PORT_INCLUDE( laser128_sysconfig ) + + PORT_START("a2_config") + PORT_CONFNAME(0x03, 0x00, "Composite monitor type") + PORT_CONFSETTING(0x00, "Color") + PORT_CONFSETTING(0x01, "B&W") + PORT_CONFSETTING(0x02, "Green") + PORT_CONFSETTING(0x03, "Amber") + + PORT_CONFNAME(0x80, 0x00, "Auto Line Feed for printer") + PORT_CONFSETTING(0x80, DEF_STR(On)) + PORT_CONFSETTING(0x00, DEF_STR(Off)) PORT_START("keyb_special") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Caps Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE @@ -5290,6 +5378,7 @@ void apple2e_state::apple2ep(machine_config &config) apple2e(config); M65C02(config.replace(), m_maincpu, 1021800); m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::apple2e_map); + m_maincpu->set_dasm_override(FUNC(apple2e_state::dasm_trampoline)); } void apple2e_state::apple2c(machine_config &config) @@ -5299,6 +5388,7 @@ void apple2e_state::apple2c(machine_config &config) M65C02(config.replace(), m_maincpu, 1021800); m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::apple2c_map); + m_maincpu->set_dasm_override(FUNC(apple2e_state::dasm_trampoline)); // IIc and friends have no cassette port config.device_remove(A2_CASSETTE_TAG); @@ -5513,6 +5603,7 @@ void apple2e_state::laser128(machine_config &config) apple2c(config); M65C02(config.replace(), m_maincpu, 1021800); m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::laser128_map); + m_maincpu->set_dasm_override(FUNC(apple2e_state::dasm_trampoline)); m_screen->set_screen_update(FUNC(apple2e_state::screen_update_tf)); @@ -5544,6 +5635,7 @@ void apple2e_state::laser128o(machine_config &config) apple2c(config); M65C02(config.replace(), m_maincpu, 1021800); m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::laser128_map); + m_maincpu->set_dasm_override(FUNC(apple2e_state::dasm_trampoline)); m_screen->set_screen_update(FUNC(apple2e_state::screen_update_tf)); @@ -5576,6 +5668,7 @@ void apple2e_state::laser128ex2(machine_config &config) apple2c(config); M65C02(config.replace(), m_maincpu, 1021800); m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::laser128_map); + m_maincpu->set_dasm_override(FUNC(apple2e_state::dasm_trampoline)); m_screen->set_screen_update(FUNC(apple2e_state::screen_update_tf)); @@ -5607,8 +5700,8 @@ void apple2e_state::ace500(machine_config &config) apple2c_iwm(config); M65C02(config.replace(), m_maincpu, 1021800); m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::ace500_map); + m_maincpu->set_dasm_override(FUNC(apple2e_state::dasm_trampoline)); - m_screen->set_screen_update(FUNC(apple2e_state::screen_update_tf)); m_screen->set_screen_update(FUNC(apple2e_state::screen_update_tt)); CENTRONICS(config, m_printer_conn, centronics_devices, "printer"); @@ -5620,6 +5713,39 @@ void apple2e_state::ace500(machine_config &config) m_ram->set_default_size("256K").set_extra_options("256K, 512K"); } +void apple2e_state::ace2200(machine_config &config) +{ + apple2e(config); + M65C02(config.replace(), m_maincpu, 1021800); + m_maincpu->set_addrmap(AS_PROGRAM, &apple2e_state::ace2200_map); + m_maincpu->set_dasm_override(FUNC(apple2e_state::dasm_trampoline)); + + m_screen->set_screen_update(FUNC(apple2e_state::screen_update_tt)); + + config.device_remove(A2_4000_TAG); + ADDRESS_MAP_BANK(config, A2_4000_TAG).set_map(&apple2e_state::r4000bank_ace2200_map).set_options(ENDIANNESS_LITTLE, 8, 32, 0x8000); + + // The Ace 2000 series has 3 physical slots, 2, 4/7, and 5. + // 4/7 can be slot 4 or 7 via a jumper; we fix it to slot 7 here + // because that's most useful (for e.g. cffa202). + config.device_remove("sl1"); + config.device_remove("sl3"); + config.device_remove("sl4"); + config.device_remove("sl5"); + config.device_remove("sl6"); + + A2BUS_ACE2X00_SLOT1(config, "sl1", A2BUS_7M_CLOCK).set_onboard(m_a2bus); + A2BUS_SLOT(config, "sl5", m_a2bus, apple2_cards, "mockingboard"); + A2BUS_ACE2X00_SLOT6(config, "sl6", A2BUS_7M_CLOCK).set_onboard(m_a2bus); + + CENTRONICS(config, m_printer_conn, centronics_devices, "printer"); + m_printer_conn->busy_handler().set(FUNC(apple2e_state::busy_w)); + OUTPUT_LATCH(config, m_printer_out); + m_printer_conn->set_output_latch(*m_printer_out); + + m_ram->set_default_size("128K").set_extra_options("128K"); +} + void apple2e_state::cec(machine_config &config) { apple2e(config); @@ -6071,6 +6197,20 @@ ROM_START(zijini) ROM_LOAD( "u40.m2822.bin", 0x000000, 0x000100, CRC(b72a2c70) SHA1(bc39fbd5b9a8d2287ac5d0a42e639fc4d3c2f9d4) ) ROM_END +ROM_START(ace2200) + ROM_REGION(0x2000,"gfx1",0) + ROM_LOAD("franklin_ace2000_videorom.bin", 0x1000, 0x1000, CRC(545bdeea) SHA1(26ebc4b0d3080311f550090bc1b29807cb22d083)) + ROM_CONTINUE(0x0000, 0x1000) + + ROM_REGION(0x10000,"maincpu",0) + ROM_LOAD("franklin_ace2000_rom_u2_p2_rev6.bin", 0x000000, 0x002000, CRC(1ab6e4d3) SHA1(5bdb10089fbdadaee9772afa1f7439a51289636b)) + ROM_LOAD("franklin_ace2000_rom_u3_p1_rev6.bin", 0x002000, 0x002000, CRC(197f4936) SHA1(ec9de6da0ca6b6fd97fbef34eec64bf5c3c1b6c5)) + ROM_LOAD("franklin_ace2000_rom_u1_p3_rev6_franklinrom.bin", 0x004000, 0x002000, CRC(5cc150a7) SHA1(7ac8028bbf8cb7730f432e0bae32e364523555fb)) + + ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 ) + ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // 1983 US-Dvorak +ROM_END + ROM_START(ace500) ROM_REGION(0x2000,"gfx1",0) // not sure if the 500 and 2000 have the same character set. First 4K is normal charset, second 4K is MouseText @@ -6115,4 +6255,5 @@ COMP( 1989, cecm, 0, apple2, cec, cecm, apple2e_state, COMP( 1991, cec2000, 0, apple2, cec, ceci, apple2e_state, empty_init, "Shaanxi Province Computer Factory", "China Education Computer 2000", MACHINE_SUPPORTS_SAVE ) COMP( 1989, zijini, 0, apple2, cec, zijini, apple2e_state, empty_init, "Nanjing Computer Factory", "Zi Jin I", MACHINE_SUPPORTS_SAVE ) COMP( 1988, apple2cp, apple2c, 0, apple2cp, apple2cp, apple2e_state, empty_init, "Apple Computer", "Apple //c Plus", MACHINE_SUPPORTS_SAVE ) +COMP( 1985, ace2200, apple2e, 0, ace2200, ace500, apple2e_state, init_ace2200,"Franklin Computer", "ACE 2200", MACHINE_SUPPORTS_SAVE) COMP( 1986, ace500, apple2c, 0, ace500, ace500, apple2e_state, init_ace500,"Franklin Computer", "ACE 500", MACHINE_SUPPORTS_SAVE)