diff options
Diffstat (limited to 'src/devices/bus/electron/romboxp.cpp')
-rw-r--r-- | src/devices/bus/electron/romboxp.cpp | 153 |
1 files changed, 87 insertions, 66 deletions
diff --git a/src/devices/bus/electron/romboxp.cpp b/src/devices/bus/electron/romboxp.cpp index 7581cf5b2e1..e489849ec73 100644 --- a/src/devices/bus/electron/romboxp.cpp +++ b/src/devices/bus/electron/romboxp.cpp @@ -34,27 +34,24 @@ DEFINE_DEVICE_TYPE(ELECTRON_ROMBOXP, electron_romboxp_device, "electron_romboxp" ROM_START( romboxp ) // Bank 12 Expansion module operating system ROM_REGION(0x2000, "exp_rom", 0) - ROM_DEFAULT_BIOS("exp100") + ROM_DEFAULT_BIOS("exp202") ROM_SYSTEM_BIOS(0, "exp100", "ROMBOX+ Expansion 1.00") ROMX_LOAD("romboxplus.rom", 0x0000, 0x2000, CRC(0520ab6d) SHA1(2f551bea279a64e09fd4d31024799f7459fb9938), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "presap2", "PRES AP2 Support 1.23") - ROMX_LOAD("presap2rb_123.rom", 0x0000, 0x2000, CRC(04931d2c) SHA1(84a27fd30adea4e7f7c53e7875f63cf9e6928688), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(1, "exp101", "Slogger Expansion 1.01") + ROMX_LOAD("exprom101.rom", 0x0000, 0x2000, CRC(6f854419) SHA1(1f3e7e0c2843e1a364b4b3f96c890fe70ef03200), ROM_BIOS(1)) - ROM_SYSTEM_BIOS(2, "exp101", "Slogger Expansion 1.01") - ROMX_LOAD("exprom101.rom", 0x0000, 0x2000, CRC(6f854419) SHA1(1f3e7e0c2843e1a364b4b3f96c890fe70ef03200), ROM_BIOS(2)) + ROM_SYSTEM_BIOS(2, "exp200", "Slogger Expansion 2.00") + ROMX_LOAD("elkexp200.rom", 0x0000, 0x2000, CRC(dee02843) SHA1(5c9b940b4ddb46e9a223160310683a32266300c8), ROM_BIOS(2)) - ROM_SYSTEM_BIOS(3, "exp200", "Slogger Expansion 2.00") - ROMX_LOAD("elkexp200.rom", 0x0000, 0x2000, CRC(dee02843) SHA1(5c9b940b4ddb46e9a223160310683a32266300c8), ROM_BIOS(3)) + ROM_SYSTEM_BIOS(3, "exp201", "Slogger Expansion 2.01") + ROMX_LOAD("elkexp201.rom", 0x0000, 0x2000, CRC(0e896892) SHA1(4e0794f1083fe529b01bd4fa100996a533ed8b10), ROM_BIOS(3)) - ROM_SYSTEM_BIOS(4, "exp201", "Slogger Expansion 2.01") - ROMX_LOAD("elkexp201.rom", 0x0000, 0x2000, CRC(0e896892) SHA1(4e0794f1083fe529b01bd4fa100996a533ed8b10), ROM_BIOS(4)) + ROM_SYSTEM_BIOS(4, "exp202", "Slogger Expansion 2.02") + ROMX_LOAD("elkexp202.rom", 0x0000, 0x2000, CRC(32b440be) SHA1(dbc73e8d919c5615d0241d99db60e06324e16c86), ROM_BIOS(4)) - ROM_SYSTEM_BIOS(5, "exp202", "Slogger Expansion 2.02") - ROMX_LOAD("elkexp202.rom", 0x0000, 0x2000, CRC(32b440be) SHA1(dbc73e8d919c5615d0241d99db60e06324e16c86), ROM_BIOS(5)) - - ROM_SYSTEM_BIOS(6, "exp210", "Slogger Expansion 2.10 (dev)") - ROMX_LOAD("elkexp210.rom", 0x0000, 0x2000, CRC(12442575) SHA1(eb8609991a9a8fb017b8100bfca4248d65faeea8), ROM_BIOS(6)) + ROM_SYSTEM_BIOS(5, "exp210", "Slogger Expansion 2.10 (dev)") + ROMX_LOAD("elkexp210.rom", 0x0000, 0x2000, CRC(12442575) SHA1(eb8609991a9a8fb017b8100bfca4248d65faeea8), ROM_BIOS(5)) ROM_END //------------------------------------------------- @@ -63,12 +60,9 @@ ROM_END static INPUT_PORTS_START( romboxp ) PORT_START("OPTION") - PORT_CONFNAME(0x01, 0x01, "A1") // not implemented - PORT_CONFSETTING(0x00, "RAM") - PORT_CONFSETTING(0x01, "ROM") - PORT_CONFNAME(0x02, 0x02, "A2") - PORT_CONFSETTING(0x00, "ROM 12-15") - PORT_CONFSETTING(0x02, "ROM 4-7") + PORT_CONFNAME(0x01, 0x01, "Sideways ROM Pages") + PORT_CONFSETTING(0x00, "12-15") + PORT_CONFSETTING(0x01, "4-7") INPUT_PORTS_END //------------------------------------------------- @@ -86,28 +80,30 @@ ioport_constructor electron_romboxp_device::device_input_ports() const void electron_romboxp_device::device_add_mconfig(machine_config &config) { + INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w)); + /* printer */ CENTRONICS(config, m_centronics, centronics_devices, "printer"); - m_centronics->busy_handler().set(FUNC(electron_romboxp_device::busy_w)); + m_centronics->busy_handler().set([this](int state) { m_centronics_busy = state; }); output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out")); m_centronics->set_output_latch(latch); /* rom sockets */ GENERIC_SOCKET(config, m_rom[0], generic_plain_slot, "electron_rom", "bin,rom"); // ROM SLOT 4/12 - m_rom[0]->set_device_load(FUNC(electron_romboxp_device::rom1_load), this); + m_rom[0]->set_device_load(FUNC(electron_romboxp_device::rom1_load)); GENERIC_SOCKET(config, m_rom[1], generic_plain_slot, "electron_rom", "bin,rom"); // ROM SLOT 5/13 - m_rom[1]->set_device_load(FUNC(electron_romboxp_device::rom2_load), this); + m_rom[1]->set_device_load(FUNC(electron_romboxp_device::rom2_load)); GENERIC_SOCKET(config, m_rom[2], generic_plain_slot, "electron_rom", "bin,rom"); // ROM SLOT 6/14 also ROM/RAM - m_rom[2]->set_device_load(FUNC(electron_romboxp_device::rom3_load), this); + m_rom[2]->set_device_load(FUNC(electron_romboxp_device::rom3_load)); GENERIC_SOCKET(config, m_rom[3], generic_plain_slot, "electron_rom", "bin,rom"); // ROM SLOT 7/15 - m_rom[3]->set_device_load(FUNC(electron_romboxp_device::rom4_load), this); + m_rom[3]->set_device_load(FUNC(electron_romboxp_device::rom4_load)); /* cartridges */ ELECTRON_CARTSLOT(config, m_cart[0], DERIVED_CLOCK(1, 1), electron_cart, nullptr); // ROM SLOT 0/1 - m_cart[0]->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w)); + m_cart[0]->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<0>)); m_cart[0]->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::nmi_w)); ELECTRON_CARTSLOT(config, m_cart[1], DERIVED_CLOCK(1, 1), electron_cart, nullptr); // ROM SLOT 2/3 - m_cart[1]->irq_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::irq_w)); + m_cart[1]->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>)); m_cart[1]->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(electron_expansion_slot_device::nmi_w)); } @@ -124,18 +120,19 @@ const tiny_rom_entry *electron_romboxp_device::device_rom_region() const // electron_romboxp_device - constructor //------------------------------------------------- -electron_romboxp_device::electron_romboxp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, ELECTRON_ROMBOXP, tag, owner, clock), - device_electron_expansion_interface(mconfig, *this), - m_exp_rom(*this, "exp_rom"), - m_rom(*this, "rom%u", 1), - m_cart(*this, "cart%u", 1), - m_centronics(*this, "centronics"), - m_cent_data_out(*this, "cent_data_out"), - m_option(*this, "OPTION"), - m_romsel(0), - m_rom_base(0), - m_centronics_busy(0) +electron_romboxp_device::electron_romboxp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, ELECTRON_ROMBOXP, tag, owner, clock) + , device_electron_expansion_interface(mconfig, *this) + , m_irqs(*this, "irqs") + , m_exp_rom(*this, "exp_rom") + , m_rom(*this, "rom%u", 1) + , m_cart(*this, "cart%u", 1) + , m_centronics(*this, "centronics") + , m_cent_data_out(*this, "cent_data_out") + , m_option(*this, "OPTION") + , m_romsel(0) + , m_rom_base(0) + , m_centronics_busy(0) { } @@ -145,6 +142,12 @@ electron_romboxp_device::electron_romboxp_device(const machine_config &mconfig, void electron_romboxp_device::device_start() { + m_ram = make_unique_clear<uint8_t[]>(0x10000); + memset(m_ram.get(), 0xff, 0x10000); + + /* register for save states */ + save_item(NAME(m_romsel)); + save_pointer(NAME(m_ram), 0x10000); } //------------------------------------------------- @@ -153,7 +156,7 @@ void electron_romboxp_device::device_start() void electron_romboxp_device::device_reset() { - m_rom_base = (m_option->read() & 0x02) ? 4 : 12; + m_rom_base = m_option->read() ? 4 : 12; } //------------------------------------------------- @@ -186,7 +189,10 @@ uint8_t electron_romboxp_device::expbus_r(offs_t offset) case 7: if (m_rom_base == 4) { - data = m_rom[m_romsel - 4]->read_rom(offset & 0x3fff); + if (m_rom[m_romsel - 4]->exists()) + data = m_rom[m_romsel - 4]->read_rom(offset & 0x3fff); + else + data = m_ram[(m_romsel - 4) << 14 | (offset & 0x3fff)]; } break; case 12: @@ -195,11 +201,15 @@ uint8_t electron_romboxp_device::expbus_r(offs_t offset) case 13: data &= m_cart[0]->read(offset & 0x3fff, 0, 0, m_romsel & 0x01, 0, 1); data &= m_cart[1]->read(offset & 0x3fff, 0, 0, m_romsel & 0x01, 0, 1); + [[fallthrough]]; case 14: case 15: if (m_rom_base == 12) { - data = m_rom[m_romsel - 12]->read_rom(offset & 0x3fff); + if (m_rom[m_romsel - 12]->exists()) + data = m_rom[m_romsel - 12]->read_rom(offset & 0x3fff); + else + data = m_ram[(m_romsel - 12) << 14 | (offset & 0x3fff)]; } break; } @@ -214,7 +224,7 @@ uint8_t electron_romboxp_device::expbus_r(offs_t offset) if (offset == 0xfc72) { - data &= status_r(); + data &= (m_centronics_busy << 7) | 0x7f; } break; @@ -250,6 +260,30 @@ void electron_romboxp_device::expbus_w(offs_t offset, uint8_t data) case 3: m_cart[0]->write(offset & 0x3fff, data, 0, 0, m_romsel & 0x01, 1, 0); break; + case 4: + case 5: + case 6: + case 7: + if (m_rom_base == 4) + { + if (!m_rom[m_romsel - 4]->exists()) + m_ram[(m_romsel - 4) << 14 | (offset & 0x3fff)] = data; + } + break; + case 12: + break; + case 13: + m_cart[0]->write(offset & 0x3fff, data, 0, 0, m_romsel & 0x01, 0, 1); + m_cart[1]->write(offset & 0x3fff, data, 0, 0, m_romsel & 0x01, 0, 1); + [[fallthrough]]; + case 14: + case 15: + if (m_rom_base == 12) + { + if (!m_rom[m_romsel - 12]->exists()) + m_ram[(m_romsel - 12) << 14 | (offset & 0x3fff)] = data; + } + break; } break; @@ -263,6 +297,8 @@ void electron_romboxp_device::expbus_w(offs_t offset, uint8_t data) if (offset == 0xfc71) { m_cent_data_out->write(data); + m_centronics->write_strobe(0); + m_centronics->write_strobe(1); } break; @@ -272,7 +308,7 @@ void electron_romboxp_device::expbus_w(offs_t offset, uint8_t data) break; case 0xfe: - if (offset == 0xfe05) + if ((offset == 0xfe05) && !(data & 0xf0)) { m_romsel = data & 0x0f; } @@ -285,36 +321,21 @@ void electron_romboxp_device::expbus_w(offs_t offset, uint8_t data) // IMPLEMENTATION //************************************************************************** -uint8_t electron_romboxp_device::status_r() +std::pair<std::error_condition, std::string> electron_romboxp_device::load_rom(device_image_interface &image, generic_slot_device *slot) { - // Status: b7: printer Busy - return (m_centronics_busy << 7) | 0x7f; -} - - -WRITE_LINE_MEMBER(electron_romboxp_device::busy_w) -{ - m_centronics_busy = !state; -} - - -image_init_result electron_romboxp_device::load_rom(device_image_interface &image, generic_slot_device *slot) -{ - uint32_t size = slot->common_get_size("rom"); + uint32_t const size = slot->common_get_size("rom"); // socket accepts 8K and 16K ROM only if (size != 0x2000 && size != 0x4000) - { - image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only 8K/16K is supported"); - return image_init_result::FAIL; - } + return std::make_pair(image_error::INVALIDLENGTH, "Invalid size: Only 8K/16K is supported"); slot->rom_alloc(0x4000, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); slot->common_load_rom(slot->get_rom_base(), size, "rom"); // mirror 8K ROMs - uint8_t *crt = slot->get_rom_base(); - if (size <= 0x2000) memcpy(crt + 0x2000, crt, 0x2000); + uint8_t *const crt = slot->get_rom_base(); + if (size <= 0x2000) + memcpy(crt + 0x2000, crt, 0x2000); - return image_init_result::PASS; + return std::make_pair(std::error_condition(), std::string()); } |