From e40f2551aa647cfcf94b6e65d2cdc4ea483ff6f4 Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Tue, 7 Nov 2017 22:00:28 +0000 Subject: electron: Added Acorn Plus 1 expansion device - moved cart slots from machine to plus1 - replaced OS ROM with good dump --- scripts/src/bus.lua | 2 + src/devices/bus/electron/exp.cpp | 8 +- src/devices/bus/electron/plus1.cpp | 246 +++++++++++++++++++++++++++++++++++++ src/devices/bus/electron/plus1.h | 68 ++++++++++ src/devices/bus/electron/plus3.cpp | 8 +- src/mame/drivers/electron.cpp | 11 +- src/mame/includes/electron.h | 3 - src/mame/machine/electron.cpp | 74 ++--------- 8 files changed, 332 insertions(+), 88 deletions(-) create mode 100644 src/devices/bus/electron/plus1.cpp create mode 100644 src/devices/bus/electron/plus1.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index e46db2c99dd..40c7221e51f 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -714,6 +714,8 @@ if (BUSES["ELECTRON"]~=null) then MAME_DIR .. "src/devices/bus/electron/exp.h", MAME_DIR .. "src/devices/bus/electron/fbjoy.cpp", MAME_DIR .. "src/devices/bus/electron/fbjoy.h", + MAME_DIR .. "src/devices/bus/electron/plus1.cpp", + MAME_DIR .. "src/devices/bus/electron/plus1.h", MAME_DIR .. "src/devices/bus/electron/plus3.cpp", MAME_DIR .. "src/devices/bus/electron/plus3.h", MAME_DIR .. "src/devices/bus/electron/pwrjoy.cpp", diff --git a/src/devices/bus/electron/exp.cpp b/src/devices/bus/electron/exp.cpp index 3bcc1377e19..105a8f44c18 100644 --- a/src/devices/bus/electron/exp.cpp +++ b/src/devices/bus/electron/exp.cpp @@ -103,11 +103,11 @@ void electron_expansion_slot_device::device_reset() #include "fbjoy.h" //#include "fbprint.h" //#include "jafamode7.h" -//#include "plus1.h" +#include "plus1.h" #include "plus3.h" #include "pwrjoy.h" //#include "rombox.h" -//#include "romboxplus.h" +//#include "romboxp.h" #include "m2105.h" //#include "voxbox.h" @@ -117,11 +117,11 @@ SLOT_INTERFACE_START( electron_expansion_devices ) SLOT_INTERFACE("fbjoy", ELECTRON_FBJOY) //SLOT_INTERFACE("fbprint", ELECTRON_FBPRINT) //SLOT_INTERFACE("jafamode7", ELECTRON_JAFAMODE7) - //SLOT_INTERFACE("plus1", ELECTRON_PLUS1) + SLOT_INTERFACE("plus1", ELECTRON_PLUS1) SLOT_INTERFACE("plus3", ELECTRON_PLUS3) SLOT_INTERFACE("pwrjoy", ELECTRON_PWRJOY) //SLOT_INTERFACE("rombox", ELECTRON_ROMBOX) - //SLOT_INTERFACE("romboxplus", ELECTRON_ROMBOXPLUS) + //SLOT_INTERFACE("romboxp", ELECTRON_ROMBOXP) SLOT_INTERFACE("m2105", ELECTRON_M2105) //SLOT_INTERFACE("voxbox", ELECTRON_VOXBOX) SLOT_INTERFACE_END diff --git a/src/devices/bus/electron/plus1.cpp b/src/devices/bus/electron/plus1.cpp new file mode 100644 index 00000000000..cc9067fe6c2 --- /dev/null +++ b/src/devices/bus/electron/plus1.cpp @@ -0,0 +1,246 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + ALA11 - Acorn Plus 1 + + The Acorn Plus 1 added two ROM cartridge slots, an analogue interface + (supporting two channels) and a Centronics parallel port. The + analogue interface was normally used for joysticks, the parallel for + a printer. The ROM slots could be booted from via the "Shift+BREAK" + key-combination. (The slot at the front of the interface took priority + if both were populated). + +**********************************************************************/ + + +#include "emu.h" +#include "plus1.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(ELECTRON_PLUS1, electron_plus1_device, "electron_plus1", "Acorn Plus 1 Expansion") + + +//------------------------------------------------- +// ROM( plus1 ) +//------------------------------------------------- + +ROM_START( plus1 ) + // Bank 12 Expansion module operating system + ROM_REGION( 0x2000, "exp_rom", 0 ) + ROM_DEFAULT_BIOS("plus1") + ROM_SYSTEM_BIOS(0, "plus1", "Expansion 1.00") + ROMX_LOAD("plus1.rom", 0x0000, 0x1000, CRC(ac30b0ed) SHA1(2de04ab7c81414d6c9c967f965c53fc276392463), ROM_BIOS(1)) + ROM_RELOAD( 0x1000, 0x1000) + + ROM_SYSTEM_BIOS(1, "presap1", "PRES Expansion 1.1") + ROMX_LOAD("presplus1.rom", 0x0000, 0x1000, CRC(8ef1e0e5) SHA1(080e1b788b3fe4fa272cd2cc792293eb7b874e82), ROM_BIOS(2)) + ROM_RELOAD( 0x1000, 0x1000) + + ROM_SYSTEM_BIOS(2, "presap2", "PRES AP2 Support 1.23") + ROMX_LOAD("presap2_123.rom", 0x0000, 0x2000, CRC(f796689c) SHA1(bc40a79e6d2b4cb5e549d5d21f673c66a661850d), ROM_BIOS(3)) + + ROM_SYSTEM_BIOS(3, "slogger", "Slogger Expansion 2.02") + ROMX_LOAD("slogger202.rom", 0x0000, 0x2000, CRC(32b440be) SHA1(dbc73e8d919c5615d0241d99db60e06324e16c86), ROM_BIOS(4)) +ROM_END + +//------------------------------------------------- +// INPUT_PORTS( plus1 ) +//------------------------------------------------- + +static INPUT_PORTS_START( plus1 ) + PORT_START("JOY1") + PORT_BIT(0xff, 0x80, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_CENTERDELTA(100) PORT_MINMAX(0x00, 0xff) PORT_PLAYER(1) PORT_REVERSE + + PORT_START("JOY2") + PORT_BIT(0xff, 0x80, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_CENTERDELTA(100) PORT_MINMAX(0x00, 0xff) PORT_PLAYER(1) PORT_REVERSE + + PORT_START("JOY3") + PORT_BIT(0xff, 0x80, IPT_AD_STICK_X) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_CENTERDELTA(100) PORT_MINMAX(0x00, 0xff) PORT_PLAYER(2) PORT_REVERSE + + PORT_START("JOY4") + PORT_BIT(0xff, 0x80, IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(100) PORT_CENTERDELTA(100) PORT_MINMAX(0x00, 0xff) PORT_PLAYER(2) PORT_REVERSE + + PORT_START("BUTTONS") + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(2) +INPUT_PORTS_END + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +ioport_constructor electron_plus1_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( plus1 ); +} + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +MACHINE_CONFIG_MEMBER( electron_plus1_device::device_add_mconfig ) + /* printer */ + MCFG_CENTRONICS_ADD("centronics", centronics_devices, "printer") + MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE(electron_plus1_device, busy_w)) + MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics") + + /* adc */ + MCFG_ADC0844_ADD("adc") + MCFG_ADC0844_INTR_CB(WRITELINE(electron_plus1_device, ready_w)) + MCFG_ADC0844_CH1_CB(IOPORT("JOY1")) + MCFG_ADC0844_CH2_CB(IOPORT("JOY2")) + MCFG_ADC0844_CH3_CB(IOPORT("JOY3")) + MCFG_ADC0844_CH4_CB(IOPORT("JOY4")) + + /* cartridges */ + MCFG_GENERIC_SOCKET_ADD("cart_sk1", generic_plain_slot, "electron_cart") + MCFG_GENERIC_LOAD(electron_plus1_device, electron_cart_sk1) + MCFG_GENERIC_SOCKET_ADD("cart_sk2", generic_plain_slot, "electron_cart") + MCFG_GENERIC_LOAD(electron_plus1_device, electron_cart_sk2) +MACHINE_CONFIG_END + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +const tiny_rom_entry *electron_plus1_device::device_rom_region() const +{ + return ROM_NAME( plus1 ); +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// electron_plus1_device - constructor +//------------------------------------------------- + +electron_plus1_device::electron_plus1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, ELECTRON_PLUS1, tag, owner, clock), + device_electron_expansion_interface(mconfig, *this), + m_exp_rom(*this, "exp_rom"), + m_cart_sk1(*this, "cart_sk1"), + m_cart_sk2(*this, "cart_sk2"), + m_centronics(*this, "centronics"), + m_cent_data_out(*this, "cent_data_out"), + m_adc(*this, "adc"), + m_joy(*this, "JOY%u", 1), + m_buttons(*this, "BUTTONS"), + m_centronics_busy(0), + m_adc_ready(0) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void electron_plus1_device::device_start() +{ + address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM); + m_slot = dynamic_cast(owner()); + + space.install_readwrite_handler(0xfc70, 0xfc70, READ8_DEVICE_DELEGATE(m_adc, adc0844_device, read), WRITE8_DEVICE_DELEGATE(m_adc, adc0844_device, write)); + space.install_write_handler(0xfc71, 0xfc71, WRITE8_DEVICE_DELEGATE("cent_data_out", output_latch_device, write)); + space.install_read_handler(0xfc72, 0xfc72, READ8_DELEGATE(electron_plus1_device, status_r)); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void electron_plus1_device::device_reset() +{ + std::string region_tag; + memory_region *tmp_reg; + if (m_cart_sk2 && (tmp_reg = memregion(region_tag.assign(m_cart_sk2->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))) + { + machine().root_device().membank("bank2")->configure_entries(0, 2, tmp_reg->base(), 0x4000); + } + if (m_cart_sk1 && (tmp_reg = memregion(region_tag.assign(m_cart_sk1->tag()).append(GENERIC_ROM_REGION_TAG).c_str()))) + { + machine().root_device().membank("bank2")->configure_entries(2, 2, tmp_reg->base(), 0x4000); + } + + machine().root_device().membank("bank2")->configure_entry(12, memregion("exp_rom")->base()); +} + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +READ8_MEMBER(electron_plus1_device::status_r) +{ + uint8_t data = 0x0f; + // Status: b7: printer Busy + // b6: ADC conversion end + // b5: Fire Button 1 + // b4: Fire Button 2 + data |= (m_centronics_busy << 7); + data |= (m_adc_ready << 6); + data |= m_buttons->read(); + + return data; +} + +WRITE_LINE_MEMBER(electron_plus1_device::busy_w) +{ + m_centronics_busy = !state; +} + +WRITE_LINE_MEMBER(electron_plus1_device::ready_w) +{ + m_adc_ready = !state; +} + +image_init_result electron_plus1_device::load_cart(device_image_interface &image, generic_slot_device *slot) +{ + if (image.software_entry() == nullptr) + { + uint32_t filesize = image.length(); + + if (filesize != 16384) + { + image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only size 16384 is supported"); + return image_init_result::FAIL; + } + + slot->rom_alloc(filesize, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); + image.fread(slot->get_rom_base(), filesize); + return image_init_result::PASS; + } + else + { + int upsize = image.get_software_region_length("uprom"); + int losize = image.get_software_region_length("lorom"); + + if (upsize != 16384 && upsize != 0) + { + image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size for uprom"); + return image_init_result::FAIL; + } + + if (losize != 16384 && losize != 0) + { + image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size for lorom"); + return image_init_result::FAIL; + } + + slot->rom_alloc(upsize + losize, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); + + if (upsize) + memcpy(slot->get_rom_base(), image.get_software_region("uprom"), upsize); + + if (losize) + memcpy(slot->get_rom_base() + upsize, image.get_software_region("lorom"), losize); + + return image_init_result::PASS; + } +} diff --git a/src/devices/bus/electron/plus1.h b/src/devices/bus/electron/plus1.h new file mode 100644 index 00000000000..75eb44ce91a --- /dev/null +++ b/src/devices/bus/electron/plus1.h @@ -0,0 +1,68 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + ALA11 - Acorn Plus 1 + +**********************************************************************/ + + +#ifndef MAME_BUS_ELECTRON_PLUS1_H +#define MAME_BUS_ELECTRON_PLUS1_H + +#include "exp.h" +#include "softlist.h" +#include "machine/adc0844.h" +#include "bus/centronics/ctronics.h" +#include "bus/generic/slot.h" +#include "bus/generic/carts.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class electron_plus1_device: + public device_t, + public device_electron_expansion_interface +{ +public: + // construction/destruction + electron_plus1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual void device_start() override; + virtual void device_reset() override; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + virtual ioport_constructor device_input_ports() const override; + +private: + DECLARE_READ8_MEMBER(status_r); + DECLARE_WRITE_LINE_MEMBER(busy_w); + DECLARE_WRITE_LINE_MEMBER(ready_w); + + image_init_result load_cart(device_image_interface &image, generic_slot_device *slot); + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(electron_cart_sk1) { return load_cart(image, m_cart_sk1); } + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(electron_cart_sk2) { return load_cart(image, m_cart_sk2); } + + required_memory_region m_exp_rom; + required_device m_cart_sk1; + required_device m_cart_sk2; + required_device m_centronics; + required_device m_cent_data_out; + required_device m_adc; + required_ioport_array<4> m_joy; + required_ioport m_buttons; + + int m_centronics_busy; + int m_adc_ready; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(ELECTRON_PLUS1, electron_plus1_device) + + +#endif /* MAME_BUS_ELECTRON_PLUS1_H */ diff --git a/src/devices/bus/electron/plus3.cpp b/src/devices/bus/electron/plus3.cpp index 72a645c1728..5c339c1bcc7 100644 --- a/src/devices/bus/electron/plus3.cpp +++ b/src/devices/bus/electron/plus3.cpp @@ -17,7 +17,6 @@ #include "emu.h" #include "plus3.h" -#include "softlist.h" //************************************************************************** @@ -39,8 +38,6 @@ FLOPPY_FORMATS_END0 SLOT_INTERFACE_START(electron_floppies) SLOT_INTERFACE("35dd", FLOPPY_35_DD) - SLOT_INTERFACE("525sd", FLOPPY_525_SD) - SLOT_INTERFACE("525dd", FLOPPY_525_DD) SLOT_INTERFACE("525qd", FLOPPY_525_QD) SLOT_INTERFACE_END @@ -68,14 +65,11 @@ ROM_END MACHINE_CONFIG_MEMBER( electron_plus3_device::device_add_mconfig ) /* fdc */ MCFG_WD1770_ADD("fdc", XTAL_16MHz / 2) - MCFG_FLOPPY_DRIVE_ADD("fdc:0", electron_floppies, "35dd", floppy_formats) - MCFG_SLOT_FIXED(true) + MCFG_FLOPPY_DRIVE_ADD_FIXED("fdc:0", electron_floppies, "35dd", floppy_formats) MCFG_FLOPPY_DRIVE_SOUND(true) MCFG_FLOPPY_DRIVE_ADD("fdc:1", electron_floppies, nullptr, floppy_formats) MCFG_FLOPPY_DRIVE_SOUND(true) - /* software lists */ - MCFG_SOFTWARE_LIST_ADD("flop_ls", "electron_flop") /* pass-through */ MCFG_ELECTRON_PASSTHRU_EXPANSION_SLOT_ADD(nullptr) diff --git a/src/mame/drivers/electron.cpp b/src/mame/drivers/electron.cpp index 82f7d94dda1..dcbff9e12d6 100644 --- a/src/mame/drivers/electron.cpp +++ b/src/mame/drivers/electron.cpp @@ -57,12 +57,7 @@ Incomplete: - Graphics (seems to be wrong for several games) - 1 MHz bus is not emulated - Bus claiming by ULA is not implemented - - Currently the cartridge support always loads the upper rom in page 12 - and the lower rom in page 0. This might need further documentation in - the software list and loading code. -Missing: - - Other peripherals ******************************************************************************/ #include "emu.h" @@ -229,9 +224,6 @@ static MACHINE_CONFIG_START( electron ) MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY) MCFG_CASSETTE_INTERFACE("electron_cass") - MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "electron_cart") - MCFG_GENERIC_LOAD(electron_state, electron_cart) - /* expansion port */ MCFG_ELECTRON_EXPANSION_SLOT_ADD("exp", electron_expansion_devices, "plus3", false) MCFG_ELECTRON_EXPANSION_SLOT_IRQ_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE)) @@ -240,6 +232,7 @@ static MACHINE_CONFIG_START( electron ) /* software lists */ MCFG_SOFTWARE_LIST_ADD("cass_list", "electron_cass") MCFG_SOFTWARE_LIST_ADD("cart_list", "electron_cart") + MCFG_SOFTWARE_LIST_ADD("flop_list", "electron_flop") MACHINE_CONFIG_END @@ -259,7 +252,7 @@ MACHINE_CONFIG_END /* Electron Rom Load */ ROM_START(electron) ROM_REGION( 0x44000, "user1", 0 ) /* OS Rom */ - ROM_LOAD( "os.rom", 0x40000, 0x4000, CRC(bf63fb1f) SHA1(a48b8fa0cfb09140e808ac8a187316c605a0b32e) ) /* OS rom */ + ROM_LOAD( "b02_acornos-1.rom", 0x40000, 0x4000, CRC(a0c2cf43) SHA1(a27ce645472cc5497690e4bfab43710efbb0792d) ) /* OS rom */ /* 00000 0 Second external socket on the expansion module (SK2) */ /* 04000 1 Second external socket on the expansion module (SK2) */ /* 08000 2 First external socket on the expansion module (SK1) */ diff --git a/src/mame/includes/electron.h b/src/mame/includes/electron.h index 3d2e7599cb8..f0f92d3dd77 100644 --- a/src/mame/includes/electron.h +++ b/src/mame/includes/electron.h @@ -75,7 +75,6 @@ public: m_maincpu(*this, "maincpu"), m_cassette(*this, "cassette"), m_beeper(*this, "beeper"), - m_cart(*this, "cartslot"), m_keybd(*this, "LINE.%u", 0), m_exp(*this, "exp"), m_ram(*this, RAM_TAG) @@ -109,14 +108,12 @@ public: required_device m_maincpu; required_device m_cassette; required_device m_beeper; - required_device m_cart; required_ioport_array<14> m_keybd; required_device m_exp; required_device m_ram; inline uint8_t read_vram( uint16_t addr ); inline void electron_plot_pixel(bitmap_ind16 &bitmap, int x, int y, uint32_t color); void electron_interrupt_handler(int mode, int interrupt); - DECLARE_DEVICE_IMAGE_LOAD_MEMBER( electron_cart ); DECLARE_INPUT_CHANGED_MEMBER( trigger_reset ); protected: diff --git a/src/mame/machine/electron.cpp b/src/mame/machine/electron.cpp index 1bdfdebb88e..008cb662965 100644 --- a/src/mame/machine/electron.cpp +++ b/src/mame/machine/electron.cpp @@ -172,8 +172,9 @@ WRITE8_MEMBER(electron_state::electron_mem_w) READ8_MEMBER(electron_state::electron_fred_r) { + /* The Issue 4 ULA returns data from OS ROM, whereas Issue 6 ULA will return 0xfc */ logerror("FRED: read fc%02x\n", offset); - return 0xff; + return 0xfc; } WRITE8_MEMBER(electron_state::electron_fred_w) @@ -182,8 +183,9 @@ WRITE8_MEMBER(electron_state::electron_fred_w) READ8_MEMBER(electron_state::electron_jim_r) { + /* The Issue 4 ULA returns data from OS ROM, whereas Issue 6 ULA will return 0xfd */ logerror("JIM: read fd%02x\n", offset); - return 0xff; + return 0xfd; } WRITE8_MEMBER(electron_state::electron_jim_w) @@ -192,7 +194,9 @@ WRITE8_MEMBER(electron_state::electron_jim_w) READ8_MEMBER(electron_state::electron_sheila_r) { - uint8_t data = ((uint8_t *)memregion("user1")->base())[0x43E00 + offset]; + /* The Issue 4 ULA returns data from OS ROM, whereas Issue 6 ULA will return 0xfe */ + uint8_t data = 0xfe; + switch ( offset & 0x0f ) { case 0x00: /* Interrupt status */ @@ -311,6 +315,7 @@ WRITE8_MEMBER(electron_state::electron_sheila_w) m_ula.cassette_motor_mode = ( data >> 6 ) & 0x01; m_cassette->change_state(m_ula.cassette_motor_mode ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MOTOR_DISABLED ); m_ula.capslock_mode = ( data >> 7 ) & 0x01; + output().set_value("capslock_led", m_ula.capslock_mode); break; case 0x08: case 0x0A: case 0x0C: case 0x0E: // video_update @@ -379,23 +384,7 @@ void electron_state::machine_reset() void electron_state::machine_start() { - uint8_t *lo_rom, *up_rom; - std::string region_tag; - memory_region *cart_rom = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str()); - - if (cart_rom) - up_rom = cart_rom->base(); - else - up_rom = memregion("user1")->base() + 12 * 0x4000; - if (cart_rom && cart_rom->bytes() > 0x4000) - lo_rom = cart_rom->base() + 0x4000; - else - lo_rom = memregion("user1")->base(); - - membank("bank2")->configure_entries(0, 1, lo_rom, 0x4000); - membank("bank2")->configure_entries(1, 1, up_rom, 0x4000); - - for (int page = 2; page < 16; page++) + for (int page = 0; page < 16; page++) membank("bank2")->configure_entries(page, 1, memregion("user1")->base() + page * 0x4000, 0x4000); m_ula.interrupt_status = 0x82; @@ -403,48 +392,3 @@ void electron_state::machine_start() timer_set(attotime::zero, TIMER_SETUP_BEEP); m_tape_timer = timer_alloc(TIMER_TAPE_HANDLER); } - -DEVICE_IMAGE_LOAD_MEMBER( electron_state, electron_cart ) -{ - if (!image.loaded_through_softlist()) - { - uint32_t filesize = image.length(); - - if (filesize != 16384) - { - image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size: Only size 16384 is supported"); - return image_init_result::FAIL; - } - - m_cart->rom_alloc(filesize, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); - image.fread(m_cart->get_rom_base(), filesize); - return image_init_result::PASS; - } - else - { - int upsize = image.get_software_region_length("uprom"); - int losize = image.get_software_region_length("lorom"); - - if (upsize != 16384 && upsize != 0) - { - image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size for uprom"); - return image_init_result::FAIL; - } - - if (losize != 16384 && losize != 0) - { - image.seterror(IMAGE_ERROR_UNSPECIFIED, "Invalid size for lorom"); - return image_init_result::FAIL; - } - - m_cart->rom_alloc(upsize + losize, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); - - if (upsize) - memcpy(m_cart->get_rom_base(), image.get_software_region("uprom"), upsize); - - if (losize) - memcpy(m_cart->get_rom_base() + upsize, image.get_software_region("lorom"), losize); - - return image_init_result::PASS; - } -} -- cgit v1.2.3