(MESS) Apple II: Added support for Street Electronics Echo Plus and Zip Technologies ZipDrive cards [R. Belmont, Lord Nightmare]

This commit is contained in:
R. Belmont 2013-02-18 21:11:17 +00:00
parent b151e90f28
commit d9cdaf1649
8 changed files with 351 additions and 3 deletions

2
.gitattributes vendored
View File

@ -6752,6 +6752,8 @@ src/mess/machine/a2videoterm.c svneol=native#text/plain
src/mess/machine/a2videoterm.h svneol=native#text/plain src/mess/machine/a2videoterm.h svneol=native#text/plain
src/mess/machine/a2vulcan.c svneol=native#text/plain src/mess/machine/a2vulcan.c svneol=native#text/plain
src/mess/machine/a2vulcan.h svneol=native#text/plain src/mess/machine/a2vulcan.h svneol=native#text/plain
src/mess/machine/a2zipdrive.c svneol=native#text/plain
src/mess/machine/a2zipdrive.h svneol=native#text/plain
src/mess/machine/a7800.c svneol=native#text/plain src/mess/machine/a7800.c svneol=native#text/plain
src/mess/machine/abc1600_bus.c svneol=native#text/plain src/mess/machine/abc1600_bus.c svneol=native#text/plain
src/mess/machine/abc1600_bus.h svneol=native#text/plain src/mess/machine/abc1600_bus.h svneol=native#text/plain

View File

@ -212,6 +212,7 @@ Apple 3.5 and Apple 5.25 drives - up to three devices
#include "machine/a2echoii.h" #include "machine/a2echoii.h"
#include "machine/a2arcadebd.h" #include "machine/a2arcadebd.h"
#include "machine/a2midi.h" #include "machine/a2midi.h"
#include "machine/a2zipdrive.h"
#include "machine/a2estd80col.h" #include "machine/a2estd80col.h"
#include "machine/a2eext80col.h" #include "machine/a2eext80col.h"
#include "machine/a2eramworks3.h" #include "machine/a2eramworks3.h"
@ -634,6 +635,8 @@ static SLOT_INTERFACE_START(apple2_cards)
SLOT_INTERFACE("vtc2", A2BUS_VTC2) /* Unknown VideoTerm clone #2 */ SLOT_INTERFACE("vtc2", A2BUS_VTC2) /* Unknown VideoTerm clone #2 */
SLOT_INTERFACE("arcbd", A2BUS_ARCADEBOARD) /* Third Millenium Engineering Arcade Board */ SLOT_INTERFACE("arcbd", A2BUS_ARCADEBOARD) /* Third Millenium Engineering Arcade Board */
SLOT_INTERFACE("midi", A2BUS_MIDI) /* Generic 6840+6850 MIDI board */ SLOT_INTERFACE("midi", A2BUS_MIDI) /* Generic 6840+6850 MIDI board */
SLOT_INTERFACE("zipdrive", A2BUS_ZIPDRIVE) /* ZIP Technologies IDE card */
SLOT_INTERFACE("echoiiplus", A2BUS_ECHOPLUS) /* Street Electronics Echo Plus (Echo II + Mockingboard clone) */
// SLOT_INTERFACE("scsi", A2BUS_SCSI) /* Apple II SCSI Card */ // SLOT_INTERFACE("scsi", A2BUS_SCSI) /* Apple II SCSI Card */
SLOT_INTERFACE_END SLOT_INTERFACE_END

View File

