diff --git a/hash/spc1000_cass.xml b/hash/spc1000_cass.xml
index 96c5de6b9b9..a227099faaa 100644
--- a/hash/spc1000_cass.xml
+++ b/hash/spc1000_cass.xml
@@ -506,6 +506,18 @@
+
+ Gun Fright
+ 1986
+ Sammi Computer
+
+
+
+
+
+
+
+
Head-On
198?
@@ -1000,6 +1012,18 @@
+
+ TwinBee
+ 1986
+ Static Soft
+
+
+
+
+
+
+
+
Vela
198?
@@ -1070,35 +1094,11 @@
-
- Zexas
- 198?
- Aloe?
-
-
-
-
-
-
-
-
-
-
- TwinBee
- 198?
- <unknown>
-
-
-
-
-
-
-
-
-
+
Zanac
198?
- <unknown>
+ A.I.
+
@@ -1106,14 +1106,13 @@
-
-
- Gun Fright
+
+ Zexas
198?
- <unknown>
+ Aloe?
-
-
+
+
diff --git a/src/emu/bus/bus.mak b/src/emu/bus/bus.mak
index 61111be9665..f7e8b67e8d8 100644
--- a/src/emu/bus/bus.mak
+++ b/src/emu/bus/bus.mak
@@ -682,6 +682,19 @@ BUSOBJS += $(BUSOBJ)/s100/wunderbus.o
endif
+#-------------------------------------------------
+#
+#@src/emu/bus/spc1000/exp.h,BUSES += SPC1000
+#-------------------------------------------------
+
+ifneq ($(filter SPC1000,$(BUSES)),)
+OBJDIRS += $(BUSOBJ)/spc1000
+BUSOBJS += $(BUSOBJ)/spc1000/exp.o
+BUSOBJS += $(BUSOBJ)/spc1000/fdd.o
+BUSOBJS += $(BUSOBJ)/spc1000/vdp.o
+endif
+
+
#-------------------------------------------------
#
#@src/emu/bus/tvc/tvc.h,BUSES += TVC
diff --git a/src/emu/bus/spc1000/exp.c b/src/emu/bus/spc1000/exp.c
new file mode 100644
index 00000000000..8a236b64fb8
--- /dev/null
+++ b/src/emu/bus/spc1000/exp.c
@@ -0,0 +1,80 @@
+/***********************************************************************************************************
+
+ Samsung SPC-1000 Expansion port
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "exp.h"
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type SPC1000_EXP_SLOT = &device_creator;
+
+
+device_spc1000_card_interface::device_spc1000_card_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device)
+{
+}
+
+
+device_spc1000_card_interface::~device_spc1000_card_interface()
+{
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// spc1000_exp_device - constructor
+//-------------------------------------------------
+spc1000_exp_device::spc1000_exp_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, SPC1000_EXP_SLOT, "Samsung SPC-1000 expansion", tag, owner, clock, "spc1000_exp", __FILE__),
+ device_slot_interface(mconfig, *this)
+{
+}
+
+
+//-------------------------------------------------
+// spc1000_exp_device - destructor
+//-------------------------------------------------
+
+spc1000_exp_device::~spc1000_exp_device()
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void spc1000_exp_device::device_start()
+{
+ m_card = dynamic_cast(get_card_device());
+}
+
+/*-------------------------------------------------
+ read
+ -------------------------------------------------*/
+
+READ8_MEMBER(spc1000_exp_device::read)
+{
+ if (m_card)
+ return m_card->read(space, offset);
+ else
+ return 0xff;
+}
+
+/*-------------------------------------------------
+ write
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(spc1000_exp_device::write)
+{
+ if (m_card)
+ m_card->write(space, offset, data);
+}
diff --git a/src/emu/bus/spc1000/exp.h b/src/emu/bus/spc1000/exp.h
new file mode 100644
index 00000000000..44d3a49ae27
--- /dev/null
+++ b/src/emu/bus/spc1000/exp.h
@@ -0,0 +1,48 @@
+#ifndef __SCP1000_SLOT_H
+#define __SCP1000_SLOT_H
+
+// ======================> device_spc1000_card_interface
+
+class device_spc1000_card_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ device_spc1000_card_interface(const machine_config &mconfig, device_t &device);
+ virtual ~device_spc1000_card_interface();
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read) { return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(write) {}
+
+protected:
+};
+
+
+// ======================> spc1000_exp_device
+
+class spc1000_exp_device : public device_t,
+ public device_slot_interface
+{
+public:
+ // construction/destruction
+ spc1000_exp_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ virtual ~spc1000_exp_device();
+
+ // device-level overrides
+ virtual void device_start();
+
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(read);
+ virtual DECLARE_WRITE8_MEMBER(write);
+
+protected:
+
+ device_spc1000_card_interface* m_card;
+};
+
+
+
+// device type definition
+extern const device_type SPC1000_EXP_SLOT;
+
+#endif
diff --git a/src/emu/bus/spc1000/fdd.c b/src/emu/bus/spc1000/fdd.c
new file mode 100644
index 00000000000..1a9cbb33f81
--- /dev/null
+++ b/src/emu/bus/spc1000/fdd.c
@@ -0,0 +1,224 @@
+/***************************************************************************
+
+ SPC-1000 FDD unit
+
+***************************************************************************/
+
+#include "emu.h"
+#include "fdd.h"
+
+
+/***************************************************************************
+ IMPLEMENTATION
+***************************************************************************/
+
+READ8_MEMBER(spc1000_fdd_exp_device::i8255_c_r)
+{
+ return m_i8255_0_pc >> 4;
+}
+
+WRITE8_MEMBER(spc1000_fdd_exp_device::i8255_b_w)
+{
+ m_i8255_portb = data;
+}
+
+WRITE8_MEMBER(spc1000_fdd_exp_device::i8255_c_w)
+{
+ m_i8255_1_pc = data;
+}
+
+//-------------------------------------------------
+// fdc interrupt
+//-------------------------------------------------
+
+READ8_MEMBER( spc1000_fdd_exp_device::tc_r )
+{
+ logerror("%s: tc_r\n", space.machine().describe_context());
+
+ // toggle tc on read
+ m_fdc->tc_w(true);
+ m_timer_tc->adjust(attotime::zero);
+
+ return 0xff;
+}
+
+WRITE8_MEMBER( spc1000_fdd_exp_device::control_w )
+{
+ logerror("%s: control_w(%02x)\n", space.machine().describe_context(), data);
+
+ // bit 0, motor on signal
+ if (m_fd0)
+ m_fd0->mon_w(!BIT(data, 0));
+ if (m_fd1)
+ m_fd1->mon_w(!BIT(data, 0));
+}
+
+static ADDRESS_MAP_START( sd725_mem, AS_PROGRAM, 8, spc1000_fdd_exp_device )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x0000, 0x1fff) AM_ROM
+ AM_RANGE(0x2000, 0xffff) AM_RAM
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( sd725_io, AS_IO, 8, spc1000_fdd_exp_device )
+ ADDRESS_MAP_UNMAP_HIGH
+ ADDRESS_MAP_GLOBAL_MASK(0xff)
+ AM_RANGE(0xf8, 0xf8) AM_READWRITE(tc_r, control_w) // (R) Terminal Count Port (W) Motor Control Port
+ AM_RANGE(0xfa, 0xfb) AM_DEVICE("upd765", upd765a_device, map)
+ AM_RANGE(0xfc, 0xff) AM_DEVREADWRITE("d8255_master", i8255_device, read, write)
+ADDRESS_MAP_END
+
+static SLOT_INTERFACE_START( sd725_floppies )
+ SLOT_INTERFACE("sd320", EPSON_SD_320)
+SLOT_INTERFACE_END
+
+static MACHINE_CONFIG_FRAGMENT(spc1000_fdd)
+
+ /* sub CPU(5 inch floppy drive) */
+ MCFG_CPU_ADD("fdccpu", Z80, XTAL_4MHz) /* 4 MHz */
+ MCFG_CPU_PROGRAM_MAP(sd725_mem)
+ MCFG_CPU_IO_MAP(sd725_io)
+
+ MCFG_DEVICE_ADD("d8255_master", I8255, 0)
+ MCFG_I8255_IN_PORTA_CB(DEVREAD8("d8255_master", i8255_device, pb_r))
+ MCFG_I8255_IN_PORTB_CB(DEVREAD8("d8255_master", i8255_device, pa_r))
+ MCFG_I8255_OUT_PORTB_CB(WRITE8(spc1000_fdd_exp_device, i8255_b_w))
+ MCFG_I8255_IN_PORTC_CB(READ8(spc1000_fdd_exp_device, i8255_c_r))
+ MCFG_I8255_OUT_PORTC_CB(WRITE8(spc1000_fdd_exp_device, i8255_c_w))
+
+ // floppy disk controller
+ MCFG_UPD765A_ADD("upd765", true, true)
+ MCFG_UPD765_INTRQ_CALLBACK(INPUTLINE("fdccpu", INPUT_LINE_IRQ0))
+
+ // floppy drives
+ MCFG_FLOPPY_DRIVE_ADD("upd765:0", sd725_floppies, "sd320", floppy_image_device::default_floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("upd765:1", sd725_floppies, "sd320", floppy_image_device::default_floppy_formats)
+MACHINE_CONFIG_END
+
+//-------------------------------------------------
+// device_mconfig_additions
+//-------------------------------------------------
+
+machine_config_constructor spc1000_fdd_exp_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( spc1000_fdd );
+}
+
+ROM_START( spc1000_fdd )
+ ROM_REGION(0x10000, "fdccpu", 0)
+ ROM_LOAD("sd725a.bin", 0x0000, 0x1000, CRC(96ac2eb8) SHA1(8e9d8f63a7fb87af417e95603e71cf537a6e83f1))
+ROM_END
+
+//-------------------------------------------------
+// device_rom_region
+//-------------------------------------------------
+
+const rom_entry *spc1000_fdd_exp_device::device_rom_region() const
+{
+ return ROM_NAME( spc1000_fdd );
+}
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type SPC1000_FDD_EXP = &device_creator;
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// spc1000_fdd_exp_device - constructor
+//-------------------------------------------------
+
+spc1000_fdd_exp_device::spc1000_fdd_exp_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, SPC1000_FDD_EXP, "SPC1000 FDD expansion", tag, owner, clock, "spc1000_fdd_exp", __FILE__),
+ device_spc1000_card_interface(mconfig, *this),
+ m_cpu(*this, "fdccpu"),
+ m_fdc(*this, "upd765"),
+ m_pio(*this, "d8255_master")
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void spc1000_fdd_exp_device::device_start()
+{
+ m_timer_tc = timer_alloc(TIMER_TC);
+ m_timer_tc->adjust(attotime::never);
+
+ m_fd0 = subdevice("upd765:0")->get_device();
+ m_fd1 = subdevice("upd765:1")->get_device();
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void spc1000_fdd_exp_device::device_reset()
+{
+ m_cpu->set_input_line_vector(0, 0);
+
+ // enable rom (is this really needed? it does not seem necessary for FDD to work)
+ m_cpu->space(AS_PROGRAM).install_rom(0x0000, 0x0fff, 0, 0x2000, device().machine().root_device().memregion("fdccpu")->base());
+}
+
+void spc1000_fdd_exp_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_TC:
+ m_fdc->tc_w(false);
+ break;
+ }
+}
+
+/*-------------------------------------------------
+ read
+-------------------------------------------------*/
+
+READ8_MEMBER(spc1000_fdd_exp_device::read)
+{
+ // this should be m_pio->read on the whole 0x00-0x03 range?
+ if (offset >= 3)
+ return 0xff;
+ else
+ {
+ UINT8 data = 0;
+ switch (offset)
+ {
+ case 1:
+ data = m_i8255_portb;
+ break;
+ case 2:
+ data = m_i8255_1_pc >> 4;
+ break;
+ }
+ return data;
+ }
+}
+
+//-------------------------------------------------
+// write
+//-------------------------------------------------
+
+WRITE8_MEMBER(spc1000_fdd_exp_device::write)
+{
+ // this should be m_pio->write on the whole 0x00-0x03 range?
+ if (offset < 3)
+ {
+ switch (offset)
+ {
+ case 0:
+ m_pio->write(space, 1, data);
+ break;
+ case 2:
+ m_i8255_0_pc = data;
+ break;
+ }
+ }
+}
diff --git a/src/emu/bus/spc1000/fdd.h b/src/emu/bus/spc1000/fdd.h
new file mode 100644
index 00000000000..b06dc8fa971
--- /dev/null
+++ b/src/emu/bus/spc1000/fdd.h
@@ -0,0 +1,63 @@
+#ifndef __SPC1000_FDD_H__
+#define __SPC1000_FDD_H__
+
+#include "exp.h"
+#include "cpu/z80/z80.h"
+#include "machine/i8255.h"
+#include "machine/upd765.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> spc1000_fdd_exp_device
+
+class spc1000_fdd_exp_device : public device_t,
+ public device_spc1000_card_interface
+{
+public:
+ // construction/destruction
+ spc1000_fdd_exp_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const;
+ virtual const rom_entry *device_rom_region() const;
+
+public:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ virtual DECLARE_READ8_MEMBER(read);
+ virtual DECLARE_WRITE8_MEMBER(write);
+
+ DECLARE_READ8_MEMBER(tc_r);
+ DECLARE_WRITE8_MEMBER(control_w);
+ DECLARE_WRITE8_MEMBER(i8255_b_w);
+ DECLARE_READ8_MEMBER(i8255_c_r);
+ DECLARE_WRITE8_MEMBER(i8255_c_w);
+
+private:
+ // internal state
+ required_device m_cpu;
+ required_device m_fdc;
+ required_device m_pio;
+
+ floppy_image_device *m_fd0;
+ floppy_image_device *m_fd1;
+
+ emu_timer *m_timer_tc;
+
+ UINT8 m_i8255_0_pc;
+ UINT8 m_i8255_1_pc;
+ UINT8 m_i8255_portb;
+
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
+ static const device_timer_id TIMER_TC = 0;
+};
+
+
+// device type definition
+extern const device_type SPC1000_FDD_EXP;
+
+#endif /* __SPC1000_FDD_H__ */
diff --git a/src/emu/bus/spc1000/vdp.c b/src/emu/bus/spc1000/vdp.c
new file mode 100644
index 00000000000..511a7937bb0
--- /dev/null
+++ b/src/emu/bus/spc1000/vdp.c
@@ -0,0 +1,104 @@
+/***************************************************************************
+
+ SPC-1000 VDP expansion unit
+
+***************************************************************************/
+
+#include "emu.h"
+#include "vdp.h"
+
+
+/***************************************************************************
+ IMPLEMENTATION
+***************************************************************************/
+
+WRITE_LINE_MEMBER(spc1000_vdp_exp_device::vdp_interrupt)
+{
+ // nothing here?
+}
+
+static MACHINE_CONFIG_FRAGMENT(scp1000_vdp)
+
+ MCFG_DEVICE_ADD("tms", TMS9928A, XTAL_10_738635MHz / 2) // TODO: which clock?
+ MCFG_TMS9928A_VRAM_SIZE(0x4000)
+ MCFG_TMS9928A_OUT_INT_LINE_CB(WRITELINE(spc1000_vdp_exp_device, vdp_interrupt))
+ MCFG_TMS9928A_SCREEN_ADD_NTSC("tms_screen")
+ MCFG_SCREEN_UPDATE_DEVICE("tms", tms9928a_device, screen_update)
+MACHINE_CONFIG_END
+
+//-------------------------------------------------
+// device_mconfig_additions
+//-------------------------------------------------
+
+machine_config_constructor spc1000_vdp_exp_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( scp1000_vdp );
+}
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type SPC1000_VDP_EXP = &device_creator;
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// spc1000_vdp_exp_device - constructor
+//-------------------------------------------------
+
+spc1000_vdp_exp_device::spc1000_vdp_exp_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, SPC1000_VDP_EXP, "SPC1000 VDP expansion", tag, owner, clock, "spc1000_vdp_exp", __FILE__),
+ device_spc1000_card_interface(mconfig, *this),
+ m_vdp(*this, "tms")
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void spc1000_vdp_exp_device::device_start()
+{
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void spc1000_vdp_exp_device::device_reset()
+{
+}
+
+/*-------------------------------------------------
+ read
+-------------------------------------------------*/
+READ8_MEMBER(spc1000_vdp_exp_device::read)
+{
+ if (!(offset & 0x800))
+ return 0xff;
+
+ if (offset & 1)
+ return m_vdp->register_read(space, offset);
+ else
+ return m_vdp->vram_read(space, offset);
+}
+
+//-------------------------------------------------
+// write
+//-------------------------------------------------
+
+WRITE8_MEMBER(spc1000_vdp_exp_device::write)
+{
+ if (offset & 0x800)
+ {
+ if (offset & 1)
+ m_vdp->register_write(space, offset, data);
+ else
+ m_vdp->vram_write(space, offset, data);
+ }
+}
diff --git a/src/emu/bus/spc1000/vdp.h b/src/emu/bus/spc1000/vdp.h
new file mode 100644
index 00000000000..8fbc10ad4e1
--- /dev/null
+++ b/src/emu/bus/spc1000/vdp.h
@@ -0,0 +1,43 @@
+#ifndef __SPC1000_VDP_H__
+#define __SPC1000_VDP_H__
+
+#include "exp.h"
+#include "video/tms9928a.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> spc1000_vdp_exp_device
+
+class spc1000_vdp_exp_device : public device_t,
+ public device_spc1000_card_interface
+{
+public:
+ // construction/destruction
+ spc1000_vdp_exp_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const;
+
+public:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ virtual DECLARE_READ8_MEMBER(read);
+ virtual DECLARE_WRITE8_MEMBER(write);
+
+ DECLARE_WRITE_LINE_MEMBER(vdp_interrupt);
+
+private:
+ // internal state
+ required_device m_vdp;
+};
+
+
+// device type definition
+extern const device_type SPC1000_VDP_EXP;
+
+#endif /* __SPC1000_VDP_H__ */
diff --git a/src/mess/drivers/spc1000.c b/src/mess/drivers/spc1000.c
index bde2449a09c..dcc8dafc4f3 100644
--- a/src/mess/drivers/spc1000.c
+++ b/src/mess/drivers/spc1000.c
@@ -29,14 +29,16 @@ NOTE: 2014-09-13: added code from someone's modified MESS driver for floppy
#include "emu.h"
#include "cpu/z80/z80.h"
-#include "video/mc6847.h"
+#include "machine/ram.h"
#include "sound/ay8910.h"
#include "sound/wave.h"
+#include "video/mc6847.h"
#include "imagedev/cassette.h"
-#include "machine/ram.h"
#include "formats/spc1000_cas.h"
-#include "machine/i8255.h"
-#include "machine/upd765.h"
+
+#include "bus/spc1000/exp.h"
+#include "bus/spc1000/fdd.h"
+#include "bus/spc1000/vdp.h"
class spc1000_state : public driver_device
@@ -44,14 +46,11 @@ class spc1000_state : public driver_device
public:
spc1000_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
- , m_p_videoram(*this, "videoram")
- , m_vdg(*this, "mc6847")
, m_maincpu(*this, "maincpu")
- , m_fdccpu(*this, "fdccpu")
- , m_fdc(*this, "upd765")
- , m_pio(*this, "d8255_master")
- , m_ram(*this, RAM_TAG)
+ , m_vdg(*this, "mc6847")
, m_cass(*this, "cassette")
+ , m_ram(*this, RAM_TAG)
+ , m_p_videoram(*this, "videoram")
, m_io_kb(*this, "LINE")
, m_io_joy(*this, "JOY")
{}
@@ -64,20 +63,12 @@ public:
DECLARE_READ8_MEMBER(porta_r);
DECLARE_READ8_MEMBER(mc6847_videoram_r);
DECLARE_WRITE8_MEMBER(cass_w);
- DECLARE_WRITE8_MEMBER(sd725_w);
- DECLARE_READ8_MEMBER(sd725_r);
- DECLARE_WRITE8_MEMBER(fdc_8255_b_w);
- DECLARE_READ8_MEMBER(fdc_8255_c_r);
- DECLARE_WRITE8_MEMBER(fdc_8255_c_w);
- DECLARE_READ8_MEMBER(upd765_tc_r);
- DECLARE_WRITE8_MEMBER(fdc_control_w);
DECLARE_READ8_MEMBER(keyboard_r);
MC6847_GET_CHARROM_MEMBER(get_char_rom)
{
return m_p_videoram[0x1000 + (ch & 0x7f) * 16 + line];
}
- required_shared_ptr m_p_videoram;
private:
UINT8 m_IPLK;
UINT8 m_GMODE;
@@ -85,33 +76,15 @@ private:
UINT8 *m_work_ram;
virtual void machine_start();
virtual void machine_reset();
+ required_device m_maincpu;
required_device m_vdg;
- required_device m_maincpu;
- required_device m_fdccpu;
- required_device m_fdc;
- required_device m_pio;
- required_device m_ram;
required_device m_cass;
+ required_device m_ram;
+ required_shared_ptr m_p_videoram;
required_ioport_array<10> m_io_kb;
required_ioport m_io_joy;
-
- floppy_image_device *m_fd0;
- floppy_image_device *m_fd1;
-
- emu_timer *m_timer_tc;
-
- UINT8 m_i8255_0_pc;
- UINT8 m_i8255_1_pc;
- UINT8 m_i8255_portb;
-
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
};
-void spc1000_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- m_fdc->tc_w(false);
-}
-
static ADDRESS_MAP_START(spc1000_mem, AS_PROGRAM, 8, spc1000_state )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x0000, 0x7fff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank2")
@@ -157,75 +130,6 @@ READ8_MEMBER(spc1000_state::gmode_r)
return m_GMODE;
}
-READ8_MEMBER(spc1000_state::sd725_r)
-{
- UINT8 data = 0;
- switch (offset)
- {
- case 1:
- data = m_i8255_portb;
- break;
- case 2:
- data = m_i8255_1_pc >> 4;
- break;
- }
- return data;
-}
-
-WRITE8_MEMBER(spc1000_state::sd725_w)
-{
- switch (offset)
- {
- case 0:
- m_pio->write(space, offset+1, data);
- break;
- case 2:
- m_i8255_0_pc = data;
- break;
- }
-}
-
-READ8_MEMBER(spc1000_state::fdc_8255_c_r)
-{
- return m_i8255_0_pc >> 4;
-}
-
-WRITE8_MEMBER(spc1000_state::fdc_8255_b_w)
-{
- m_i8255_portb = data;
-}
-
-WRITE8_MEMBER(spc1000_state::fdc_8255_c_w)
-{
- m_i8255_1_pc = data;
-}
-
-//-------------------------------------------------
-// fdc interrupt
-//-------------------------------------------------
-
-READ8_MEMBER( spc1000_state::upd765_tc_r )
-{
- logerror("%s: upd765_tc_r\n", space.machine().describe_context());
-
- // toggle tc on read
- m_fdc->tc_w(true);
- m_timer_tc->adjust(attotime::zero);
-
- return 0xff;
-}
-
-WRITE8_MEMBER( spc1000_state::fdc_control_w )
-{
- logerror("%s: sd725_fdc_control_w(%02x)\n", space.machine().describe_context(), data);
-
- // bit 0, motor on signal
- if (m_fd0)
- m_fd0->mon_w(!BIT(data, 0));
- if (m_fd1)
- m_fd1->mon_w(!BIT(data, 0));
-}
-
READ8_MEMBER( spc1000_state::keyboard_r )
{
// most games just read kb in $8000-$8009 but a few of them
@@ -248,8 +152,7 @@ static ADDRESS_MAP_START( spc1000_io , AS_IO, 8, spc1000_state )
AM_RANGE(0x6000, 0x6000) AM_WRITE(cass_w)
AM_RANGE(0x8000, 0x9fff) AM_READ(keyboard_r)
AM_RANGE(0xa000, 0xa000) AM_READWRITE(iplk_r, iplk_w)
- AM_RANGE(0xc000, 0xc002) AM_READWRITE(sd725_r, sd725_w)
-// AM_RANGE(0xc000, 0xc003) AM_DEVREADWRITE("d8255_master", i8255_device, read, write)
+ AM_RANGE(0xc000, 0xdfff) AM_DEVREADWRITE("ext1", spc1000_exp_device, read, write)
ADDRESS_MAP_END
/* Input ports */
@@ -385,35 +288,24 @@ void spc1000_state::machine_start()
void spc1000_state::machine_reset()
{
-
m_work_ram = auto_alloc_array_clear(machine(), UINT8, 0x10000);
- m_fdccpu->set_input_line_vector(0, 0);
-
- m_fd0 = machine().device("upd765:0")->get_device();
- m_fd1 = machine().device("upd765:1")->get_device();
-
- m_timer_tc = timer_alloc(1, NULL);
- m_timer_tc->adjust(attotime::never);
-
- // enable rom
- m_fdccpu->space(AS_PROGRAM).install_rom(0x0000, 0xfff, 0, 0x2000, memregion("rom")->base());
-
m_IPLK = 1;
}
READ8_MEMBER(spc1000_state::mc6847_videoram_r)
{
- if (offset == ~0) return 0xff;
+ if (offset == ~0)
+ return 0xff;
// m_GMODE layout: CSS|NA|PS2|PS1|~A/G|GM0|GM1|NA
- if ( !BIT(m_GMODE, 3) )
+ if (!BIT(m_GMODE, 3))
{ // text mode (~A/G set to A)
- UINT8 data = m_p_videoram[offset+m_page+0x800];
+ UINT8 data = m_p_videoram[offset + m_page + 0x800];
m_vdg->inv_w(BIT(data, 0));
m_vdg->css_w(BIT(data, 1));
m_vdg->as_w (BIT(data, 2));
m_vdg->intext_w(BIT(data, 3));
- return m_p_videoram[offset+m_page];
+ return m_p_videoram[offset + m_page];
}
else
{ // graphics mode: uses full 6KB of VRAM
@@ -437,27 +329,14 @@ WRITE_LINE_MEMBER( spc1000_state::irq_w )
m_maincpu->set_input_line(0, state ? CLEAR_LINE : HOLD_LINE);
}
-static SLOT_INTERFACE_START( sd725_floppies )
- SLOT_INTERFACE( "sd320", EPSON_SD_320 )
-SLOT_INTERFACE_END
-
//-------------------------------------------------
// address maps
//-------------------------------------------------
-static ADDRESS_MAP_START( sd725_mem, AS_PROGRAM, 8, spc1000_state )
- ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x0000, 0x1fff) AM_ROM
- AM_RANGE(0x2000, 0xffff) AM_RAM
-ADDRESS_MAP_END
-
-static ADDRESS_MAP_START( sd725_io, AS_IO, 8, spc1000_state )
- ADDRESS_MAP_UNMAP_HIGH
- ADDRESS_MAP_GLOBAL_MASK(0xff)
- AM_RANGE(0xf8, 0xf8) AM_READWRITE(upd765_tc_r,fdc_control_w) // (R) Terminal Count Port (W) Motor Control Port
- AM_RANGE(0xfa, 0xfb) AM_DEVICE("upd765", upd765a_device, map )
- AM_RANGE(0xfc, 0xff) AM_DEVREADWRITE("d8255_master", i8255_device, read, write)
-ADDRESS_MAP_END
+extern SLOT_INTERFACE_START(spc1000_exp)
+ SLOT_INTERFACE("fdd", SPC1000_FDD_EXP)
+ SLOT_INTERFACE("vdp", SPC1000_VDP_EXP)
+SLOT_INTERFACE_END
static MACHINE_CONFIG_START( spc1000, spc1000_state )
/* basic machine hardware */
@@ -465,27 +344,6 @@ static MACHINE_CONFIG_START( spc1000, spc1000_state )
MCFG_CPU_PROGRAM_MAP(spc1000_mem)
MCFG_CPU_IO_MAP(spc1000_io)
- /* sub CPU(5 inch floppy drive) */
- MCFG_CPU_ADD("fdccpu", Z80, XTAL_4MHz) /* 4 MHz */
- MCFG_CPU_PROGRAM_MAP(sd725_mem)
- MCFG_CPU_IO_MAP(sd725_io)
-
- MCFG_DEVICE_ADD("d8255_master", I8255, 0)
- MCFG_I8255_IN_PORTA_CB(DEVREAD8("d8255_master", i8255_device, pb_r))
- MCFG_I8255_IN_PORTB_CB(DEVREAD8("d8255_master", i8255_device, pa_r))
- MCFG_I8255_OUT_PORTB_CB(WRITE8(spc1000_state, fdc_8255_b_w))
- MCFG_I8255_IN_PORTC_CB(READ8(spc1000_state, fdc_8255_c_r))
- MCFG_I8255_OUT_PORTC_CB(WRITE8(spc1000_state, fdc_8255_c_w))
-
- // floppy disk controller
- MCFG_UPD765A_ADD("upd765", true, true)
- MCFG_UPD765_INTRQ_CALLBACK(INPUTLINE("fdccpu", INPUT_LINE_IRQ0))
-
- // floppy drives
- MCFG_FLOPPY_DRIVE_ADD("upd765:0", sd725_floppies, "sd320", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_ADD("upd765:1", sd725_floppies, "sd320", floppy_image_device::default_floppy_formats)
- //CFG_SOFTWARE_LIST_ADD("disk_list","spc1000_flop")
-
/* video hardware */
MCFG_SCREEN_MC6847_NTSC_ADD("screen", "mc6847")
@@ -504,7 +362,10 @@ static MACHINE_CONFIG_START( spc1000, spc1000_state )
MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
- MCFG_CASSETTE_ADD( "cassette" )
+ MCFG_DEVICE_ADD("ext1", SPC1000_EXP_SLOT, 0)
+ MCFG_DEVICE_SLOT_INTERFACE(spc1000_exp, NULL, false)
+
+ MCFG_CASSETTE_ADD("cassette")
MCFG_CASSETTE_FORMATS(spc1000_cassette_formats)
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED)
@@ -517,17 +378,14 @@ MACHINE_CONFIG_END
/* ROM definition */
ROM_START( spc1000 )
- ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
- ROM_LOAD( "spcall.rom", 0x0000, 0x8000, CRC(19638fc9) SHA1(489f1baa7aebf3c8c660325fb1fd790d84203284))
-
- ROM_REGION( 0x10000, "fdccpu", 0)
- ROM_LOAD("sd725a.bin", 0x0000, 0x1000, CRC(96ac2eb8) SHA1(8e9d8f63a7fb87af417e95603e71cf537a6e83f1))
+ ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF)
+ ROM_LOAD("spcall.rom", 0x0000, 0x8000, CRC(19638fc9) SHA1(489f1baa7aebf3c8c660325fb1fd790d84203284))
ROM_END
#if 0
ROM_START( spc1000 )
- ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
- ROM_LOAD( "spcall.rom", 0x0000, 0x8000, CRC(2FBB6ECA) SHA1(cc9a076b0f00d54b2aec31f1f558b10f43ef61c8))
+ ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF)
+ ROM_LOAD("spcall.rom", 0x0000, 0x8000, CRC(2FBB6ECA) SHA1(cc9a076b0f00d54b2aec31f1f558b10f43ef61c8))
/// more roms to come...
ROM_END
#endif
diff --git a/src/mess/mess.mak b/src/mess/mess.mak
index 545af0fc515..a0d06ec1e98 100644
--- a/src/mess/mess.mak
+++ b/src/mess/mess.mak
@@ -625,6 +625,7 @@ BUSES += SEGA8
BUSES += SMS_CTRL
BUSES += SMS_EXP
BUSES += SNES
+BUSES += SPC1000
BUSES += TI99PEB
BUSES += TVC
BUSES += VBOY