so long, cartslot.c... you made a really great job, when we

had no concept of slot devices...
This commit is contained in:
Fabio Priuli 2014-10-11 06:59:38 +00:00
parent cba6034c44
commit 8bed8ef381
41 changed files with 8 additions and 398 deletions

2
.gitattributes vendored
View File

@ -2584,8 +2584,6 @@ src/emu/image.c svneol=native#text/plain
src/emu/image.h svneol=native#text/plain
src/emu/imagedev/bitbngr.c svneol=native#text/plain
src/emu/imagedev/bitbngr.h svneol=native#text/plain
src/emu/imagedev/cartslot.c svneol=native#text/plain
src/emu/imagedev/cartslot.h svneol=native#text/plain
src/emu/imagedev/cassette.c svneol=native#text/plain
src/emu/imagedev/cassette.h svneol=native#text/plain
src/emu/imagedev/chd_cd.c svneol=native#text/plain

View File

@ -16,7 +16,6 @@
#include "emu.h"
#include "imagedev/cartslot.h"
#include "exp.h"

View File

@ -16,7 +16,6 @@
#include "emu.h"
#include "imagedev/cartslot.h"
#include "exp.h"

View File

@ -16,7 +16,6 @@
#include "emu.h"
#include "imagedev/cartslot.h"
#include "exp.h"

View File

@ -16,7 +16,6 @@
#include "emu.h"
#include "exp.h"
#include "imagedev/cartslot.h"

View File

@ -9,7 +9,6 @@
#include "emu.h"
#include "coco_pak.h"
#include "includes/coco.h"
#include "imagedev/cartslot.h"
#define CARTSLOT_TAG "cart"
@ -22,7 +21,7 @@ MACHINE_CONFIG_END
ROM_START( coco_pak )
ROM_REGION(0x8000, CARTSLOT_TAG, ROMREGION_ERASE00)
ROM_CART_LOAD(CARTSLOT_TAG, 0x0000, 0x8000, ROM_OPTIONAL | ROM_MIRROR)
// this region is filled by cococart_slot_device::call_load()
ROM_END
//**************************************************************************

View File

@ -16,7 +16,6 @@
#include "emu.h"
#include "exp.h"
#include "imagedev/cartslot.h"

View File

@ -16,7 +16,7 @@
const device_type VC4000_CART_SLOT = &device_creator<vc4000_cart_slot_device>;
//**************************************************************************
// APF Cartridges Interface
// VC4000 Cartridges Interface
//**************************************************************************
//-------------------------------------------------
@ -112,7 +112,7 @@ void vc4000_cart_slot_device::device_config_complete()
//-------------------------------------------------
// APF PCB
// VC4000 PCB
//-------------------------------------------------
struct vc4000_slot

View File

@ -178,7 +178,6 @@ EMUMACHINEOBJS = \
EMUIMAGEDEVOBJS = \
$(EMUIMAGEDEV)/bitbngr.o \
$(EMUIMAGEDEV)/cartslot.o \
$(EMUIMAGEDEV)/cassette.o \
$(EMUIMAGEDEV)/chd_cd.o \
$(EMUIMAGEDEV)/diablo.o \

View File

