mirror of
https://github.com/holub/mame
synced 2025-06-05 20:33:45 +03:00
apricot: add an expansion slot interface and add two ram expansion
cards. this will also be usuable by the apricot f series and portable.
This commit is contained in:
parent
af38621a8b
commit
9b4905c6b6
@ -162,6 +162,23 @@ if (BUSES["APF"]~=null) then
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
---------------------------------------------------
|
||||||
|
--
|
||||||
|
--@src/emu/bus/apricot/expansion.h,BUSES += APRICOT_EXPANSION
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
if (BUSES["APRICOT_EXPANSION"]~=null) then
|
||||||
|
files {
|
||||||
|
MAME_DIR .. "src/emu/bus/apricot/expansion.c",
|
||||||
|
MAME_DIR .. "src/emu/bus/apricot/expansion.h",
|
||||||
|
MAME_DIR .. "src/emu/bus/apricot/cards.c",
|
||||||
|
MAME_DIR .. "src/emu/bus/apricot/cards.h",
|
||||||
|
MAME_DIR .. "src/emu/bus/apricot/ram.c",
|
||||||
|
MAME_DIR .. "src/emu/bus/apricot/ram.h",
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
---------------------------------------------------
|
---------------------------------------------------
|
||||||
--
|
--
|
||||||
--@src/emu/bus/arcadia/slot.h,BUSES += ARCADIA
|
--@src/emu/bus/arcadia/slot.h,BUSES += ARCADIA
|
||||||
|
@ -572,6 +572,7 @@ BUSES["ABCKB"] = true
|
|||||||
BUSES["ADAM"] = true
|
BUSES["ADAM"] = true
|
||||||
BUSES["ADAMNET"] = true
|
BUSES["ADAMNET"] = true
|
||||||
BUSES["APF"] = true
|
BUSES["APF"] = true
|
||||||
|
BUSES["APRICOT_EXPANSION"] = true
|
||||||
BUSES["ARCADIA"] = true
|
BUSES["ARCADIA"] = true
|
||||||
BUSES["ASTROCADE"] = true
|
BUSES["ASTROCADE"] = true
|
||||||
BUSES["BML3"] = true
|
BUSES["BML3"] = true
|
||||||
|
14
src/emu/bus/apricot/cards.c
Normal file
14
src/emu/bus/apricot/cards.c
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
// license:GPL-2.0+
|
||||||
|
// copyright-holders:Dirk Best
|
||||||
|
/***************************************************************************
|
||||||
|
|
||||||
|
ACT Apricot Expansion Slot Devices
|
||||||
|
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "cards.h"
|
||||||
|
|
||||||
|
SLOT_INTERFACE_START( apricot_expansion_cards )
|
||||||
|
SLOT_INTERFACE("256k", APRICOT_256K_RAM)
|
||||||
|
SLOT_INTERFACE("128_512k", APRICOT_128_512K_RAM)
|
||||||
|
SLOT_INTERFACE_END
|
19
src/emu/bus/apricot/cards.h
Normal file
19
src/emu/bus/apricot/cards.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
// license:GPL-2.0+
|
||||||
|
// copyright-holders:Dirk Best
|
||||||
|
/***************************************************************************
|
||||||
|
|
||||||
|
ACT Apricot Expansion Slot Devices
|
||||||
|
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef __APRICOT_CARDS_H__
|
||||||
|
#define __APRICOT_CARDS_H__
|
||||||
|
|
||||||
|
#include "emu.h"
|
||||||
|
#include "ram.h"
|
||||||
|
|
||||||
|
SLOT_INTERFACE_EXTERN( apricot_expansion_cards );
|
||||||
|
|
||||||
|
#endif // __APRICOT_CARDS_H__
|
166
src/emu/bus/apricot/expansion.c
Normal file
166
src/emu/bus/apricot/expansion.c
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
// license:GPL-2.0+
|
||||||
|
// copyright-holders:Dirk Best
|
||||||
|
/***************************************************************************
|
||||||
|
|
||||||
|
ACT Apricot Expansion Slot
|
||||||
|
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "expansion.h"
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// EXPANSION SLOT DEVICE
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
const device_type APRICOT_EXPANSION_SLOT = &device_creator<apricot_expansion_slot_device>;
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// apricot_expansion_slot_device - constructor
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
apricot_expansion_slot_device::apricot_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
||||||
|
device_t(mconfig, APRICOT_EXPANSION_SLOT, "Apricot Expansion Slot", tag, owner, clock, "apricot_exp_slot", __FILE__),
|
||||||
|
device_slot_interface(mconfig, *this)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
apricot_expansion_slot_device::apricot_expansion_slot_device(const machine_config &mconfig, device_type type, const char *name,
|
||||||
|
const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
|
||||||
|
device_t(mconfig, type, name, tag, owner, clock, shortname, source),
|
||||||
|
device_slot_interface(mconfig, *this)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// device_start - device-specific startup
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void apricot_expansion_slot_device::device_start()
|
||||||
|
{
|
||||||
|
device_apricot_expansion_card_interface *dev = dynamic_cast<device_apricot_expansion_card_interface *>(get_card_device());
|
||||||
|
|
||||||
|
if (dev)
|
||||||
|
{
|
||||||
|
apricot_expansion_bus_device *bus = downcast<apricot_expansion_bus_device *>(m_owner);
|
||||||
|
bus->add_card(dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// EXPANSION BUS DEVICE
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
const device_type APRICOT_EXPANSION_BUS = &device_creator<apricot_expansion_bus_device>;
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// apricot_expansion_bus_device - constructor
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
apricot_expansion_bus_device::apricot_expansion_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
||||||
|
device_t(mconfig, APRICOT_EXPANSION_BUS, "Apricot Expansion Bus", tag, owner, clock, "apricot_exp_bus", __FILE__),
|
||||||
|
m_program(NULL),
|
||||||
|
m_io(NULL),
|
||||||
|
m_dma1_handler(*this),
|
||||||
|
m_dma2_handler(*this),
|
||||||
|
m_ext1_handler(*this),
|
||||||
|
m_ext2_handler(*this),
|
||||||
|
m_int2_handler(*this),
|
||||||
|
m_int3_handler(*this)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// apricot_expansion_bus_device - destructor
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
apricot_expansion_bus_device::~apricot_expansion_bus_device()
|
||||||
|
{
|
||||||
|
m_dev.detach_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// device_start - device-specific startup
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void apricot_expansion_bus_device::device_start()
|
||||||
|
{
|
||||||
|
// resolve callbacks
|
||||||
|
m_dma1_handler.resolve_safe();
|
||||||
|
m_dma2_handler.resolve_safe();
|
||||||
|
m_ext1_handler.resolve_safe();
|
||||||
|
m_ext2_handler.resolve_safe();
|
||||||
|
m_int2_handler.resolve_safe();
|
||||||
|
m_int3_handler.resolve_safe();
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// device_reset - device-specific reset
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void apricot_expansion_bus_device::device_reset()
|
||||||
|
{
|
||||||
|
cpu_device *cpu = m_owner->subdevice<cpu_device>(m_cpu_tag);
|
||||||
|
if (!cpu->started())
|
||||||
|
printf("cpu not running yet\n");
|
||||||
|
m_program = &cpu->space(AS_PROGRAM);
|
||||||
|
m_io = &cpu->space(AS_IO);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// add_card - add new card to our bus
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void apricot_expansion_bus_device::add_card(device_apricot_expansion_card_interface *card)
|
||||||
|
{
|
||||||
|
card->set_bus_device(this);
|
||||||
|
m_dev.append(*card);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// set_cpu_tag - set cpu we are attached to
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void apricot_expansion_bus_device::set_cpu_tag(device_t &device, device_t *owner, const char *cpu_tag)
|
||||||
|
{
|
||||||
|
apricot_expansion_bus_device &bus = dynamic_cast<apricot_expansion_bus_device &>(device);
|
||||||
|
bus.m_cpu_tag = cpu_tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
// callbacks from slot device to the host
|
||||||
|
WRITE_LINE_MEMBER( apricot_expansion_bus_device::dma1_w ) { m_dma1_handler(state); }
|
||||||
|
WRITE_LINE_MEMBER( apricot_expansion_bus_device::dma2_w ) { m_dma2_handler(state); }
|
||||||
|
WRITE_LINE_MEMBER( apricot_expansion_bus_device::ext1_w ) { m_ext1_handler(state); }
|
||||||
|
WRITE_LINE_MEMBER( apricot_expansion_bus_device::ext2_w ) { m_ext2_handler(state); }
|
||||||
|
WRITE_LINE_MEMBER( apricot_expansion_bus_device::int2_w ) { m_int2_handler(state); }
|
||||||
|
WRITE_LINE_MEMBER( apricot_expansion_bus_device::int3_w ) { m_int3_handler(state); }
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// CARTRIDGE INTERFACE
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// device_apricot_expansion_card_interface - constructor
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
device_apricot_expansion_card_interface::device_apricot_expansion_card_interface(const machine_config &mconfig, device_t &device) :
|
||||||
|
device_slot_card_interface(mconfig, device),
|
||||||
|
m_next(NULL),
|
||||||
|
m_bus(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// ~device_apricot_expansion_card_interface - destructor
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
device_apricot_expansion_card_interface::~device_apricot_expansion_card_interface()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void device_apricot_expansion_card_interface::set_bus_device(apricot_expansion_bus_device *bus)
|
||||||
|
{
|
||||||
|
m_bus = bus;
|
||||||
|
}
|
198
src/emu/bus/apricot/expansion.h
Normal file
198
src/emu/bus/apricot/expansion.h
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
// license:GPL-2.0+
|
||||||
|
// copyright-holders:Dirk Best
|
||||||
|
/***************************************************************************
|
||||||
|
|
||||||
|
ACT Apricot Expansion Slot
|
||||||
|
|
||||||
|
A B
|
||||||
|
|
||||||
|
-12V 32 +12V
|
||||||
|
+5V 31 +5V
|
||||||
|
DB0 30 DB1
|
||||||
|
DB2 29 DB3
|
||||||
|
DB4 28 DB5
|
||||||
|
DB6 27 DB7
|
||||||
|
AB10 26 AB9
|
||||||
|
AB11 25 AB12
|
||||||
|
/AMWC 24 /MRDC
|
||||||
|
/DMA2 23 DT/R
|
||||||
|
/DMA1 22 /IORC
|
||||||
|
/MWTC 21 /RES
|
||||||
|
/IOWC 20 /AIOWC
|
||||||
|
GND 19 GND
|
||||||
|
/CLK5 18 DEN
|
||||||
|
/IRDY 17 /MRDY
|
||||||
|
/EXT1 16 /EXT2
|
||||||
|
/INT3 15 /ALE
|
||||||
|
AB6 14 /INT2
|
||||||
|
AB8 13 AB7
|
||||||
|
DB9 12 DB8
|
||||||
|
DB11 11 DB10
|
||||||
|
DB13 10 DB12
|
||||||
|
DB15 9 DB14
|
||||||
|
AB2 8 AB1
|
||||||
|
AB4 7 AB3
|
||||||
|
AB0 6 AB5
|
||||||
|
AB14 5 AB13
|
||||||
|
AB15 4 AB16
|
||||||
|
AB17 3 AB18
|
||||||
|
AB19 2 /BHE
|
||||||
|
NMI 1 CLK15
|
||||||
|
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef __APRICOT_EXPANSION_H__
|
||||||
|
#define __APRICOT_EXPANSION_H__
|
||||||
|
|
||||||
|
#include "emu.h"
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// INTERFACE CONFIGURATION MACROS
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
#define MCFG_EXPANSION_ADD(_tag, _cpu_tag) \
|
||||||
|
MCFG_DEVICE_ADD(_tag, APRICOT_EXPANSION_BUS, 0) \
|
||||||
|
apricot_expansion_bus_device::set_cpu_tag(*device, owner, _cpu_tag);
|
||||||
|
|
||||||
|
#define MCFG_EXPANSION_SLOT_ADD(_tag, _slot_intf, _def_slot) \
|
||||||
|
MCFG_DEVICE_ADD(_tag, APRICOT_EXPANSION_SLOT, 0) \
|
||||||
|
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
|
||||||
|
|
||||||
|
#define MCFG_EXPANSION_DMA1_HANDLER(_devcb) \
|
||||||
|
devcb = &apricot_expansion_bus_device::set_dma1_handler(*device, DEVCB_##_devcb);
|
||||||
|
|
||||||
|
#define MCFG_EXPANSION_DMA2_HANDLER(_devcb) \
|
||||||
|
devcb = &apricot_expansion_bus_device::set_dma2_handler(*device, DEVCB_##_devcb);
|
||||||
|
|
||||||
|
#define MCFG_EXPANSION_EXT1_HANDLER(_devcb) \
|
||||||
|
devcb = &apricot_expansion_bus_device::set_ext1_handler(*device, DEVCB_##_devcb);
|
||||||
|
|
||||||
|
#define MCFG_EXPANSION_EXT2_HANDLER(_devcb) \
|
||||||
|
devcb = &apricot_expansion_bus_device::set_ext2_handler(*device, DEVCB_##_devcb);
|
||||||
|
|
||||||
|
#define MCFG_EXPANSION_INT2_HANDLER(_devcb) \
|
||||||
|
devcb = &apricot_expansion_bus_device::set_int2_handler(*device, DEVCB_##_devcb);
|
||||||
|
|
||||||
|
#define MCFG_EXPANSION_INT3_HANDLER(_devcb) \
|
||||||
|
devcb = &apricot_expansion_bus_device::set_int3_handler(*device, DEVCB_##_devcb);
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// TYPE DEFINITIONS
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
// forward declaration
|
||||||
|
class device_apricot_expansion_card_interface;
|
||||||
|
|
||||||
|
|
||||||
|
// ======================> apricot_expansion_slot_device
|
||||||
|
|
||||||
|
class apricot_expansion_slot_device : public device_t, public device_slot_interface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// construction/destruction
|
||||||
|
apricot_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
apricot_expansion_slot_device(const machine_config &mconfig, device_type type, const char *name,
|
||||||
|
const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
||||||
|
|
||||||
|
// device-level overrides
|
||||||
|
virtual void device_start();
|
||||||
|
};
|
||||||
|
|
||||||
|
// device type definition
|
||||||
|
extern const device_type APRICOT_EXPANSION_SLOT;
|
||||||
|
|
||||||
|
|
||||||
|
// ======================> apricot_expansion_bus_device
|
||||||
|
|
||||||
|
class apricot_expansion_bus_device : public device_t
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// construction/destruction
|
||||||
|
apricot_expansion_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
virtual ~apricot_expansion_bus_device();
|
||||||
|
|
||||||
|
template<class _Object> static devcb_base &set_dma1_handler(device_t &device, _Object object)
|
||||||
|
{ return downcast<apricot_expansion_bus_device &>(device).m_dma1_handler.set_callback(object); }
|
||||||
|
|
||||||
|
template<class _Object> static devcb_base &set_dma2_handler(device_t &device, _Object object)
|
||||||
|
{ return downcast<apricot_expansion_bus_device &>(device).m_dma2_handler.set_callback(object); }
|
||||||
|
|
||||||
|
template<class _Object> static devcb_base &set_ext1_handler(device_t &device, _Object object)
|
||||||
|
{ return downcast<apricot_expansion_bus_device &>(device).m_ext1_handler.set_callback(object); }
|
||||||
|
|
||||||
|
template<class _Object> static devcb_base &set_ext2_handler(device_t &device, _Object object)
|
||||||
|
{ return downcast<apricot_expansion_bus_device &>(device).m_ext2_handler.set_callback(object); }
|
||||||
|
|
||||||
|
template<class _Object> static devcb_base &set_int2_handler(device_t &device, _Object object)
|
||||||
|
{ return downcast<apricot_expansion_bus_device &>(device).m_int2_handler.set_callback(object); }
|
||||||
|
|
||||||
|
template<class _Object> static devcb_base &set_int3_handler(device_t &device, _Object object)
|
||||||
|
{ return downcast<apricot_expansion_bus_device &>(device).m_int3_handler.set_callback(object); }
|
||||||
|
|
||||||
|
// inline configuration
|
||||||
|
static void set_cpu_tag(device_t &device, device_t *owner, const char *cpu_tag);
|
||||||
|
|
||||||
|
void add_card(device_apricot_expansion_card_interface *card);
|
||||||
|
|
||||||
|
address_space *m_program;
|
||||||
|
address_space *m_io;
|
||||||
|
|
||||||
|
// from cards
|
||||||
|
DECLARE_WRITE_LINE_MEMBER( dma1_w );
|
||||||
|
DECLARE_WRITE_LINE_MEMBER( dma2_w );
|
||||||
|
DECLARE_WRITE_LINE_MEMBER( ext1_w );
|
||||||
|
DECLARE_WRITE_LINE_MEMBER( ext2_w );
|
||||||
|
DECLARE_WRITE_LINE_MEMBER( int2_w );
|
||||||
|
DECLARE_WRITE_LINE_MEMBER( int3_w );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// device-level overrides
|
||||||
|
virtual void device_start();
|
||||||
|
virtual void device_reset();
|
||||||
|
|
||||||
|
private:
|
||||||
|
simple_list<device_apricot_expansion_card_interface> m_dev;
|
||||||
|
|
||||||
|
devcb_write_line m_dma1_handler;
|
||||||
|
devcb_write_line m_dma2_handler;
|
||||||
|
devcb_write_line m_ext1_handler;
|
||||||
|
devcb_write_line m_ext2_handler;
|
||||||
|
devcb_write_line m_int2_handler;
|
||||||
|
devcb_write_line m_int3_handler;
|
||||||
|
|
||||||
|
// configuration
|
||||||
|
const char *m_cpu_tag;
|
||||||
|
};
|
||||||
|
|
||||||
|
// device type definition
|
||||||
|
extern const device_type APRICOT_EXPANSION_BUS;
|
||||||
|
|
||||||
|
|
||||||
|
// ======================> device_apricot_expansion_card_interface
|
||||||
|
|
||||||
|
class device_apricot_expansion_card_interface : public device_slot_card_interface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// construction/destruction
|
||||||
|
device_apricot_expansion_card_interface(const machine_config &mconfig, device_t &device);
|
||||||
|
virtual ~device_apricot_expansion_card_interface();
|
||||||
|
|
||||||
|
void set_bus_device(apricot_expansion_bus_device *bus);
|
||||||
|
|
||||||
|
device_apricot_expansion_card_interface *next() const { return m_next; }
|
||||||
|
device_apricot_expansion_card_interface *m_next;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
apricot_expansion_bus_device *m_bus;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// include here so drivers don't need to
|
||||||
|
#include "cards.h"
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __APRICOT_EXPANSION_H__
|
141
src/emu/bus/apricot/ram.c
Normal file
141
src/emu/bus/apricot/ram.c
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
// license:GPL-2.0+
|
||||||
|
// copyright-holders:Dirk Best
|
||||||
|
/***************************************************************************
|
||||||
|
|
||||||
|
ACT Apricot RAM Expansions
|
||||||
|
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "ram.h"
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// DEVICE DEFINITIONS
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
const device_type APRICOT_256K_RAM = &device_creator<apricot_256k_ram_device>;
|
||||||
|
const device_type APRICOT_128_512K_RAM = &device_creator<apricot_128_512k_ram_device>;
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// APRICOT 256K RAM DEVICE
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// input_ports - device-specific input ports
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
static INPUT_PORTS_START( apricot_256k )
|
||||||
|
PORT_START("sw")
|
||||||
|
PORT_DIPNAME(0x01, 0x00, "Base Address")
|
||||||
|
PORT_DIPSETTING(0x00, "40000H")
|
||||||
|
PORT_DIPSETTING(0x01, "80000H")
|
||||||
|
INPUT_PORTS_END
|
||||||
|
|
||||||
|
ioport_constructor apricot_256k_ram_device::device_input_ports() const
|
||||||
|
{
|
||||||
|
return INPUT_PORTS_NAME( apricot_256k );
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// apricot_256k_ram_device - constructor
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
apricot_256k_ram_device::apricot_256k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
||||||
|
device_t(mconfig, APRICOT_256K_RAM, "Apricot 256K RAM Expansion Board", tag, owner, clock, "apricot_256k_ram", __FILE__),
|
||||||
|
device_apricot_expansion_card_interface(mconfig, *this),
|
||||||
|
m_sw(*this, "sw")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// device_start - device-specific startup
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void apricot_256k_ram_device::device_start()
|
||||||
|
{
|
||||||
|
m_ram.resize(0x40000 / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// device_reset - device-specific reset
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void apricot_256k_ram_device::device_reset()
|
||||||
|
{
|
||||||
|
if (m_sw->read() == 0)
|
||||||
|
m_bus->m_program->install_ram(0x40000, 0x7ffff, &m_ram[0]);
|
||||||
|
else
|
||||||
|
m_bus->m_program->install_ram(0x80000, 0xbffff, &m_ram[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// APRICOT 128/512K RAM DEVICE
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// input_ports - device-specific input ports
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
static INPUT_PORTS_START( apricot_128_512k )
|
||||||
|
PORT_START("config")
|
||||||
|
PORT_CONFNAME(0x01, 0x01, "DRAM Size")
|
||||||
|
PORT_CONFSETTING(0x00, "64K")
|
||||||
|
PORT_CONFSETTING(0x01, "256K")
|
||||||
|
PORT_START("strap")
|
||||||
|
PORT_DIPNAME(0x03, 0x00, "Base Address")
|
||||||
|
PORT_DIPSETTING(0x00, "512K")
|
||||||
|
PORT_DIPSETTING(0x01, "256K - 384K")
|
||||||
|
PORT_DIPSETTING(0x02, "384K - 512K")
|
||||||
|
INPUT_PORTS_END
|
||||||
|
|
||||||
|
ioport_constructor apricot_128_512k_ram_device::device_input_ports() const
|
||||||
|
{
|
||||||
|
return INPUT_PORTS_NAME( apricot_128_512k );
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// apricot_128_512k_ram_device - constructor
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
apricot_128_512k_ram_device::apricot_128_512k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
||||||
|
device_t(mconfig, APRICOT_128_512K_RAM, "Apricot 128/512K RAM Expansion Board", tag, owner, clock, "apricot_128_512k_ram", __FILE__),
|
||||||
|
device_apricot_expansion_card_interface(mconfig, *this),
|
||||||
|
m_config(*this, "config"),
|
||||||
|
m_strap(*this, "strap")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// device_start - device-specific startup
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void apricot_128_512k_ram_device::device_start()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// device_reset - device-specific reset
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void apricot_128_512k_ram_device::device_reset()
|
||||||
|
{
|
||||||
|
// 128 or 512k?
|
||||||
|
if (m_config->read() == 1)
|
||||||
|
{
|
||||||
|
m_ram.resize(0x80000 / 2);
|
||||||
|
|
||||||
|
if (m_strap->read() == 0)
|
||||||
|
m_bus->m_program->install_ram(0x40000, 0xbffff, &m_ram[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_ram.resize(0x20000 / 2);
|
||||||
|
|
||||||
|
if (m_strap->read() == 1)
|
||||||
|
m_bus->m_program->install_ram(0x40000, 0x5ffff, &m_ram[0]);
|
||||||
|
else if (m_strap->read() == 2)
|
||||||
|
m_bus->m_program->install_ram(0x60000, 0x7ffff, &m_ram[0]);
|
||||||
|
}
|
||||||
|
}
|
69
src/emu/bus/apricot/ram.h
Normal file
69
src/emu/bus/apricot/ram.h
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
// license:GPL-2.0+
|
||||||
|
// copyright-holders:Dirk Best
|
||||||
|
/***************************************************************************
|
||||||
|
|
||||||
|
ACT Apricot RAM Expansions
|
||||||
|
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef __APRICOT_RAM__
|
||||||
|
#define __APRICOT_RAM__
|
||||||
|
|
||||||
|
#include "emu.h"
|
||||||
|
#include "expansion.h"
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// TYPE DEFINITIONS
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
// ======================> apricot_256k_ram_device
|
||||||
|
|
||||||
|
class apricot_256k_ram_device : public device_t, public device_apricot_expansion_card_interface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// construction/destruction
|
||||||
|
apricot_256k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual ioport_constructor device_input_ports() const;
|
||||||
|
virtual void device_start();
|
||||||
|
virtual void device_reset();
|
||||||
|
|
||||||
|
private:
|
||||||
|
required_ioport m_sw;
|
||||||
|
|
||||||
|
std::vector<UINT16> m_ram;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// ======================> apricot_128_512k_ram_device
|
||||||
|
|
||||||
|
class apricot_128_512k_ram_device : public device_t, public device_apricot_expansion_card_interface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// construction/destruction
|
||||||
|
apricot_128_512k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual ioport_constructor device_input_ports() const;
|
||||||
|
virtual void device_start();
|
||||||
|
virtual void device_reset();
|
||||||
|
|
||||||
|
private:
|
||||||
|
required_ioport m_config;
|
||||||
|
required_ioport m_strap;
|
||||||
|
|
||||||
|
std::vector<UINT16> m_ram;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// device type definition
|
||||||
|
extern const device_type APRICOT_256K_RAM;
|
||||||
|
extern const device_type APRICOT_128_512K_RAM;
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __APRICOT_RAM__
|
@ -9,11 +9,8 @@
|
|||||||
|
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "bus/centronics/ctronics.h"
|
|
||||||
#include "bus/rs232/rs232.h"
|
|
||||||
#include "cpu/i86/i86.h"
|
#include "cpu/i86/i86.h"
|
||||||
#include "cpu/i8089/i8089.h"
|
#include "cpu/i8089/i8089.h"
|
||||||
#include "machine/ram.h"
|
|
||||||
#include "machine/pit8253.h"
|
#include "machine/pit8253.h"
|
||||||
#include "machine/i8255.h"
|
#include "machine/i8255.h"
|
||||||
#include "machine/pic8259.h"
|
#include "machine/pic8259.h"
|
||||||
@ -23,6 +20,9 @@
|
|||||||
#include "sound/sn76496.h"
|
#include "sound/sn76496.h"
|
||||||
#include "imagedev/flopdrv.h"
|
#include "imagedev/flopdrv.h"
|
||||||
#include "formats/apridisk.h"
|
#include "formats/apridisk.h"
|
||||||
|
#include "bus/centronics/ctronics.h"
|
||||||
|
#include "bus/rs232/rs232.h"
|
||||||
|
#include "bus/apricot/expansion.h"
|
||||||
|
|
||||||
|
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
@ -35,7 +35,6 @@ public:
|
|||||||
apricot_state(const machine_config &mconfig, device_type type, const char *tag) :
|
apricot_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||||
driver_device(mconfig, type, tag),
|
driver_device(mconfig, type, tag),
|
||||||
m_cpu(*this, "ic91"),
|
m_cpu(*this, "ic91"),
|
||||||
m_ram(*this, RAM_TAG),
|
|
||||||
m_iop(*this, "ic71"),
|
m_iop(*this, "ic71"),
|
||||||
m_sn(*this, "ic7"),
|
m_sn(*this, "ic7"),
|
||||||
m_crtc(*this, "ic30"),
|
m_crtc(*this, "ic30"),
|
||||||
@ -89,7 +88,6 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
required_device<i8086_cpu_device> m_cpu;
|
required_device<i8086_cpu_device> m_cpu;
|
||||||
required_device<ram_device> m_ram;
|
|
||||||
required_device<i8089_device> m_iop;
|
required_device<i8089_device> m_iop;
|
||||||
required_device<sn76489_device> m_sn;
|
required_device<sn76489_device> m_sn;
|
||||||
required_device<mc6845_device> m_crtc;
|
required_device<mc6845_device> m_crtc;
|
||||||
@ -262,14 +260,13 @@ UINT32 apricot_state::screen_update_apricot(screen_device &screen, bitmap_rgb32
|
|||||||
|
|
||||||
MC6845_UPDATE_ROW( apricot_state::crtc_update_row )
|
MC6845_UPDATE_ROW( apricot_state::crtc_update_row )
|
||||||
{
|
{
|
||||||
UINT8 *ram = m_ram->pointer();
|
|
||||||
const pen_t *pen = m_palette->pens();
|
const pen_t *pen = m_palette->pens();
|
||||||
|
|
||||||
for (int i = 0; i < x_count; i++)
|
for (int i = 0; i < x_count; i++)
|
||||||
{
|
{
|
||||||
UINT16 code = m_screen_buffer[(ma + i) & 0x7ff];
|
UINT16 code = m_screen_buffer[(ma + i) & 0x7ff];
|
||||||
UINT16 offset = ((code & 0x7ff) << 5) | (ra << 1);
|
UINT16 offset = ((code & 0x7ff) << 5) | (ra << 1);
|
||||||
UINT16 data = ram[offset + 1] << 8 | ram[offset];
|
UINT16 data = m_cpu->space(AS_PROGRAM).read_word(offset);
|
||||||
|
|
||||||
if (m_video_mode)
|
if (m_video_mode)
|
||||||
{
|
{
|
||||||
@ -302,9 +299,6 @@ MC6845_UPDATE_ROW( apricot_state::crtc_update_row )
|
|||||||
|
|
||||||
void apricot_state::machine_start()
|
void apricot_state::machine_start()
|
||||||
{
|
{
|
||||||
// install shared memory to the main cpu and the iop
|
|
||||||
m_cpu->space(AS_PROGRAM).install_ram(0x00000, m_ram->size() - 1, m_ram->pointer());
|
|
||||||
m_iop->space(AS_PROGRAM).install_ram(0x00000, m_ram->size() - 1, m_ram->pointer());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IRQ_CALLBACK_MEMBER( apricot_state::irq_callback )
|
IRQ_CALLBACK_MEMBER( apricot_state::irq_callback )
|
||||||
@ -322,8 +316,7 @@ IRQ_CALLBACK_MEMBER( apricot_state::irq_callback )
|
|||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
|
|
||||||
static ADDRESS_MAP_START( apricot_mem, AS_PROGRAM, 16, apricot_state )
|
static ADDRESS_MAP_START( apricot_mem, AS_PROGRAM, 16, apricot_state )
|
||||||
// AM_RANGE(0x00000, 0x3ffff) AM_RAMBANK("standard_ram")
|
AM_RANGE(0x00000, 0x3ffff) AM_RAM
|
||||||
// AM_RANGE(0x40000, 0xeffff) AM_RAMBANK("expansion_ram")
|
|
||||||
AM_RANGE(0xf0000, 0xf0fff) AM_MIRROR(0x7000) AM_RAM AM_SHARE("screen_buffer")
|
AM_RANGE(0xf0000, 0xf0fff) AM_MIRROR(0x7000) AM_RAM AM_SHARE("screen_buffer")
|
||||||
AM_RANGE(0xfc000, 0xfffff) AM_MIRROR(0x4000) AM_ROM AM_REGION("bootstrap", 0)
|
AM_RANGE(0xfc000, 0xfffff) AM_MIRROR(0x4000) AM_ROM AM_REGION("bootstrap", 0)
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
@ -382,11 +375,6 @@ static MACHINE_CONFIG_START( apricot, apricot_state )
|
|||||||
MCFG_SOUND_ADD("ic7", SN76489, XTAL_4MHz / 2)
|
MCFG_SOUND_ADD("ic7", SN76489, XTAL_4MHz / 2)
|
||||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||||
|
|
||||||
// internal ram
|
|
||||||
MCFG_RAM_ADD(RAM_TAG)
|
|
||||||
MCFG_RAM_DEFAULT_SIZE("256k")
|
|
||||||
MCFG_RAM_EXTRA_OPTIONS("384k,512k") // with 1 or 2 128k expansion boards
|
|
||||||
|
|
||||||
// devices
|
// devices
|
||||||
MCFG_DEVICE_ADD("ic17", I8255A, 0)
|
MCFG_DEVICE_ADD("ic17", I8255A, 0)
|
||||||
MCFG_I8255_IN_PORTA_CB(DEVREAD8("cent_data_in", input_buffer_device, read))
|
MCFG_I8255_IN_PORTA_CB(DEVREAD8("cent_data_in", input_buffer_device, read))
|
||||||
@ -441,6 +429,11 @@ static MACHINE_CONFIG_START( apricot, apricot_state )
|
|||||||
MCFG_WD_FDC_DRQ_CALLBACK(DEVWRITELINE("ic71", i8089_device, drq1_w))
|
MCFG_WD_FDC_DRQ_CALLBACK(DEVWRITELINE("ic71", i8089_device, drq1_w))
|
||||||
MCFG_FLOPPY_DRIVE_ADD("ic68:0", apricot_floppies, "d32w", apricot_state::floppy_formats)
|
MCFG_FLOPPY_DRIVE_ADD("ic68:0", apricot_floppies, "d32w", apricot_state::floppy_formats)
|
||||||
MCFG_FLOPPY_DRIVE_ADD("ic68:1", apricot_floppies, "d32w", apricot_state::floppy_formats)
|
MCFG_FLOPPY_DRIVE_ADD("ic68:1", apricot_floppies, "d32w", apricot_state::floppy_formats)
|
||||||
|
|
||||||
|
// expansion bus
|
||||||
|
MCFG_EXPANSION_ADD("exp", "ic91")
|
||||||
|
MCFG_EXPANSION_SLOT_ADD("exp:1", apricot_expansion_cards, NULL)
|
||||||
|
MCFG_EXPANSION_SLOT_ADD("exp:2", apricot_expansion_cards, NULL)
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
static MACHINE_CONFIG_DERIVED( apricotxi, apricot )
|
static MACHINE_CONFIG_DERIVED( apricotxi, apricot )
|
||||||
|
Loading…
Reference in New Issue
Block a user