@ -64,12 +64,16 @@
#include "machine/a2cffa.h" #include "machine/a2cffa.h"
#include "machine/a2memexp.h" #include "machine/a2memexp.h"
#include "machine/a2scsi.h" #include "machine/a2scsi.h"
#include "machine/a2thunderclock.h"
#include "machine/a2ssc.h"
#include "machine/a2softcard.h" #include "machine/a2softcard.h"
#include "machine/a2sam.h" #include "machine/a2sam.h"
#include "machine/a2alfam2.h" #include "machine/a2alfam2.h"
#include "machine/a2echoii.h"
#include "machine/a2arcadebd.h"
#include "machine/a2midi.h" #include "machine/a2midi.h"
#include "machine/a2vulcan.h" #include "machine/a2vulcan.h"
#include "machine/a2ssc.h" #include "machine/a2zipdrive.h"
static const gfx_layout apple2gs_text_layout = static const gfx_layout apple2gs_text_layout =
{ {
@ -293,11 +297,16 @@ static SLOT_INTERFACE_START(apple2_cards)
SLOT_INTERFACE("cffa202", A2BUS_CFFA2_6502) /* CFFA2000 Compact Flash for Apple II (www.dreher.net), 6502 firmware */ SLOT_INTERFACE("cffa202", A2BUS_CFFA2_6502) /* CFFA2000 Compact Flash for Apple II (www.dreher.net), 6502 firmware */
SLOT_INTERFACE("memexp", A2BUS_MEMEXP) /* Apple II Memory Expansion Card */ SLOT_INTERFACE("memexp", A2BUS_MEMEXP) /* Apple II Memory Expansion Card */
SLOT_INTERFACE("ramfactor", A2BUS_RAMFACTOR) /* Applied Engineering RamFactor */ SLOT_INTERFACE("ramfactor", A2BUS_RAMFACTOR) /* Applied Engineering RamFactor */
SLOT_INTERFACE("thclock", A2BUS_THUNDERCLOCK) /* ThunderWare ThunderClock Plus */
SLOT_INTERFACE("ssc", A2BUS_SSC) /* Apple Super Serial Card */
SLOT_INTERFACE("sam", A2BUS_SAM) /* SAM Software Automated Mouth (8-bit DAC + speaker) */ SLOT_INTERFACE("sam", A2BUS_SAM) /* SAM Software Automated Mouth (8-bit DAC + speaker) */
SLOT_INTERFACE("alfam2", A2BUS_ALFAM2) /* ALF Apple Music II */ SLOT_INTERFACE("alfam2", A2BUS_ALFAM2) /* ALF Apple Music II */
SLOT_INTERFACE("echoii", A2BUS_ECHOII) /* Street Electronics Echo II */
SLOT_INTERFACE("arcbd", A2BUS_ARCADEBOARD) /* Third Millenium Engineering Arcade Board */
SLOT_INTERFACE("midi", A2BUS_MIDI) /* Generic 6840+6850 MIDI board */ SLOT_INTERFACE("midi", A2BUS_MIDI) /* Generic 6840+6850 MIDI board */
SLOT_INTERFACE("vulcan", A2BUS_VULCAN) /* AE Vulcan IDE card */ SLOT_INTERFACE("vulcan", A2BUS_VULCAN) /* AE Vulcan IDE card */
SLOT_INTERFACE("ssc", A2BUS_SSC) /* Apple Super Serial Card */ SLOT_INTERFACE("zipdrive", A2BUS_ZIPDRIVE) /* ZIP Technologies IDE card */
SLOT_INTERFACE("echoiiplus", A2BUS_ECHOPLUS) /* Street Electronics Echo Plus (Echo II + Mockingboard clone) */
// SLOT_INTERFACE("softcard", A2BUS_SOFTCARD) /* Microsoft SoftCard */ // appears not to be IIgs compatible? // SLOT_INTERFACE("softcard", A2BUS_SOFTCARD) /* Microsoft SoftCard */ // appears not to be IIgs compatible?
// SLOT_INTERFACE("scsi", A2BUS_SCSI) /* Apple II SCSI Card */ // SLOT_INTERFACE("scsi", A2BUS_SCSI) /* Apple II SCSI Card */
SLOT_INTERFACE_END SLOT_INTERFACE_END

View File

@ -3,6 +3,7 @@
a2mockingboard.c a2mockingboard.c
Implementation of the Sweet Micro Systems Mockingboard card Implementation of the Sweet Micro Systems Mockingboard card
and friends.
*********************************************************************/ *********************************************************************/
@ -20,6 +21,7 @@
#define AY2_TAG "mockbd_ay2" #define AY2_TAG "mockbd_ay2"
#define AY3_TAG "mockbd_ay3" #define AY3_TAG "mockbd_ay3"
#define AY4_TAG "mockbd_ay4" #define AY4_TAG "mockbd_ay4"
#define E2P_TMS_TAG "tms5220"
//************************************************************************** //**************************************************************************
// GLOBAL VARIABLES // GLOBAL VARIABLES
@ -27,6 +29,7 @@
const device_type A2BUS_MOCKINGBOARD = &device_creator<a2bus_mockingboard_device>; const device_type A2BUS_MOCKINGBOARD = &device_creator<a2bus_mockingboard_device>;
const device_type A2BUS_PHASOR = &device_creator<a2bus_phasor_device>; const device_type A2BUS_PHASOR = &device_creator<a2bus_phasor_device>;
const device_type A2BUS_ECHOPLUS = &device_creator<a2bus_echoplus_device>;
static const ay8910_interface mockingboard_ay8910_interface = static const ay8910_interface mockingboard_ay8910_interface =
{ {
@ -90,6 +93,23 @@ MACHINE_CONFIG_FRAGMENT( phasor )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker2", 1.0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker2", 1.0)
MACHINE_CONFIG_END MACHINE_CONFIG_END
MACHINE_CONFIG_FRAGMENT( echoplus )
MCFG_VIA6522_ADD(VIA1_TAG, 1022727, mockingboard_via1_intf)
MCFG_VIA6522_ADD(VIA2_TAG, 1022727, mockingboard_via2_intf)
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MCFG_SOUND_ADD(AY1_TAG, AY8913, 1022727)
MCFG_SOUND_CONFIG(mockingboard_ay8910_interface)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.0)
MCFG_SOUND_ADD(AY2_TAG, AY8913, 1022727)
MCFG_SOUND_CONFIG(mockingboard_ay8910_interface)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.0)
MCFG_SPEAKER_STANDARD_MONO("echosp")
MCFG_SOUND_ADD(E2P_TMS_TAG, TMS5220, 720000)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "echosp", 1.0)
MACHINE_CONFIG_END
//------------------------------------------------- //-------------------------------------------------
// machine_config_additions - device-specific // machine_config_additions - device-specific
// machine configurations // machine configurations
@ -105,6 +125,11 @@ machine_config_constructor a2bus_phasor_device::device_mconfig_additions() const
return MACHINE_CONFIG_NAME( phasor ); return MACHINE_CONFIG_NAME( phasor );
} }
machine_config_constructor a2bus_echoplus_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( echoplus );
}
//************************************************************************** //**************************************************************************
// LIVE DEVICE // LIVE DEVICE
//************************************************************************** //**************************************************************************
@ -137,6 +162,15 @@ a2bus_phasor_device::a2bus_phasor_device(const machine_config &mconfig, const ch
m_PhasorNative = false; m_PhasorNative = false;
} }
a2bus_echoplus_device::a2bus_echoplus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
a2bus_ayboard_device(mconfig, A2BUS_ECHOPLUS, "Street Electronics Echo Plus", tag, owner, clock),
m_tms(*this, E2P_TMS_TAG)
{
m_shortname = "a2echop";
m_isPhasor = false;
m_PhasorNative = false;
}
//------------------------------------------------- //-------------------------------------------------
// device_start - device-specific startup // device_start - device-specific startup
//------------------------------------------------- //-------------------------------------------------
@ -156,7 +190,7 @@ void a2bus_ayboard_device::device_reset()
} }
/*------------------------------------------------- /*-------------------------------------------------
read_cnxx - called for reads from this card's c0nx space read_cnxx - called for reads from this card's cnxx space
-------------------------------------------------*/ -------------------------------------------------*/
UINT8 a2bus_ayboard_device::read_cnxx(address_space &space, UINT8 offset) UINT8 a2bus_ayboard_device::read_cnxx(address_space &space, UINT8 offset)
@ -508,3 +542,25 @@ void a2bus_ayboard_device::write_c0nx(address_space &space, UINT8 offset, UINT8
m_PhasorNative = (offset & 1) ? true : false; m_PhasorNative = (offset & 1) ? true : false;
} }
} }
UINT8 a2bus_echoplus_device::read_c0nx(address_space &space, UINT8 offset)
{
switch (offset)
{
case 0:
return 0x1f | tms5220_status_r(m_tms, space, 0);
}
return 0;
}
void a2bus_echoplus_device::write_c0nx(address_space &space, UINT8 offset, UINT8 data)
{
switch (offset)
{
case 0:
tms5220_data_w(m_tms, space, offset, data);
break;
}
}