@ -1,236 +0,0 @@
/**********************************************************************
cartslot.c
Cartridge device
**********************************************************************/
#include <ctype.h>
#include "emu.h"
#include "cartslot.h"
// device type definition
const device_type CARTSLOT = &device_creator<cartslot_image_device>;
//-------------------------------------------------
// cartslot_image_device - constructor
//-------------------------------------------------
cartslot_image_device::cartslot_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, CARTSLOT, "Cartslot", tag, owner, clock, "cartslot_image", __FILE__),
device_image_interface(mconfig, *this),
m_extensions("bin"),
m_interface(NULL),
m_must_be_loaded(0),
m_device_image_partialhash(NULL)
{
}
//-------------------------------------------------
// cartslot_image_device - destructor
//-------------------------------------------------
cartslot_image_device::~cartslot_image_device()
{
}
//-------------------------------------------------
// device_config_complete - perform any
// operations now that the configuration is
// complete
//-------------------------------------------------
void cartslot_image_device::device_config_complete()
{
// set brief and instance name
update_names();
}
/***************************************************************************
IMPLEMENTATION
***************************************************************************/
/*-------------------------------------------------
load_cartridge
-------------------------------------------------*/
int cartslot_image_device::load_cartridge(const rom_entry *romrgn, const rom_entry *roment, bool load)
{
const char *region;
const char *type;
UINT32 flags;
offs_t offset, size, read_length, pos = 0, len;
UINT8 *ptr;
UINT8 clear_val;
int datawidth, littleendian, i, j;
device_t *cpu;
astring regiontag;
device().siblingtag(regiontag, ROMREGION_GETTAG(romrgn));
region = regiontag.cstr();
offset = ROM_GETOFFSET(roment);
size = ROM_GETLENGTH(roment);
flags = ROM_GETFLAGS(roment);
ptr = ((UINT8 *) device().machine().root_device().memregion(region)->base()) + offset;
if (load)
{
if (software_entry() == NULL)
{
/* must this be full size */
if (flags & ROM_FULLSIZE)
{
if (length() != size)
return IMAGE_INIT_FAIL;
}
/* read the ROM */
pos = read_length = fread(ptr, size);
/* reset the ROM to the initial point. */
/* eventually, we could add a flag to allow the ROM to continue instead of restarting whenever a new cart region is present */
fseek(0, SEEK_SET);
}
else
{
/* must this be full size */
if (flags & ROM_FULLSIZE)
{
if (get_software_region_length("rom") != size)
return IMAGE_INIT_FAIL;
}
/* read the ROM */
pos = read_length = get_software_region_length("rom");
memcpy(ptr, get_software_region("rom"), read_length);
}
/* do we need to mirror the ROM? */
if (flags & ROM_MIRROR)
{
while(pos < size)
{
len = MIN(read_length, size - pos);
memcpy(ptr + pos, ptr, len);
pos += len;
}
}
/* postprocess this region */
type = regiontag.cstr();
littleendian = ROMREGION_ISLITTLEENDIAN(romrgn);
datawidth = ROMREGION_GETWIDTH(romrgn) / 8;
/* if the region is inverted, do that now */
device_memory_interface *memory;
cpu = device().machine().device(type);
if (cpu!=NULL && cpu->interface(memory))
{
datawidth = cpu->memory().space_config(AS_PROGRAM)->m_databus_width / 8;
littleendian = (cpu->memory().space_config()->m_endianness == ENDIANNESS_LITTLE);
}
/* swap the endianness if we need to */
#ifdef LSB_FIRST
if (datawidth > 1 && !littleendian)
#else
if (datawidth > 1 && littleendian)
#endif
{
for (i = 0; i < size; i += datawidth)
{
UINT8 temp[8];
memcpy(temp, &ptr[i], datawidth);
for (j = datawidth - 1; j >= 0; j--)
ptr[i + j] = temp[datawidth - 1 - j];
}
}
}
/* clear out anything that remains */
if (!(flags & ROM_NOCLEAR))
{
clear_val = (flags & ROM_FILL_FF) ? 0xFF : 0x00;
memset(ptr + pos, clear_val, size - pos);
}
return IMAGE_INIT_PASS;
}
/*-------------------------------------------------
process_cartridge
-------------------------------------------------*/
int cartslot_image_device::process_cartridge(bool load)
{
const rom_entry *romrgn, *roment;
int result = 0;
device_iterator deviter(device().mconfig().root_device());
for (device_t *device = deviter.first(); device != NULL; device = deviter.next())
for (romrgn = rom_first_region(*device); romrgn != NULL; romrgn = rom_next_region(romrgn))
{
roment = romrgn + 1;
while(!ROMENTRY_ISREGIONEND(roment))
{
if (ROMENTRY_GETTYPE(roment) == ROMENTRYTYPE_CARTRIDGE)
{
astring regiontag;
this->device().siblingtag(regiontag, roment->_hashdata);
if (strcmp(regiontag.cstr(),this->device().tag())==0)
{
result |= load_cartridge(romrgn, roment, load);
/* if loading failed in any cart region, stop loading */
if (result)
return result;
}
}
roment++;
}
}
return IMAGE_INIT_PASS;
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void cartslot_image_device::device_start()
{
}
/*-------------------------------------------------
call_load
-------------------------------------------------*/
bool cartslot_image_device::call_load()
{
/* if this cartridge has a custom DEVICE_IMAGE_LOAD, use it */
if (!m_device_image_load.isnull())
return m_device_image_load(*this);
/* otherwise try the normal route */
return process_cartridge(true);
}
/*-------------------------------------------------
call_unload
-------------------------------------------------*/
void cartslot_image_device::call_unload()
{
/* if this cartridge has a custom DEVICE_IMAGE_UNLOAD, use it */
if (!m_device_image_unload.isnull())
{
m_device_image_unload(*this);
return;
}
process_cartridge(false);
}

View File

@ -1,113 +0,0 @@
/***************************************************************************
Cartrige loading
***************************************************************************/
#ifndef __CARTSLOT_H__
#define __CARTSLOT_H__
/***************************************************************************
MACROS
***************************************************************************/
#define ROM_CART_LOAD(tag,offset,length,flags) \
{ NULL, tag, offset, length, ROMENTRYTYPE_CARTRIDGE | (flags) },
#define ROM_MIRROR 0x01000000
#define ROM_NOMIRROR 0x00000000
#define ROM_FULLSIZE 0x02000000
#define ROM_FILL_FF 0x04000000
#define ROM_NOCLEAR 0x08000000
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
// ======================> cartslot_image_device
class cartslot_image_device : public device_t,
public device_image_interface
{
public:
// construction/destruction
cartslot_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual ~cartslot_image_device();
static void static_set_device_load(device_t &device, device_image_load_delegate callback) { downcast<cartslot_image_device &>(device).m_device_image_load = callback; }
static void static_set_device_unload(device_t &device, device_image_func_delegate callback) { downcast<cartslot_image_device &>(device).m_device_image_unload = callback; }
static void static_set_partialhash(device_t &device, device_image_partialhash_func callback) { downcast<cartslot_image_device &>(device).m_device_image_partialhash = callback; }
static void static_set_extensions(device_t &device, const char *_extensions) { downcast<cartslot_image_device &>(device).m_extensions = _extensions; }
static void static_set_interface(device_t &device, const char *_interface) { downcast<cartslot_image_device &>(device).m_interface = _interface; }
static void static_set_must_be_loaded(device_t &device, bool _must_be_loaded) { downcast<cartslot_image_device &>(device).m_must_be_loaded = _must_be_loaded; }
// image-level overrides
virtual bool call_load();
virtual void call_unload();
virtual bool 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; }
virtual device_image_partialhash_func get_partial_hash() const { return m_device_image_partialhash; }
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 m_must_be_loaded; }
virtual bool is_reset_on_load() const { return 1; }
virtual const char *image_interface() const { return m_interface; }
virtual const char *file_extensions() const { return m_extensions; }
virtual const option_guide *create_option_guide() const { return NULL; }
protected:
// device-level overrides
virtual void device_config_complete();
virtual void device_start();
int load_cartridge(const rom_entry *romrgn, const rom_entry *roment, bool load);
int process_cartridge(bool load);
const char * m_extensions;
const char * m_interface;
bool m_must_be_loaded;
device_image_load_delegate m_device_image_load;
device_image_func_delegate m_device_image_unload;
device_image_partialhash_func m_device_image_partialhash;
};
// device type definition
extern const device_type CARTSLOT;
/***************************************************************************
DEVICE CONFIGURATION MACROS
***************************************************************************/
#define MCFG_CARTSLOT_ADD(_tag) \
MCFG_DEVICE_ADD(_tag, CARTSLOT, 0)
#define MCFG_CARTSLOT_MODIFY(_tag) \
MCFG_DEVICE_MODIFY(_tag)
#define MCFG_CARTSLOT_EXTENSION_LIST(_extensions) \
cartslot_image_device::static_set_extensions(*device, _extensions);
#define MCFG_CARTSLOT_INTERFACE(_interface) \
cartslot_image_device::static_set_interface(*device, _interface);
#define MCFG_CARTSLOT_NOT_MANDATORY \
cartslot_image_device::static_set_must_be_loaded(*device, FALSE);
#define MCFG_CARTSLOT_MANDATORY \
cartslot_image_device::static_set_must_be_loaded(*device, TRUE);
#define MCFG_CARTSLOT_LOAD(_class,_method) \
cartslot_image_device::static_set_device_load(*device, device_image_load_delegate(&DEVICE_IMAGE_LOAD_NAME(_class,_method), #_class "::device_image_load_" #_method, downcast<_class *>(owner)));
#define MCFG_CARTSLOT_UNLOAD(_class,_method) \
cartslot_image_device::static_set_device_unload(*device, device_image_func_delegate(&DEVICE_IMAGE_UNLOAD_NAME(_class,_method), #_class "::device_image_unload_" #_method, downcast<_class *>(owner)));
#define MCFG_CARTSLOT_PARTIALHASH(_partialhash) \
cartslot_image_device::static_set_partialhash(*device, _partialhash);
#endif /* __CARTSLOT_H__ */

View File

@ -60,7 +60,6 @@ Notes/ToDo:
#include "emu.h"
#include "video/ppu2c0x.h"
#include "cpu/m6502/n2a03.h"
#include "imagedev/cartslot.h"
#include "sound/nes_apu.h"
#include "sound/dac.h"
#include "debugger.h"

View File

@ -442,7 +442,6 @@
#include "machine/nvram.h"
#include "cpu/z80/z80.h"
#include "sound/2610intf.h"
#include "imagedev/cartslot.h"
#include "neogeo.lh"

View File

@ -12,7 +12,6 @@ computer to boot up (with keyboard problems).
#include "emu.h"
#include "includes/spectrum.h"
#include "imagedev/snapquik.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "sound/ay8910.h"
#include "sound/speaker.h"

View File

@ -56,7 +56,6 @@
/* Devices */
#include "imagedev/flopdrv.h"
#include "formats/basicdsk.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "formats/uef_cas.h"
#include "formats/csw_cas.h"

View File

@ -13,7 +13,6 @@
#include "bus/cbmiec/c1581.h"
#include "cpu/z80/z80.h"
#include "machine/cbm_snqk.h"
#include "imagedev/cartslot.h"
#include "sound/dac.h"

View File

@ -31,7 +31,6 @@ NMI
#include "includes/cgenie.h"
#include "imagedev/flopdrv.h"
#include "formats/basicdsk.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "sound/ay8910.h"
#include "sound/dac.h"

View File

@ -42,7 +42,6 @@ icq3250a-d
#include "emu.h"
#include "cpu/m6805/m6805.h"
#include "includes/comquest.h"
#include "imagedev/cartslot.h"
#ifdef UNUSED_FUNCTION
READ8_MEMBER(comquest_state::comquest_read)

View File

@ -655,7 +655,6 @@ MACHINE_CONFIG_END
ROM_LOAD( "32x_g_bios.bin", 0x000000, 0x000100, CRC(5c12eae8) SHA1(dbebd76a448447cb6e524ac3cb0fd19fc065d944) ) \
ROM_REGION16_BE( 0x400000, "maincpu", ROMREGION_ERASE00 ) \
/* temp, rom should only be visible here when one of the regs is set, tempo needs it */ \
/* ROM_CART_LOAD("cart", 0x000000, 0x400000, ROM_NOMIRROR) */ \
ROM_COPY( "32x_68k_bios", 0x0, 0x0, 0x100) \
ROM_REGION32_BE( 0x400000, "master", 0 ) /* SH2 Code */ \
ROM_SYSTEM_BIOS( 0, "retail", "Mars Version 1.0 (retail)" ) \

View File

@ -11,7 +11,6 @@
#include "cpu/i8085/i8085.h"
#include "sound/wave.h"
#include "includes/mikro80.h"
#include "imagedev/cartslot.h"
#include "formats/rk_cas.h"
#include "sound/dac.h"

View File

@ -67,7 +67,6 @@
/* Devices */
#include "imagedev/flopdrv.h"
#include "formats/basicdsk.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "machine/ram.h"

View File

@ -101,7 +101,6 @@
#include "machine/rp5c01.h" /* for NC100 real time clock */
#include "machine/upd765.h" /* for NC200 disk drive interface */
#include "formats/pc_dsk.h" /* for NC200 disk image */
#include "imagedev/cartslot.h"
#include "sound/beep.h"
#include "machine/ram.h"
#include "rendlay.h"

View File

@ -1,7 +1,6 @@
#include "emu.h"
#include "includes/spectrum.h"
#include "imagedev/snapquik.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "sound/ay8910.h"
#include "sound/speaker.h"

View File

@ -13,7 +13,6 @@
*/
#include "includes/plus4.h"
#include "imagedev/cartslot.h"
#include "machine/cbm_snqk.h"
#include "sound/t6721a.h"
@ -934,9 +933,8 @@ ROM_START( c264 )
ROM_LOAD( "basic-264.bin", 0x0000, 0x4000, CRC(6a2fc8e3) SHA1(473fce23afa07000cdca899fbcffd6961b36a8a0) )
ROM_LOAD( "kernal-264.bin", 0x4000, 0x4000, CRC(8f32abe7) SHA1(d481faf5fcbb331878dc7851c642d04f26a32873) )
ROM_REGION( 0x8000, "function", 0 )
ROM_CART_LOAD( "lo", 0x0000, 0x0000, ROM_NOMIRROR )
ROM_CART_LOAD( "hi", 0x4000, 0x0000, ROM_NOMIRROR )
ROM_REGION( 0x8000, "function", ROMREGION_ERASE00 )
// TODO: add cart slots to mount EPROMs here
ROM_REGION( 0xf5, PLA_TAG, 0 )
ROM_LOAD( "251641-02", 0x00, 0xf5, NO_DUMP )
@ -952,9 +950,8 @@ ROM_START( c232 )
ROM_LOAD( "318006-01.u4", 0x0000, 0x4000, CRC(74eaae87) SHA1(161c96b4ad20f3a4f2321808e37a5ded26a135dd) )
ROM_LOAD( "318004-01.u5", 0x4000, 0x4000, CRC(dbdc3319) SHA1(3c77caf72914c1c0a0875b3a7f6935cd30c54201) )
ROM_REGION( 0x8000, "function", 0 )
ROM_CART_LOAD( "lo", 0x0000, 0x0000, ROM_NOMIRROR )
ROM_CART_LOAD( "hi", 0x4000, 0x0000, ROM_NOMIRROR )
ROM_REGION( 0x8000, "function", ROMREGION_ERASE00 )
// TODO: add cart slots to mount EPROMs here
ROM_REGION( 0xf5, PLA_TAG, 0 )
ROM_LOAD( "251641-02.u7", 0x00, 0xf5, NO_DUMP )

View File

@ -111,7 +111,6 @@ Interrupts:
#include "cpu/z80/z80.h"
#include "imagedev/cassette.h"
#include "imagedev/snapquik.h"
#include "imagedev/cartslot.h"
#include "formats/primoptp.h"
#include "bus/cbmiec/cbmiec.h"

View File

@ -147,7 +147,6 @@ http://www.z88forever.org.uk/zxplus3e/
#include "emu.h"
#include "includes/spectrum.h"
#include "imagedev/snapquik.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "sound/ay8910.h"
#include "sound/speaker.h"

View File

@ -231,7 +231,6 @@ DC00 - Selection buttons #2, 9-16 (R)
#include "sound/sn76496.h"
#include "sound/2413intf.h"
#include "video/315_5124.h"
#include "imagedev/cartslot.h"
#include "includes/sms.h"
#include "bus/sega8/rom.h"

View File

@ -152,7 +152,6 @@ resulting mess can be seen in the F4 viewer display.
#include "cpu/z80/z80.h"
#include "includes/spectrum.h"
#include "imagedev/snapquik.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "sound/ay8910.h"
#include "sound/speaker.h"

View File

@ -147,7 +147,6 @@ http://www.z88forever.org.uk/zxplus3e/
#include "emu.h"
#include "includes/spectrum.h"
#include "imagedev/snapquik.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "sound/ay8910.h"
#include "sound/speaker.h"

View File

@ -148,7 +148,6 @@ http://www.z88forever.org.uk/zxplus3e/
#include "cpu/z80/z80.h"
#include "includes/spectrum.h"
#include "imagedev/snapquik.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "sound/speaker.h"
#include "sound/ay8910.h"

View File

@ -12,7 +12,6 @@
#include "bus/coleco/exp.h"
#include "cpu/z80/z80.h"
#include "cpu/m6800/m6800.h"
#include "imagedev/cartslot.h"
#include "machine/coleco.h"
#include "machine/ram.h"
#include "sound/sn76496.h"

View File

@ -9,7 +9,6 @@
#include "machine/mos6526.h"
#include "bus/cbmiec/cbmiec.h"
#include "imagedev/cartslot.h"
#include "imagedev/snapquik.h"
#include "machine/ram.h"
#include "sound/mos6581.h"

View File

@ -20,7 +20,6 @@
#include "video/v9938.h"
#include "video/tms9928a.h"
#include "imagedev/flopdrv.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "formats/basicdsk.h"
#include "formats/fmsx_cas.h"

View File

@ -7,7 +7,6 @@
#include "cpu/z80/z80.h"
#include "formats/sc3000_bit.h"
#include "formats/sf7000_dsk.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "imagedev/printer.h"
#include "bus/centronics/ctronics.h"

View File

@ -3,7 +3,6 @@
#include "cpu/z80/z80daisy.h"
#include "sound/wave.h"
#include "imagedev/snapquik.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "sound/speaker.h"
#include "machine/buffer.h"

View File

@ -12,7 +12,6 @@
#include "bus/vic20/exp.h"
#include "bus/vic20/user.h"
#include "cpu/m6502/m6510.h"
#include "imagedev/cartslot.h"
#include "machine/6522via.h"
#include "machine/cbm_snqk.h"
#include "machine/ram.h"

View File

@ -8,7 +8,6 @@
#include "emu.h"
#include "bus/vidbrain/exp.h"
#include "cpu/f8/f8.h"
#include "imagedev/cartslot.h"
#include "machine/f3853.h"
#include "machine/ram.h"
#include "sound/dac.h"

View File

@ -11,7 +11,6 @@
#include "cpu/z80/z80.h"
#include "includes/cgenie.h"
#include "machine/wd17xx.h"
#include "imagedev/cartslot.h"
#include "imagedev/cassette.h"
#include "sound/dac.h"
#include "imagedev/flopdrv.h"

View File

@ -5,7 +5,6 @@
#include "emu.h"
#include "includes/lynx.h"
#include "cpu/m6502/m65sc02.h"
#include "imagedev/cartslot.h"
#define PAD_UP 0x80

View File

@ -10,7 +10,6 @@
#include "crsshair.h"
#include "cpu/m6502/m6502.h"
#include "includes/nes.h"
#include "imagedev/cartslot.h"
#include "imagedev/flopdrv.h"
/***************************************************************************

View File

@ -8,7 +8,6 @@
#define __SPEC_SNQK_H__
#include "imagedev/snapquik.h"
#include "imagedev/cartslot.h"
void spectrum_setup_sna(running_machine &machine, UINT8 *snapdata, UINT32 snapsize);
void spectrum_setup_z80(running_machine &machine, UINT8 *snapdata, UINT32 snapsize);