mirror of
https://github.com/holub/mame
synced 2025-04-20 23:42:22 +03:00
(MESS) Mac updates: [R. Belmont]
- Corrected memory map errors with the SE and Classic - Preliminary support for the SE's 68000 processor-direct slot - Preliminary support for the Radius Full Page Display card which goes in the SE PDS slot
This commit is contained in:
parent
8027bf36c6
commit
25d278f9d5
4
.gitattributes
vendored
4
.gitattributes
vendored
@ -7549,6 +7549,8 @@ src/mess/machine/macadb.c svneol=native#text/plain
|
||||
src/mess/machine/mackbd.c svneol=native#text/plain
|
||||
src/mess/machine/mackbd.h svneol=native#text/plain
|
||||
src/mess/machine/macpci.c svneol=native#text/plain
|
||||
src/mess/machine/macpds.c svneol=native#text/plain
|
||||
src/mess/machine/macpds.h svneol=native#text/plain
|
||||
src/mess/machine/macrtc.c svneol=native#text/plain
|
||||
src/mess/machine/macrtc.h svneol=native#text/plain
|
||||
src/mess/machine/mb8795.c svneol=native#text/plain
|
||||
@ -8339,6 +8341,8 @@ src/mess/video/pds30_procolor816.c svneol=native#text/plain
|
||||
src/mess/video/pds30_procolor816.h svneol=native#text/plain
|
||||
src/mess/video/pds30_sigmalview.c svneol=native#text/plain
|
||||
src/mess/video/pds30_sigmalview.h svneol=native#text/plain
|
||||
src/mess/video/pds_tpdfpd.c svneol=native#text/plain
|
||||
src/mess/video/pds_tpdfpd.h svneol=native#text/plain
|
||||
src/mess/video/pecom.c svneol=native#text/plain
|
||||
src/mess/video/pk8020.c svneol=native#text/plain
|
||||
src/mess/video/pmd85.c svneol=native#text/plain
|
||||
|
@ -76,6 +76,7 @@
|
||||
#include "video/pds30_sigmalview.h"
|
||||
#include "video/pds30_30hr.h"
|
||||
#include "video/pds30_mc30.h"
|
||||
#include "video/pds_tpdfpd.h"
|
||||
#include "includes/mac.h"
|
||||
#include "mac.lh"
|
||||
|
||||
@ -578,6 +579,15 @@ static ADDRESS_MAP_START(macplus_map, AS_PROGRAM, 16, mac_state )
|
||||
AM_RANGE(0xfffff0, 0xffffff) AM_READWRITE(mac_autovector_r, mac_autovector_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START(macse_map, AS_PROGRAM, 16, mac_state )
|
||||
AM_RANGE(0x580000, 0x5fffff) AM_READWRITE(macplus_scsi_r, macplus_scsi_w)
|
||||
AM_RANGE(0x900000, 0x9fffff) AM_READ(mac_scc_r)
|
||||
AM_RANGE(0xb00000, 0xbfffff) AM_WRITE(mac_scc_w)
|
||||
AM_RANGE(0xd00000, 0xdfffff) AM_READWRITE(mac_iwm_r, mac_iwm_w)
|
||||
AM_RANGE(0xe80000, 0xefffff) AM_READWRITE(mac_via_r, mac_via_w)
|
||||
AM_RANGE(0xfffff0, 0xffffff) AM_READWRITE(mac_autovector_r, mac_autovector_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START(macprtb_map, AS_PROGRAM, 16, mac_state )
|
||||
AM_RANGE(0x900000, 0x93ffff) AM_ROM AM_REGION("bootrom", 0) AM_MIRROR(0x0c0000)
|
||||
AM_RANGE(0xf60000, 0xf6ffff) AM_READWRITE(mac_iwm_r, mac_iwm_w)
|
||||
@ -849,6 +859,11 @@ static const struct nbbus_interface nubus_intf =
|
||||
DEVCB_DRIVER_LINE_MEMBER(mac_state, nubus_irq_e_w)
|
||||
};
|
||||
|
||||
static const struct macpds_interface macpds_intf =
|
||||
{
|
||||
0
|
||||
};
|
||||
|
||||
static SLOT_INTERFACE_START(mac_nubus_cards)
|
||||
SLOT_INTERFACE("m2video", NUBUS_M2VIDEO) /* Apple Macintosh II Video Card */
|
||||
SLOT_INTERFACE("48gc", NUBUS_48GC) /* Apple 4*8 Graphics Card */
|
||||
@ -874,6 +889,10 @@ static SLOT_INTERFACE_START(mac_pds030_cards)
|
||||
SLOT_INTERFACE("mc30", PDS030_XCEEDMC30) // Micron/XCEED Technology MacroColor 30
|
||||
SLOT_INTERFACE_END
|
||||
|
||||
static SLOT_INTERFACE_START(mac_sepds_cards)
|
||||
SLOT_INTERFACE("radiusfpd", PDS_SEDISPLAY) // Radius Full Page Display card for SE
|
||||
SLOT_INTERFACE_END
|
||||
|
||||
static SLOT_INTERFACE_START(mac_lcpds_cards)
|
||||
SLOT_INTERFACE_END
|
||||
|
||||
@ -977,6 +996,8 @@ static MACHINE_CONFIG_DERIVED( macplus, mac512ke )
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( macse, macplus )
|
||||
MCFG_CPU_MODIFY("maincpu")
|
||||
MCFG_CPU_PROGRAM_MAP(macse_map)
|
||||
|
||||
MCFG_DEVICE_REMOVE("via6522_0")
|
||||
MCFG_VIA6522_ADD("via6522_0", 1000000, mac_via6522_adb_intf)
|
||||
@ -985,6 +1006,26 @@ static MACHINE_CONFIG_DERIVED( macse, macplus )
|
||||
MCFG_RAM_MODIFY(RAM_TAG)
|
||||
MCFG_RAM_DEFAULT_SIZE("4M")
|
||||
MCFG_RAM_EXTRA_OPTIONS("2M,2560K,4M")
|
||||
|
||||
MCFG_MACKBD_REMOVE()
|
||||
|
||||
MCFG_MACPDS_BUS_ADD("sepds", "maincpu", macpds_intf)
|
||||
MCFG_MACPDS_SLOT_ADD("sepds", "pds", mac_sepds_cards, NULL)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( macclasc, macplus )
|
||||
MCFG_CPU_MODIFY("maincpu")
|
||||
MCFG_CPU_PROGRAM_MAP(macse_map)
|
||||
|
||||
MCFG_DEVICE_REMOVE("via6522_0")
|
||||
MCFG_VIA6522_ADD("via6522_0", 1000000, mac_via6522_adb_intf)
|
||||
|
||||
/* internal ram */
|
||||
MCFG_RAM_MODIFY(RAM_TAG)
|
||||
MCFG_RAM_DEFAULT_SIZE("4M")
|
||||
MCFG_RAM_EXTRA_OPTIONS("2M,2560K,4M")
|
||||
|
||||
MCFG_MACKBD_REMOVE()
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
static MACHINE_CONFIG_START( macprtb, mac_state )
|
||||
@ -2160,7 +2201,7 @@ COMP( 1989, macse30, mac2fdhd, 0, macse30, macadb, mac_state, macse30, "A
|
||||
COMP( 1989, maciicx, mac2fdhd, 0, maciicx, macadb, mac_state, maciicx, "Apple Computer", "Macintosh IIcx", 0 )
|
||||
COMP( 1989, maciici, 0, 0, maciici, maciici, mac_state, maciici, "Apple Computer", "Macintosh IIci", 0 )
|
||||
COMP( 1990, maciifx, 0, 0, maciifx, macadb, mac_state, maciifx, "Apple Computer", "Macintosh IIfx", GAME_NOT_WORKING )
|
||||
COMP( 1990, macclasc, 0, 0, macse, macadb, mac_state, macclassic, "Apple Computer", "Macintosh Classic", 0 )
|
||||
COMP( 1990, macclasc, 0, 0, macclasc, macadb, mac_state, macclassic, "Apple Computer", "Macintosh Classic", 0 )
|
||||
COMP( 1990, maclc, 0, 0, maclc, maciici, mac_state, maclc, "Apple Computer", "Macintosh LC", GAME_IMPERFECT_SOUND )
|
||||
COMP( 1990, maciisi, 0, 0, maciisi, maciici, mac_state, maciisi, "Apple Computer", "Macintosh IIsi", 0 )
|
||||
COMP( 1991, macpb100, 0, 0, macprtb, macadb, mac_state, macprtb, "Apple Computer", "Macintosh PowerBook 100", GAME_NOT_WORKING )
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include "machine/egret.h"
|
||||
#include "machine/cuda.h"
|
||||
#include "machine/nubus.h"
|
||||
#include "machine/macpds.h"
|
||||
#include "machine/ncr539x.h"
|
||||
#include "machine/ncr5380.h"
|
||||
#include "machine/mackbd.h"
|
||||
|
220
src/mess/machine/macpds.c
Normal file
220
src/mess/machine/macpds.c
Normal file
@ -0,0 +1,220 @@
|
||||
/***************************************************************************
|
||||
|
||||
macpds.c - Mac 68000 PDS implementation (SE, Portable)
|
||||
|
||||
by R. Belmont
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "emuopts.h"
|
||||
#include "machine/macpds.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// GLOBAL VARIABLES
|
||||
//**************************************************************************
|
||||
|
||||
const device_type MACPDS_SLOT = &device_creator<macpds_slot_device>;
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// macpds_slot_device - constructor
|
||||
//-------------------------------------------------
|
||||
macpds_slot_device::macpds_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
||||
device_t(mconfig, MACPDS_SLOT, "Mac 68000 Processor-Direct Slot", tag, owner, clock, "macpds_slot", __FILE__),
|
||||
device_slot_interface(mconfig, *this)
|
||||
{
|
||||
}
|
||||
|
||||
macpds_slot_device::macpds_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)
|
||||
{
|
||||
}
|
||||
|
||||
void macpds_slot_device::static_set_macpds_slot(device_t &device, const char *tag, const char *slottag)
|
||||
{
|
||||
macpds_slot_device &macpds_card = dynamic_cast<macpds_slot_device &>(device);
|
||||
macpds_card.m_macpds_tag = tag;
|
||||
macpds_card.m_macpds_slottag = slottag;
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void macpds_slot_device::device_start()
|
||||
{
|
||||
device_macpds_card_interface *dev = dynamic_cast<device_macpds_card_interface *>(get_card_device());
|
||||
|
||||
if (dev) device_macpds_card_interface::static_set_macpds_tag(*dev, m_macpds_tag, m_macpds_slottag);
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
// GLOBAL VARIABLES
|
||||
//**************************************************************************
|
||||
|
||||
const device_type MACPDS = &device_creator<macpds_device>;
|
||||
|
||||
void macpds_device::static_set_cputag(device_t &device, const char *tag)
|
||||
{
|
||||
macpds_device &macpds = downcast<macpds_device &>(device);
|
||||
macpds.m_cputag = tag;
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_config_complete - perform any
|
||||
// operations now that the configuration is
|
||||
// complete
|
||||
//-------------------------------------------------
|
||||
|
||||
void macpds_device::device_config_complete()
|
||||
{
|
||||
// inherit a copy of the static data
|
||||
const macpds_interface *intf = reinterpret_cast<const macpds_interface *>(static_config());
|
||||
if (intf != NULL)
|
||||
{
|
||||
*static_cast<macpds_interface *>(this) = *intf;
|
||||
}
|
||||
|
||||
// or initialize to defaults if none provided
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// macpds_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
macpds_device::macpds_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
||||
device_t(mconfig, MACPDS, "MACPDS", tag, owner, clock, "macpds", __FILE__)
|
||||
{
|
||||
}
|
||||
|
||||
macpds_device::macpds_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_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void macpds_device::device_start()
|
||||
{
|
||||
m_maincpu = machine().device<cpu_device>(m_cputag);
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void macpds_device::device_reset()
|
||||
{
|
||||
}
|
||||
|
||||
void macpds_device::add_macpds_card(device_macpds_card_interface *card)
|
||||
{
|
||||
m_device_list.append(*card);
|
||||
}
|
||||
|
||||
void macpds_device::install_device(offs_t start, offs_t end, read8_delegate rhandler, write8_delegate whandler, UINT32 mask)
|
||||
{
|
||||
m_maincpu = machine().device<cpu_device>(m_cputag);
|
||||
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(start, end, rhandler, whandler, mask);
|
||||
}
|
||||
|
||||
void macpds_device::install_device(offs_t start, offs_t end, read16_delegate rhandler, write16_delegate whandler, UINT32 mask)
|
||||
{
|
||||
m_maincpu = machine().device<cpu_device>(m_cputag);
|
||||
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(start, end, rhandler, whandler, mask);
|
||||
}
|
||||
|
||||
void macpds_device::install_bank(offs_t start, offs_t end, offs_t mask, offs_t mirror, const char *tag, UINT8 *data)
|
||||
{
|
||||
// printf("install_bank: %s @ %x->%x mask %x mirror %x\n", tag, start, end, mask, mirror);
|
||||
m_maincpu = machine().device<cpu_device>(m_cputag);
|
||||
address_space &space = m_maincpu->space(AS_PROGRAM);
|
||||
space.install_readwrite_bank(start, end, mask, mirror, tag );
|
||||
machine().root_device().membank(tag)->set_base(data);
|
||||
}
|
||||
|
||||
void macpds_device::set_irq_line(int line, int state)
|
||||
{
|
||||
m_maincpu->set_input_line(line, state);
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE CONFIG MACPDS CARD INTERFACE
|
||||
//**************************************************************************
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE MACPDS CARD INTERFACE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_macpds_card_interface - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
device_macpds_card_interface::device_macpds_card_interface(const machine_config &mconfig, device_t &device)
|
||||
: device_slot_card_interface(mconfig, device),
|
||||
m_macpds(NULL),
|
||||
m_macpds_tag(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// ~device_macpds_card_interface - destructor
|
||||
//-------------------------------------------------
|
||||
|
||||
device_macpds_card_interface::~device_macpds_card_interface()
|
||||
{
|
||||
}
|
||||
|
||||
void device_macpds_card_interface::static_set_macpds_tag(device_t &device, const char *tag, const char *slottag)
|
||||
{
|
||||
device_macpds_card_interface &macpds_card = dynamic_cast<device_macpds_card_interface &>(device);
|
||||
macpds_card.m_macpds_tag = tag;
|
||||
macpds_card.m_macpds_slottag = slottag;
|
||||
}
|
||||
|
||||
void device_macpds_card_interface::set_macpds_device()
|
||||
{
|
||||
m_macpds = dynamic_cast<macpds_device *>(device().machine().device(m_macpds_tag));
|
||||
m_macpds->add_macpds_card(this);
|
||||
}
|
||||
|
||||
void device_macpds_card_interface::install_bank(offs_t start, offs_t end, offs_t mask, offs_t mirror, const char *tag, UINT8 *data)
|
||||
{
|
||||
char bank[256];
|
||||
|
||||
// append an underscore and the slot name to the bank so it's guaranteed unique
|
||||
strcpy(bank, tag);
|
||||
strcat(bank, "_");
|
||||
strcat(bank, m_macpds_slottag);
|
||||
|
||||
m_macpds->install_bank(start, end, mask, mirror, bank, data);
|
||||
}
|
||||
|
||||
void device_macpds_card_interface::install_rom(device_t *dev, const char *romregion, UINT32 addr)
|
||||
{
|
||||
astring tempstring;
|
||||
UINT8 *rom = device().machine().root_device().memregion(dev->subtag(tempstring, romregion))->base();
|
||||
UINT32 romlen = device().machine().root_device().memregion(dev->subtag(tempstring, romregion))->bytes();
|
||||
char bankname[128];
|
||||
sprintf(bankname, "rom_%x", addr);
|
||||
|
||||
m_macpds->install_bank(addr, addr+romlen-1, 0, 0, bankname, rom);
|
||||
}
|
||||
|
||||
|
137
src/mess/machine/macpds.h
Normal file
137
src/mess/machine/macpds.h
Normal file
@ -0,0 +1,137 @@
|
||||
/***************************************************************************
|
||||
|
||||
macpds.h - Mac 68000 PDS implementation (SE, Portable)
|
||||
|
||||
by R. Belmont
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef __MACPDS_H__
|
||||
#define __MACPDS_H__
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// INTERFACE CONFIGURATION MACROS
|
||||
//**************************************************************************
|
||||
|
||||
#define MCFG_MACPDS_BUS_ADD(_tag, _cputag, _config) \
|
||||
MCFG_DEVICE_ADD(_tag, MACPDS, 0) \
|
||||
MCFG_DEVICE_CONFIG(_config) \
|
||||
macpds_device::static_set_cputag(*device, _cputag);
|
||||
#define MCFG_MACPDS_SLOT_ADD(_nbtag, _tag, _slot_intf, _def_slot) \
|
||||
MCFG_DEVICE_ADD(_tag, MACPDS_SLOT, 0) \
|
||||
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
|
||||
macpds_slot_device::static_set_macpds_slot(*device, _nbtag, _tag);
|
||||
#define MCFG_MACPDS_SLOT_REMOVE(_tag) \
|
||||
MCFG_DEVICE_REMOVE(_tag)
|
||||
|
||||
#define MCFG_MACPDS_ONBOARD_ADD(_nbtag, _tag, _dev_type, _def_inp) \
|
||||
MCFG_DEVICE_ADD(_tag, _dev_type, 0) \
|
||||
MCFG_DEVICE_INPUT_DEFAULTS(_def_inp) \
|
||||
device_macpds_card_interface::static_set_macpds_tag(*device, _nbtag, _tag);
|
||||
|
||||
#define MCFG_MACPDS_BUS_REMOVE(_tag) \
|
||||
MCFG_DEVICE_REMOVE(_tag)
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
class macpds_device;
|
||||
|
||||
class macpds_slot_device : public device_t,
|
||||
public device_slot_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
macpds_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
macpds_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();
|
||||
|
||||
// inline configuration
|
||||
static void static_set_macpds_slot(device_t &device, const char *tag, const char *slottag);
|
||||
protected:
|
||||
// configuration
|
||||
const char *m_macpds_tag, *m_macpds_slottag;
|
||||
};
|
||||
|
||||
// device type definition
|
||||
extern const device_type MACPDS_SLOT;
|
||||
|
||||
// ======================> macpds_interface
|
||||
|
||||
struct macpds_interface
|
||||
{
|
||||
int foo;
|
||||
};
|
||||
|
||||
class device_macpds_card_interface;
|
||||
// ======================> macpds_device
|
||||
class macpds_device : public device_t,
|
||||
public macpds_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
macpds_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
macpds_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);
|
||||
// inline configuration
|
||||
static void static_set_cputag(device_t &device, const char *tag);
|
||||
|
||||
void add_macpds_card(device_macpds_card_interface *card);
|
||||
void install_device(offs_t start, offs_t end, read8_delegate rhandler, write8_delegate whandler, UINT32 mask=0xffffffff);
|
||||
void install_device(offs_t start, offs_t end, read16_delegate rhandler, write16_delegate whandler, UINT32 mask=0xffffffff);
|
||||
void install_bank(offs_t start, offs_t end, offs_t mask, offs_t mirror, const char *tag, UINT8 *data);
|
||||
void set_irq_line(int line, int state);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
virtual void device_config_complete();
|
||||
|
||||
// internal state
|
||||
cpu_device *m_maincpu;
|
||||
|
||||
simple_list<device_macpds_card_interface> m_device_list;
|
||||
const char *m_cputag;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
extern const device_type MACPDS;
|
||||
|
||||
// ======================> device_macpds_card_interface
|
||||
|
||||
// class representing interface-specific live macpds card
|
||||
class device_macpds_card_interface : public device_slot_card_interface
|
||||
{
|
||||
friend class macpds_device;
|
||||
public:
|
||||
// construction/destruction
|
||||
device_macpds_card_interface(const machine_config &mconfig, device_t &device);
|
||||
virtual ~device_macpds_card_interface();
|
||||
|
||||
device_macpds_card_interface *next() const { return m_next; }
|
||||
|
||||
void set_macpds_device();
|
||||
|
||||
// helper functions for card devices
|
||||
void install_declaration_rom(device_t *dev, const char *romregion, bool mirror_all_mb = false, bool reverse_rom = false);
|
||||
void install_bank(offs_t start, offs_t end, offs_t mask, offs_t mirror, const char *tag, UINT8 *data);
|
||||
void install_rom(device_t *dev, const char *romregion, UINT32 addr);
|
||||
|
||||
// inline configuration
|
||||
static void static_set_macpds_tag(device_t &device, const char *tag, const char *slottag);
|
||||
public:
|
||||
macpds_device *m_macpds;
|
||||
const char *m_macpds_tag, *m_macpds_slottag;
|
||||
device_macpds_card_interface *m_next;
|
||||
};
|
||||
|
||||
#endif /* __MACPDS_H__ */
|
235
src/mess/video/pds_tpdfpd.c
Normal file
235
src/mess/video/pds_tpdfpd.c
Normal file
@ -0,0 +1,235 @@
|
||||
/***************************************************************************
|
||||
|
||||
Radius Full Page Display card for the Mac SE, assy # 632-0022-A1
|
||||
|
||||
EPROMs are marked
|
||||
"(c) 1991 Radius TPD/FPD-ASIC U6 297-0204-A V 4.1 256K" and "U7" with
|
||||
all other text the same.
|
||||
|
||||
The SE PDS does not auto-configure like NuBus; cards have to snoop the 68k
|
||||
address bus and claim spots the motherboard logic doesn't want.
|
||||
|
||||
This card claims these address ranges:
|
||||
770000-77000F: Bt9014 RAMDAC
|
||||
C00000-C0FFFF: EPROM
|
||||
C10000 : read to ack vblank IRQ 2 (returns bit 7 = 0 for vblank active)
|
||||
C20000 : read to enable vblank IRQ 2
|
||||
C40000-C7FFFF: 256k VRAM
|
||||
F80000-F8FFFF: EPROM mirror (the SE ROM looks for signatures and jump tables in this region)
|
||||
|
||||
TODO:
|
||||
* suppress SE built-in screen (it stops working after OS boot with this card installed) & make our screen 3:4
|
||||
* investigate if there's also a two-page display mode as the rom labels imply; 256K is
|
||||
far too much for just 1024x880 but would fit double that nicely.
|
||||
* later ROM versions provide System 7 compatibility; our current dump is good only
|
||||
up to 6.0.8. (We have 4.1; the last version is 4.4).
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "video/pds_tpdfpd.h"
|
||||
#include "cpu/m68000/m68000.h"
|
||||
|
||||
#define SEDISPLAY_SCREEN_NAME "fpd_screen"
|
||||
#define SEDISPLAY_ROM_REGION "fpd_rom"
|
||||
|
||||
#define VRAM_SIZE (256*1024) // PCB has a jumper for 1MByte; may require different EPROMs
|
||||
|
||||
MACHINE_CONFIG_FRAGMENT( sedisplay )
|
||||
MCFG_SCREEN_ADD( SEDISPLAY_SCREEN_NAME, RASTER)
|
||||
MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, macpds_sedisplay_device, screen_update)
|
||||
MCFG_SCREEN_SIZE(1280, 960)
|
||||
MCFG_SCREEN_REFRESH_RATE(70)
|
||||
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 870-1)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
ROM_START( sedisplay )
|
||||
ROM_REGION(0x10000, SEDISPLAY_ROM_REGION, ROMREGION_16BIT|ROMREGION_BE)
|
||||
ROM_LOAD16_BYTE( "tfd_fpd-asic_u6_297-0205-a_v4_1", 0x0000, 0x8000, CRC(fd363f45) SHA1(3c4c596654647ee6ce1880de329aa675d298dc26) )
|
||||
ROM_LOAD16_BYTE( "tfd_fpd-asic_u7_297-0205-a_v4_1", 0x0001, 0x8000, CRC(5872451a) SHA1(4673d9f341766c49ff1264b7819916e28a20518f) )
|
||||
ROM_END
|
||||
|
||||
//**************************************************************************
|
||||
// GLOBAL VARIABLES
|
||||
//**************************************************************************
|
||||
|
||||
const device_type PDS_SEDISPLAY = &device_creator<macpds_sedisplay_device>;
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// machine_config_additions - device-specific
|
||||
// machine configurations
|
||||
//-------------------------------------------------
|
||||
|
||||
machine_config_constructor macpds_sedisplay_device::device_mconfig_additions() const
|
||||
{
|
||||
return MACHINE_CONFIG_NAME( sedisplay );
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// rom_region - device-specific ROM region
|
||||
//-------------------------------------------------
|
||||
|
||||
const rom_entry *macpds_sedisplay_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( sedisplay );
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// macpds_sedisplay_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
macpds_sedisplay_device::macpds_sedisplay_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
|
||||
device_t(mconfig, PDS_SEDISPLAY, "Radius SE Full Page Display", tag, owner, clock, "pds_sefp", __FILE__),
|
||||
device_macpds_card_interface(mconfig, *this)
|
||||
{
|
||||
}
|
||||
|
||||
macpds_sedisplay_device::macpds_sedisplay_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_macpds_card_interface(mconfig, *this)
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void macpds_sedisplay_device::device_start()
|
||||
{
|
||||
set_macpds_device();
|
||||
|
||||
install_rom(this, SEDISPLAY_ROM_REGION, 0xc00000);
|
||||
install_rom(this, SEDISPLAY_ROM_REGION, 0xf80000);
|
||||
|
||||
m_vram = auto_alloc_array(machine(), UINT8, VRAM_SIZE);
|
||||
|
||||
static const char bankname[] = { "radpds_ram" };
|
||||
m_macpds->install_bank(0xc40000, 0xc40000+VRAM_SIZE-1, 0, 0, bankname, m_vram);
|
||||
|
||||
m_macpds->install_device(0x770000, 0x77000f, read16_delegate(FUNC(macpds_sedisplay_device::ramdac_r), this), write16_delegate(FUNC(macpds_sedisplay_device::ramdac_w), this));
|
||||
m_macpds->install_device(0xc10000, 0xc2ffff, read16_delegate(FUNC(macpds_sedisplay_device::sedisplay_r), this), write16_delegate(FUNC(macpds_sedisplay_device::sedisplay_w), this));
|
||||
|
||||
m_timer = timer_alloc(0, NULL);
|
||||
m_screen = NULL; // can we look this up now?
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void macpds_sedisplay_device::device_reset()
|
||||
{
|
||||
m_count = 0;
|
||||
m_clutoffs = 0;
|
||||
m_vbl_disable = 1;
|
||||
memset(m_vram, 0, VRAM_SIZE);
|
||||
memset(m_palette, 0, sizeof(m_palette));
|
||||
|
||||
m_palette[0] = MAKE_RGB(0, 0, 0);
|
||||
m_palette[1] = MAKE_RGB(255, 255, 255);
|
||||
}
|
||||
|
||||
|
||||
void macpds_sedisplay_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr)
|
||||
{
|
||||
if (!m_vbl_disable)
|
||||
{
|
||||
m_macpds->set_irq_line(M68K_IRQ_2, ASSERT_LINE);
|
||||
}
|
||||
|
||||
m_timer->adjust(m_screen->time_until_pos(879, 0), 0);
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
CB264 section
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
UINT32 macpds_sedisplay_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
UINT32 *scanline;
|
||||
int x, y;
|
||||
UINT8 pixels, *vram;
|
||||
|
||||
// first time? kick off the VBL timer
|
||||
if (!m_screen)
|
||||
{
|
||||
m_screen = &screen;
|
||||
m_timer->adjust(m_screen->time_until_pos(879, 0), 0);
|
||||
}
|
||||
vram = m_vram;
|
||||
|
||||
for (y = 0; y < 870; y++)
|
||||
{
|
||||
scanline = &bitmap.pix32(y);
|
||||
for (x = 0; x < 640/8; x++)
|
||||
{
|
||||
pixels = vram[(y * (1024/8)) + (x^1)];
|
||||
|
||||
*scanline++ = m_palette[((pixels>>7)&0x1)^1];
|
||||
*scanline++ = m_palette[((pixels>>6)&0x1)^1];
|
||||
*scanline++ = m_palette[((pixels>>5)&0x1)^1];
|
||||
*scanline++ = m_palette[((pixels>>4)&0x1)^1];
|
||||
*scanline++ = m_palette[((pixels>>3)&0x1)^1];
|
||||
*scanline++ = m_palette[((pixels>>2)&0x1)^1];
|
||||
*scanline++ = m_palette[((pixels>>1)&0x1)^1];
|
||||
*scanline++ = m_palette[(pixels&1)^1];
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
WRITE16_MEMBER( macpds_sedisplay_device::sedisplay_w )
|
||||
{
|
||||
}
|
||||
|
||||
READ16_MEMBER( macpds_sedisplay_device::sedisplay_r )
|
||||
{
|
||||
if (offset == 0) // ack vbl
|
||||
{
|
||||
m_macpds->set_irq_line(M68K_IRQ_2, CLEAR_LINE);
|
||||
}
|
||||
else if (offset == 0x8000) // enable vbl
|
||||
{
|
||||
m_vbl_disable = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
WRITE16_MEMBER( macpds_sedisplay_device::ramdac_w )
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 4:
|
||||
m_clutoffs = data>>8;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
m_colors[m_count++] = data>>4; // they only fill in the lower nibble
|
||||
|
||||
if (m_count == 3)
|
||||
{ // only the green channel drives the output
|
||||
m_palette[m_clutoffs] = MAKE_RGB(m_colors[1], m_colors[1], m_colors[1]);
|
||||
m_clutoffs++;
|
||||
m_count = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
// printf("RAMDAC: %x to %x (mask %04x)\n", data, offset, mem_mask);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
READ16_MEMBER( macpds_sedisplay_device::ramdac_r )
|
||||
{
|
||||
return 0;
|
||||
}
|
52
src/mess/video/pds_tpdfpd.h
Normal file
52
src/mess/video/pds_tpdfpd.h
Normal file
@ -0,0 +1,52 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef __PDS_SEDISPLAY_H__
|
||||
#define __PDS_SEDISPLAY_H__
|
||||
|
||||
#include "emu.h"
|
||||
#include "machine/macpds.h"
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
// ======================> macpds_sedisplay_device
|
||||
|
||||
class macpds_sedisplay_device :
|
||||
public device_t,
|
||||
public device_macpds_card_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
macpds_sedisplay_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
macpds_sedisplay_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);
|
||||
|
||||
// optional information overrides
|
||||
virtual machine_config_constructor device_mconfig_additions() const;
|
||||
virtual const rom_entry *device_rom_region() const;
|
||||
|
||||
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start();
|
||||
virtual void device_reset();
|
||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
|
||||
|
||||
DECLARE_READ16_MEMBER(sedisplay_r);
|
||||
DECLARE_WRITE16_MEMBER(sedisplay_w);
|
||||
DECLARE_READ16_MEMBER(ramdac_r);
|
||||
DECLARE_WRITE16_MEMBER(ramdac_w);
|
||||
|
||||
public:
|
||||
UINT8 *m_vram;
|
||||
UINT32 m_vbl_disable;
|
||||
UINT32 m_palette[256], m_colors[3], m_count, m_clutoffs;
|
||||
screen_device *m_screen;
|
||||
emu_timer *m_timer;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
extern const device_type PDS_SEDISPLAY;
|
||||
|
||||
#endif /* __MACPDS_SEDISPLAY_H__ */
|
Loading…
Reference in New Issue
Block a user