View File

@ -13,6 +13,7 @@
#include "machine/a2bus.h" #include "machine/a2bus.h"
#include "machine/6522via.h" #include "machine/6522via.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "sound/tms5220.h"
//************************************************************************** //**************************************************************************
// TYPE DEFINITIONS // TYPE DEFINITIONS
@ -77,8 +78,22 @@ public:
virtual machine_config_constructor device_mconfig_additions() const; virtual machine_config_constructor device_mconfig_additions() const;
}; };
class a2bus_echoplus_device : public a2bus_ayboard_device
{
public:
a2bus_echoplus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual UINT8 read_c0nx(address_space &space, UINT8 offset);
virtual void write_c0nx(address_space &space, UINT8 offset, UINT8 data);
required_device<tms5220_device> m_tms;
virtual machine_config_constructor device_mconfig_additions() const;
};
// device type definition // device type definition
extern const device_type A2BUS_MOCKINGBOARD; extern const device_type A2BUS_MOCKINGBOARD;
extern const device_type A2BUS_PHASOR; extern const device_type A2BUS_PHASOR;
extern const device_type A2BUS_ECHOPLUS;
#endif /* __A2BUS_MOCKINGBOARD__ */ #endif /* __A2BUS_MOCKINGBOARD__ */

View File

@ -0,0 +1,199 @@
/*********************************************************************
a2zipdrive.c
ZIP Technologies ZipDrive IDE card
NOTE: No known dump exists of the formatter utility and the
format of the custom partition record (block 0) that the card
expects has not yet been determined, so this is largely untested
and will work only with a drive dump from real h/w.
PLEASE use it only on a backup copy of said dump and contact MESSdev
if you have one!
Partition block format:
+0000: ASCII "Zip Technologies"
*********************************************************************/
#include "a2zipdrive.h"
#include "includes/apple2.h"
#include "machine/idectrl.h"
#include "imagedev/harddriv.h"
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
const device_type A2BUS_ZIPDRIVE = &device_creator<a2bus_zipdrive_device>;
#define ZIPDRIVE_ROM_REGION "zipdrive_rom"
#define ZIPDRIVE_IDE_TAG "zipdrive_ide"
static MACHINE_CONFIG_FRAGMENT( zipdrive )
MCFG_IDE_CONTROLLER_ADD(ZIPDRIVE_IDE_TAG, ide_image_devices, "hdd", "hdd", false)
MACHINE_CONFIG_END
ROM_START( zipdrive )
ROM_REGION(0x2000, ZIPDRIVE_ROM_REGION, 0)
ROM_LOAD( "zip drive - rom.bin", 0x000000, 0x002000, CRC(fd800a40) SHA1(46636bfed88c864139e3d2826661908a8c07c459) )
ROM_END
/***************************************************************************
FUNCTION PROTOTYPES
***************************************************************************/
//-------------------------------------------------
// machine_config_additions - device-specific
// machine configurations
//-------------------------------------------------
machine_config_constructor a2bus_zipdrivebase_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( zipdrive );
}
//-------------------------------------------------
// rom_region - device-specific ROM region
//-------------------------------------------------
const rom_entry *a2bus_zipdrivebase_device::device_rom_region() const
{
return ROM_NAME( zipdrive );
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
a2bus_zipdrivebase_device::a2bus_zipdrivebase_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, type, name, tag, owner, clock),
device_a2bus_card_interface(mconfig, *this),
m_ide(*this, ZIPDRIVE_IDE_TAG)
{
}
a2bus_zipdrive_device::a2bus_zipdrive_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
a2bus_zipdrivebase_device(mconfig, A2BUS_ZIPDRIVE, "Zip Technologies ZipDrive", tag, owner, clock)
{
m_shortname = "a2zipdrv";
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void a2bus_zipdrivebase_device::device_start()
{
// set_a2bus_device makes m_slot valid
set_a2bus_device();
astring tempstring;
m_rom = device().machine().root_device().memregion(this->subtag(tempstring, ZIPDRIVE_ROM_REGION))->base();
save_item(NAME(m_lastdata));
}
void a2bus_zipdrivebase_device::device_reset()
{
popmessage("Zip Drive partition format unknown, contact MESSdev if you have the software or a drive dump!");
}
/*-------------------------------------------------
read_c0nx - called for reads from this card's c0nx space
-------------------------------------------------*/
UINT8 a2bus_zipdrivebase_device::read_c0nx(address_space &space, UINT8 offset)
{
switch (offset)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
return ide_controller_r(m_ide, 0x1f0+offset, 1);
case 8: // data port
m_lastdata = ide_controller_r(m_ide, 0x1f0, 2);
// printf("%04x @ IDE data\n", m_lastdata);
return m_lastdata&0xff;
case 9:
return (m_lastdata>>8) & 0xff;
default:
logerror("a2zipdrive: unhandled read @ C0n%x\n", offset);
break;
}
return 0xff;
}
/*-------------------------------------------------
write_c0nx - called for writes to this card's c0nx space
-------------------------------------------------*/
void a2bus_zipdrivebase_device::write_c0nx(address_space &space, UINT8 offset, UINT8 data)
{
switch (offset)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
// printf("%02x to IDE controller @ %x\n", data, offset);
ide_controller_w(m_ide, 0x1f0+offset, 1, data);
break;
case 8:
// printf("%02x to IDE data lo\n", data);
m_lastdata = data;
break;
case 9:
// printf("%02x to IDE data hi\n", data);
m_lastdata &= 0x00ff;
m_lastdata |= (data << 8);
ide_controller_w(m_ide, 0x1f0, 2, m_lastdata);
break;
default:
logerror("a2zipdrive: write %02x @ unhandled C0n%x\n", data, offset);
break;
}
}
/*-------------------------------------------------
read_cnxx - called for reads from this card's cnxx space
-------------------------------------------------*/
UINT8 a2bus_zipdrivebase_device::read_cnxx(address_space &space, UINT8 offset)
{
int slotimg = m_slot * 0x100;
// ROM contains CnXX images for each of slots 1-7 at 0x0 and 0x1000
return m_rom[offset+slotimg+0x1000];
}
/*-------------------------------------------------
read_c800 - called for reads from this card's c800 space
-------------------------------------------------*/
UINT8 a2bus_zipdrivebase_device::read_c800(address_space &space, UINT16 offset)
{
offset &= 0x7ff;
return m_rom[offset+0x1800];
}

