diff --git a/.gitattributes b/.gitattributes index d093866bde7..cb87b7450ad 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1260,10 +1260,14 @@ src/emu/bus/plus4/user.c svneol=native#text/plain src/emu/bus/plus4/user.h svneol=native#text/plain src/emu/bus/ql/exp.c svneol=native#text/plain src/emu/bus/ql/exp.h svneol=native#text/plain +src/emu/bus/ql/rom.c svneol=native#text/plain +src/emu/bus/ql/rom.h svneol=native#text/plain src/emu/bus/ql/sandy_superdisk.c svneol=native#text/plain src/emu/bus/ql/sandy_superdisk.h svneol=native#text/plain src/emu/bus/ql/sandy_superqboard.c svneol=native#text/plain src/emu/bus/ql/sandy_superqboard.h svneol=native#text/plain +src/emu/bus/ql/std.c svneol=native#text/plain +src/emu/bus/ql/std.h svneol=native#text/plain src/emu/bus/ql/trumpcard.c svneol=native#text/plain src/emu/bus/ql/trumpcard.h svneol=native#text/plain src/emu/bus/rs232/keyboard.c svneol=native#text/plain diff --git a/src/emu/bus/bus.mak b/src/emu/bus/bus.mak index 3f07cf6c09b..f4dd109f991 100644 --- a/src/emu/bus/bus.mak +++ b/src/emu/bus/bus.mak @@ -1148,4 +1148,6 @@ BUSOBJS += $(BUSOBJ)/ql/exp.o BUSOBJS += $(BUSOBJ)/ql/sandy_superdisk.o BUSOBJS += $(BUSOBJ)/ql/sandy_superqboard.o BUSOBJS += $(BUSOBJ)/ql/trumpcard.o +BUSOBJS += $(BUSOBJ)/ql/rom.o +BUSOBJS += $(BUSOBJ)/ql/std.o endif diff --git a/src/emu/bus/ql/rom.c b/src/emu/bus/ql/rom.c new file mode 100644 index 00000000000..bdb3b05c5e0 --- /dev/null +++ b/src/emu/bus/ql/rom.c @@ -0,0 +1,136 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Sinclair QL ROM cartridge port emulation + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#include "rom.h" + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type QL_ROM_CARTRIDGE_SLOT = &device_creator; + + + +//************************************************************************** +// CARD INTERFACE +//************************************************************************** + +//------------------------------------------------- +// device_ql_rom_cartridge_card_interface - constructor +//------------------------------------------------- + +device_ql_rom_cartridge_card_interface::device_ql_rom_cartridge_card_interface(const machine_config &mconfig, device_t &device) : + device_slot_card_interface(mconfig, device), + m_rom(*this, "rom"), + m_romoeh(1) +{ + m_slot = dynamic_cast(device.owner()); +} + + +//------------------------------------------------- +// ~device_ql_rom_cartridge_card_interface - destructor +//------------------------------------------------- + +device_ql_rom_cartridge_card_interface::~device_ql_rom_cartridge_card_interface() +{ +} + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// ql_rom_cartridge_slot_t - constructor +//------------------------------------------------- + +ql_rom_cartridge_slot_t::ql_rom_cartridge_slot_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, QL_ROM_CARTRIDGE_SLOT, "QL ROM cartridge slot", tag, owner, clock, "ql_rom_cartridge_slot", __FILE__), + device_slot_interface(mconfig, *this), + device_image_interface(mconfig, *this) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void ql_rom_cartridge_slot_t::device_start() +{ + m_card = dynamic_cast(get_card_device()); +} + + +//------------------------------------------------- +// call_load - +//------------------------------------------------- + +bool ql_rom_cartridge_slot_t::call_load() +{ + if (m_card) + { + size_t size = 0; + + if (software_entry() == NULL) + { + size = length(); + + m_card->m_rom.allocate(size); + fread(m_card->m_rom, size); + } + else + { + load_software_region("rom", m_card->m_rom); + } + } + + return IMAGE_INIT_PASS; +} + + +//------------------------------------------------- +// call_softlist_load - +//------------------------------------------------- + +bool ql_rom_cartridge_slot_t::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) +{ + load_software_part_region(*this, swlist, swname, start_entry); + + return true; +} + + +//------------------------------------------------- +// get_default_card_software - +//------------------------------------------------- + +void ql_rom_cartridge_slot_t::get_default_card_software(astring &result) +{ + software_get_default_slot(result, "standard"); +} + + +//------------------------------------------------- +// SLOT_INTERFACE( ql_rom_cartridge_cards ) +//------------------------------------------------- + +// slot devices +#include "std.h" + +SLOT_INTERFACE_START( ql_rom_cartridge_cards ) + // the following need ROMs from the software list + SLOT_INTERFACE_INTERNAL("standard", QL_STANDARD_ROM_CARTRIDGE) +SLOT_INTERFACE_END diff --git a/src/emu/bus/ql/rom.h b/src/emu/bus/ql/rom.h new file mode 100644 index 00000000000..74a655dba15 --- /dev/null +++ b/src/emu/bus/ql/rom.h @@ -0,0 +1,129 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Sinclair QL ROM cartridge port emulation + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +********************************************************************** + + A B + * 1 * VDD + A12 * 2 * A14 + A7 * 3 * A13 + A6 * 4 * A8 + A5 * 5 * A9 + SLOT 6 SLOT + A4 * 7 * A11 + A3 * 8 * ROMOEH + A2 * 9 * A10 + A1 * 10 * A15 + A0 * 11 * D7 + D0 * 12 * D6 + D1 * 13 * D5 + D2 * 14 * D4 + GND * 15 * D3 + +**********************************************************************/ + +#pragma once + +#ifndef __QL_ROM_CARTRIDGE_SLOT__ +#define __QL_ROM_CARTRIDGE_SLOT__ + +#include "emu.h" + + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_QL_ROM_CARTRIDGE_SLOT_ADD(_tag, _slot_intf, _def_slot) \ + MCFG_DEVICE_ADD(_tag, QL_ROM_CARTRIDGE_SLOT, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> device_ql_rom_cartridge_card_interface + +class ql_rom_cartridge_slot_t; + +class device_ql_rom_cartridge_card_interface : public device_slot_card_interface +{ + friend class ql_rom_cartridge_slot_t; + +public: + // construction/destruction + device_ql_rom_cartridge_card_interface(const machine_config &mconfig, device_t &device); + virtual ~device_ql_rom_cartridge_card_interface(); + + virtual void romoeh_w(int state) { m_romoeh = state; } + virtual UINT8 read(address_space &space, offs_t offset, UINT8 data) { return data; } + virtual void write(address_space &space, offs_t offset, UINT8 data) { } + +protected: + ql_rom_cartridge_slot_t *m_slot; + + optional_shared_ptr m_rom; + + int m_romoeh; +}; + + +// ======================> ql_rom_cartridge_slot_t + +class ql_rom_cartridge_slot_t : public device_t, + public device_slot_interface, + public device_image_interface +{ +public: + // construction/destruction + ql_rom_cartridge_slot_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // computer interface + UINT8 read(address_space &space, offs_t offset, UINT8 data) { if (m_card) data = m_card->read(space, offset, data); return data; } + void write(address_space &space, offs_t offset, UINT8 data) { if (m_card) m_card->write(space, offset, data); } + DECLARE_WRITE_LINE_MEMBER( romoeh_w ) { if (m_card) m_card->romoeh_w(state); } + +protected: + // device-level overrides + virtual void device_config_complete() { update_names(); } + virtual void device_start(); + + // image-level overrides + virtual bool call_load(); + virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry); + + virtual iodevice_t image_type() const { return IO_CARTSLOT; } + + virtual bool is_readable() const { return 1; } + virtual bool is_writeable() const { return 0; } + virtual bool is_creatable() const { return 0; } + virtual bool must_be_loaded() const { return 0; } + virtual bool is_reset_on_load() const { return 1; } + virtual const char *image_interface() const { return "ql_cart"; } + virtual const char *file_extensions() const { return "rom,bin"; } + virtual const option_guide *create_option_guide() const { return NULL; } + + // slot interface overrides + virtual void get_default_card_software(astring &result); + + device_ql_rom_cartridge_card_interface *m_card; +}; + + +// device type definition +extern const device_type QL_ROM_CARTRIDGE_SLOT; + +SLOT_INTERFACE_EXTERN( ql_rom_cartridge_cards ); + + + +#endif diff --git a/src/emu/bus/ql/std.c b/src/emu/bus/ql/std.c new file mode 100644 index 00000000000..0927cb221b1 --- /dev/null +++ b/src/emu/bus/ql/std.c @@ -0,0 +1,60 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Sinclair QL standard ROM cartridge emulation + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#include "std.h" + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type QL_STANDARD_ROM_CARTRIDGE = &device_creator; + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// ql_standard_rom_cartridge_t - constructor +//------------------------------------------------- + +ql_standard_rom_cartridge_t::ql_standard_rom_cartridge_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, QL_STANDARD_ROM_CARTRIDGE, "QL standard ROM cartridge", tag, owner, clock, "ql_standard", __FILE__), + device_ql_rom_cartridge_card_interface(mconfig, *this) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void ql_standard_rom_cartridge_t::device_start() +{ +} + + +//------------------------------------------------- +// read - cartridge data read +//------------------------------------------------- + +UINT8 ql_standard_rom_cartridge_t::read(address_space &space, offs_t offset, UINT8 data) +{ + if (m_romoeh && m_rom.bytes()) + { + data = m_rom[offset & m_rom.mask()]; + } + + return data; +} diff --git a/src/emu/bus/ql/std.h b/src/emu/bus/ql/std.h new file mode 100644 index 00000000000..35014c4d812 --- /dev/null +++ b/src/emu/bus/ql/std.h @@ -0,0 +1,47 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Sinclair QL standard ROM cartridge emulation + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +**********************************************************************/ + +#pragma once + +#ifndef __QL_STANDARD_ROM_CARTRIDGE__ +#define __QL_STANDARD_ROM_CARTRIDGE__ + +#include "rom.h" + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> ql_standard_rom_cartridge_t + +class ql_standard_rom_cartridge_t : public device_t, + public device_ql_rom_cartridge_card_interface +{ +public: + // construction/destruction + ql_standard_rom_cartridge_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + +protected: + // device-level overrides + virtual void device_start(); + + // device_ql_rom_cartridge_card_interface overrides + virtual UINT8 read(address_space &space, offs_t offset, UINT8 data); +}; + + +// device type definition +extern const device_type QL_STANDARD_ROM_CARTRIDGE; + + +#endif diff --git a/src/mess/drivers/ql.c b/src/mess/drivers/ql.c index d283b26cae4..df48269a564 100644 --- a/src/mess/drivers/ql.c +++ b/src/mess/drivers/ql.c @@ -1119,6 +1119,8 @@ static MACHINE_CONFIG_START( ql, ql_state ) //MCFG_QL_EXPANSION_SLOT_BERRL_CALLBACK() MCFG_QL_EXPANSION_SLOT_EXTINTL_CALLBACK(DEVWRITELINE(ZX8302_TAG, zx8302_device, extint_w)) + MCFG_QL_ROM_CARTRIDGE_SLOT_ADD("rom", ql_rom_cartridge_cards, NULL) + // cartridge MCFG_CARTSLOT_ADD("cart") MCFG_CARTSLOT_EXTENSION_LIST("bin,rom") diff --git a/src/mess/includes/ql.h b/src/mess/includes/ql.h index 447b6c34093..fc3bf0fa9ab 100644 --- a/src/mess/includes/ql.h +++ b/src/mess/includes/ql.h @@ -8,6 +8,7 @@ #include "emu.h" #include "bus/centronics/ctronics.h" #include "bus/ql/exp.h" +#include "bus/ql/rom.h" #include "bus/rs232/rs232.h" #include "cpu/m68000/m68000.h" #include "cpu/mcs48/mcs48.h"