View File

@ -0,0 +1,63 @@
/*********************************************************************
a2zipdrive.h
ZIP Technologies ZipDrive IDE card
See important NOTE at the top of a2zipdrive.c!
*********************************************************************/
#ifndef __A2BUS_ZIPDRIVE__
#define __A2BUS_ZIPDRIVE__
#include "emu.h"
#include "machine/a2bus.h"
#include "machine/idectrl.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class a2bus_zipdrivebase_device:
public device_t,
public device_a2bus_card_interface
{
public:
// construction/destruction
a2bus_zipdrivebase_device(const machine_config &mconfig, device_type type, const char *name, 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;
protected:
virtual void device_start();
virtual void device_reset();
// overrides of standard a2bus slot functions
virtual UINT8 read_c0nx(address_space &space, UINT8 offset);
virtual void write_c0nx(address_space &space, UINT8 offset, UINT8 data);
virtual UINT8 read_cnxx(address_space &space, UINT8 offset);
virtual UINT8 read_c800(address_space &space, UINT16 offset);
required_device<ide_controller_device> m_ide;
UINT8 *m_rom;
private:
UINT16 m_lastdata;
};
class a2bus_zipdrive_device : public a2bus_zipdrivebase_device
{
public:
a2bus_zipdrive_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
protected:
};
// device type definition
extern const device_type A2BUS_ZIPDRIVE;
#endif /* __A2BUS_ZIPDRIVE__ */

View File

@ -689,6 +689,7 @@ $(MESSOBJ)/apple.a: \
$(MESS_MACHINE)/a2arcadebd.o \ $(MESS_MACHINE)/a2arcadebd.o \
$(MESS_MACHINE)/a2midi.o \ $(MESS_MACHINE)/a2midi.o \
$(MESS_MACHINE)/a2vulcan.o \ $(MESS_MACHINE)/a2vulcan.o \
$(MESS_MACHINE)/a2zipdrive.o \
$(MESS_MACHINE)/a2estd80col.o \ $(MESS_MACHINE)/a2estd80col.o \
$(MESS_MACHINE)/a2eext80col.o \ $(MESS_MACHINE)/a2eext80col.o \
$(MESS_MACHINE)/a2eramworks3.o \ $(MESS_MACHINE)/a2eramworks3.o \