(MESS) pc1640: Added ISA card for integrated video. (nw)

This commit is contained in:
Curt Coder 2013-07-11 21:54:37 +00:00
parent 89830c4904
commit 5919be052a
6 changed files with 243 additions and 119 deletions

3
.gitattributes vendored
View File

@ -8215,6 +8215,8 @@ src/mess/video/isa_ega.c svneol=native#text/plain
src/mess/video/isa_ega.h svneol=native#text/plain
src/mess/video/isa_mda.c svneol=native#text/plain
src/mess/video/isa_mda.h svneol=native#text/plain
src/mess/video/isa_pc1640_iga.c svneol=native#text/plain
src/mess/video/isa_pc1640_iga.h svneol=native#text/plain
src/mess/video/isa_svga_cirrus.c svneol=native#text/plain
src/mess/video/isa_svga_cirrus.h svneol=native#text/plain
src/mess/video/isa_svga_s3.c svneol=native#text/plain
@ -8281,7 +8283,6 @@ src/mess/video/pc1350.c svneol=native#text/plain
src/mess/video/pc1401.c svneol=native#text/plain
src/mess/video/pc1403.c svneol=native#text/plain
src/mess/video/pc1512.c svneol=native#text/plain
src/mess/video/pc1640.c svneol=native#text/plain
src/mess/video/pc4.c svneol=native#text/plain
src/mess/video/pc8401a.c svneol=native#text/plain
src/mess/video/pc_aga.c svneol=native#text/plain

View File

@ -480,7 +480,7 @@ READ8_MEMBER( pc1640_state::io_r )
else if (addr >= 0x070 && addr <= 0x073) { data = m_rtc->read(space, offset & 0x01); decoded = true; }
else if (addr >= 0x078 && addr <= 0x07f) { data = mouse_r(space, offset & 0x07); decoded = true; }
else if (addr >= 0x378 && addr <= 0x37b) { data = printer_r(space, offset & 0x03); decoded = true; }
else if (addr >= 0x3b0 && addr <= 0x3df) { data = iga_r(space, addr - 0x3b0); decoded = true; }
else if (addr >= 0x3b0 && addr <= 0x3df) { decoded = true; }
else if (addr >= 0x3f4 && addr <= 0x3f4) { data = m_fdc->fdc->msr_r(space, offset & 0x01); decoded = true; }
else if (addr >= 0x3f5 && addr <= 0x3f5) { data = m_fdc->fdc->fifo_r(space, offset & 0x01); decoded = true; }
else if (addr >= 0x3f8 && addr <= 0x3ff) { data = m_uart->ins8250_r(space, offset & 0x07); decoded = true; }
@ -556,9 +556,6 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( pc1640_mem, AS_PROGRAM, 16, pc1640_state )
AM_RANGE(0x00000, 0x9ffff) AM_RAM
AM_RANGE(0xa0000, 0xbffff) AM_READWRITE8(video_ram_r, video_ram_w, 0xffff)
AM_RANGE(0xc0000, 0xc7fff) AM_ROM AM_REGION("iga", 0)
// AM_RANGE(0xc8000, 0xc9fff) AM_ROM AM_REGION("hdc", 0)
AM_RANGE(0xf0000, 0xf3fff) AM_MIRROR(0xc000) AM_ROM AM_REGION(I8086_TAG, 0)
ADDRESS_MAP_END
@ -579,7 +576,6 @@ static ADDRESS_MAP_START( pc1640_io, AS_IO, 16, pc1640_state )
AM_RANGE(0x080, 0x083) AM_WRITE8(dma_page_w, 0xffff)
AM_RANGE(0x0a0, 0x0a1) AM_WRITE8(nmi_mask_w, 0xff00)
AM_RANGE(0x378, 0x37b) AM_WRITE8(printer_w, 0xffff)
AM_RANGE(0x3b0, 0x3df) AM_WRITE8(iga_w, 0xffff)
AM_RANGE(0x3f2, 0x3f3) AM_DEVWRITE8(PC_FDC_XT_TAG, pc_fdc_xt_device, dor_w, 0x00ff)
AM_RANGE(0x3f4, 0x3f5) AM_DEVWRITE8(PC_FDC_XT_TAG ":upd765", upd765_family_device, fifo_w, 0xff00)
AM_RANGE(0x3f8, 0x3ff) AM_DEVWRITE8(INS8250_TAG, ins8250_device, ins8250_w, 0xffff)
@ -1039,6 +1035,10 @@ static const centronics_interface centronics_intf =
// isa8bus_interface isabus_intf
//-------------------------------------------------
SLOT_INTERFACE_START( pc1640_isa8_cards )
SLOT_INTERFACE_INTERNAL("iga", ISA8_PC1640_IGA)
SLOT_INTERFACE_END
static const isa8bus_interface isabus_intf =
{
// interrupts
@ -1276,9 +1276,6 @@ static MACHINE_CONFIG_START( pc1640, pc1640_state )
MCFG_CPU_PROGRAM_MAP(pc1640_mem)
MCFG_CPU_IO_MAP(pc1640_io)
// video
MCFG_FRAGMENT_ADD(pc1640_video)
// sound
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
@ -1302,6 +1299,8 @@ static MACHINE_CONFIG_START( pc1640, pc1640_state )
MCFG_ISA8_SLOT_ADD(ISA_BUS_TAG, "isa1", pc_isa8_cards, "wdxt_gen", false)
MCFG_ISA8_SLOT_ADD(ISA_BUS_TAG, "isa2", pc_isa8_cards, NULL, false)
MCFG_ISA8_SLOT_ADD(ISA_BUS_TAG, "isa3", pc_isa8_cards, NULL, false)
MCFG_ISA8_SLOT_ADD(ISA_BUS_TAG, "isa4", pc_isa8_cards, NULL, false)
MCFG_ISA8_SLOT_ADD(ISA_BUS_TAG, "isa5", pc1640_isa8_cards, "iga", false)
// internal ram
MCFG_RAM_ADD(RAM_TAG)
@ -1374,9 +1373,6 @@ ROM_START( pc1640 )
ROM_SYSTEM_BIOS( 2, "88xx", "Week ?/1988" )
ROMX_LOAD( "40044 88xx.ic132", 0x0000, 0x2000, CRC(6090f782) SHA1(e21ae524d5b4d00696d293dbd4fe4d7bca22e277), ROM_SKIP(1) | ROM_BIOS(3) )
ROMX_LOAD( "40043 88xx.ic129", 0x0001, 0x2000, CRC(9219d0aa) SHA1(dde1a46c8f83e413d7070f1356fc91b9f595a8b6), ROM_SKIP(1) | ROM_BIOS(3) )
ROM_REGION16_LE( 0x8000, "iga", 0)
ROM_LOAD( "40100.ic913", 0x0000, 0x8000, CRC(d2d1f1ae) SHA1(98302006ee38a17c09bd75504cc18c0649174e33) ) // 8736 E
ROM_END

View File

@ -21,6 +21,7 @@
#include "machine/serial.h"
#include "sound/speaker.h"
#include "video/mc6845.h"
#include "video/isa_pc1640_iga.h"
#define I8086_TAG "ic120"
#define I8087_TAG "ic119"
@ -35,8 +36,8 @@
#define CENTRONICS_TAG "centronics"
#define SPEAKER_TAG "speaker"
#define ISA_BUS_TAG "isa"
#define SCREEN_TAG "screen"
#define RS232_TAG "rs232"
#define SCREEN_TAG "screen"
class pc1512_state : public driver_device
{
@ -88,7 +89,7 @@ public:
required_device<mc146818_device> m_rtc;
required_device<pc_fdc_xt_device> m_fdc;
required_device<ins8250_device> m_uart;
required_device<ams40041_device> m_vdu;
optional_device<ams40041_device> m_vdu;
required_device<centronics_device> m_centronics;
required_device<speaker_sound_device> m_speaker;
required_device<pc1512_keyboard_device> m_kb;
@ -229,40 +230,16 @@ public:
virtual void machine_start();
virtual void machine_reset();
virtual void video_start();
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_READ8_MEMBER( video_ram_r );
DECLARE_WRITE8_MEMBER( video_ram_w );
DECLARE_READ8_MEMBER( io_r );
DECLARE_READ8_MEMBER( iga_r );
DECLARE_WRITE8_MEMBER( iga_w );
DECLARE_READ8_MEMBER( printer_r );
required_ioport m_sw;
// video state
int m_opt;
UINT8 m_egc_ctrl;
UINT8 m_emcr; // extended mode control register
UINT8 m_emcrp; // extended mode control register protection read counter
UINT8 m_sar; // sequencer address register
UINT8 m_sdr[8]; // sequencer data registers
UINT8 m_gcar; // graphics controller address register
UINT8 m_gcdr[16]; // graphics controller data registers
UINT8 m_crtcar; // CRT controller address register
UINT8 m_crtcdr[32]; // CRT controller data registers
UINT8 m_plr; // Plantronics mode register
};
// ---------- defined in video/pc1512.c ----------
MACHINE_CONFIG_EXTERN( pc1512_video );
// ---------- defined in video/pc1640.c ----------
MACHINE_CONFIG_EXTERN( pc1640_video );
#endif

View File

@ -804,6 +804,7 @@ $(MESSOBJ)/isa.a: \
$(MESS_VIDEO)/isa_svga_tseng.o \
$(MESS_VIDEO)/isa_svga_s3.o \
$(MESS_VIDEO)/s3virge.o \
$(MESS_VIDEO)/isa_pc1640_iga.o \
#-------------------------------------------------
# manufacturer-specific groupings for drivers
@ -867,7 +868,6 @@ $(MESSOBJ)/amstrad.a: \
$(MESS_DRIVERS)/pc1512.o \
$(MESS_MACHINE)/pc1512kb.o \
$(MESS_VIDEO)/pc1512.o \
$(MESS_VIDEO)/pc1640.o \
$(MESS_VIDEO)/nc.o \
$(MESS_DRIVERS)/nc.o \
$(MESS_MACHINE)/nc.o \

View File

@ -1,36 +1,176 @@
/*
/**********************************************************************
TODO:
Amstrad PC1640 Integrated Graphics Adapter emulation
- EGA
- CGA
- Plantronics
- Hercules
- MDA
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
*/
**********************************************************************
#include "includes/pc1512.h"
This display controller is integrated on the PC1640 motherboard
but wired to the ISA bus, and can be disabled with a DIP switch.
WD Paradise PEGA 1A 38304B 2116-002 8745AAA JAPAN (84 pin PLCC)
Single chip multimode EGA video controller with
integral 6845 CRTC. Provides 100% IBM EGA, CGA,
MDA, Hercules graphics and Plantronics COLORPLUS*
compatibility
**********************************************************************/
#include "isa_pc1640_iga.h"
//**************************************************************************
// CONSTANTS
// MACROS / CONSTANTS
//**************************************************************************
#define LOG 0
#define SCREEN_TAG "screen"
#define PEGA1A_TAG "ic910"
//**************************************************************************
// VIDEO RAM ACCESS
// DEVICE DEFINITIONS
//**************************************************************************
const device_type ISA8_PC1640_IGA = &device_creator<isa8_pc1640_iga_device>;
//-------------------------------------------------
// ROM( pc1640_iga )
//-------------------------------------------------
ROM_START( pc1640_iga )
ROM_REGION16_LE( 0x8000, "iga", 0)
ROM_LOAD( "40100.ic913", 0x0000, 0x8000, CRC(d2d1f1ae) SHA1(98302006ee38a17c09bd75504cc18c0649174e33) ) // 8736 E
ROM_END
//-------------------------------------------------
// rom_region - device-specific ROM region
//-------------------------------------------------
const rom_entry *isa8_pc1640_iga_device::device_rom_region() const
{
return ROM_NAME( pc1640_iga );
}
//-------------------------------------------------
// mc6845_interface crtc_intf
//-------------------------------------------------
static MC6845_UPDATE_ROW( pc1640_update_row )
{
}
static MC6845_INTERFACE( crtc_intf )
{
SCREEN_TAG,
false,
8,
NULL,
pc1640_update_row,
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
NULL
};
//-------------------------------------------------
// SCREEN_UPDATE( pc1640_iga )
//-------------------------------------------------
UINT32 isa8_pc1640_iga_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
return 0;
}
//-------------------------------------------------
// MACHINE_DRIVER( pc1640_iga )
//-------------------------------------------------
static MACHINE_CONFIG_FRAGMENT( pc1640_iga )
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
MCFG_SCREEN_UPDATE_DEVICE(DEVICE_SELF, isa8_pc1640_iga_device, screen_update)
MCFG_SCREEN_SIZE(80*8, 25*8)
MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 25*8-1)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_PALETTE_LENGTH(64)
MCFG_MC6845_ADD(PEGA1A_TAG, AMS40041, XTAL_28_63636MHz/32, crtc_intf)
MACHINE_CONFIG_END
//-------------------------------------------------
// machine_config_additions - device-specific
// machine configurations
//-------------------------------------------------
machine_config_constructor isa8_pc1640_iga_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( pc1640_iga );
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// isa8_pc1640_iga_device - constructor
//-------------------------------------------------
isa8_pc1640_iga_device::isa8_pc1640_iga_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, ISA8_PC1640_IGA, "Amstrad PC1640 IGA", tag, owner, clock, "pc1640_iga", __FILE__),
device_isa8_card_interface(mconfig, *this),
m_vdu(*this, PEGA1A_TAG),
m_video_ram(*this, "video_ram")
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void isa8_pc1640_iga_device::device_start()
{
set_isa_device();
m_isa->install_rom(this, 0xc0000, 0xc7fff, 0, 0, "iga", "iga");
m_isa->install_memory(0xa0000, 0xbffff, 0, 0, READ8_DELEGATE(isa8_pc1640_iga_device, video_ram_r), WRITE8_DELEGATE(isa8_pc1640_iga_device, video_ram_w));
m_isa->install_device(0x3b0, 0x3df, 0, 0, READ8_DELEGATE(isa8_pc1640_iga_device, iga_r), WRITE8_DELEGATE(isa8_pc1640_iga_device, iga_w));
// allocate memory
m_video_ram.allocate(0x20000);
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void isa8_pc1640_iga_device::device_reset()
{
}
//-------------------------------------------------
// video_ram_r -
//-------------------------------------------------
READ8_MEMBER( pc1640_state::video_ram_r )
READ8_MEMBER( isa8_pc1640_iga_device::video_ram_r )
{
UINT8 data = 0;
@ -47,7 +187,7 @@ READ8_MEMBER( pc1640_state::video_ram_r )
// video_ram_w -
//-------------------------------------------------
WRITE8_MEMBER( pc1640_state::video_ram_w )
WRITE8_MEMBER( isa8_pc1640_iga_device::video_ram_w )
{
if (BIT(m_egc_ctrl, 1))
{
@ -60,7 +200,7 @@ WRITE8_MEMBER( pc1640_state::video_ram_w )
// iga_r -
//-------------------------------------------------
READ8_MEMBER( pc1640_state::iga_r )
READ8_MEMBER( isa8_pc1640_iga_device::iga_r )
{
UINT8 data = 0;
@ -128,7 +268,7 @@ READ8_MEMBER( pc1640_state::iga_r )
*/
// switch sense
data |= BIT(m_sw->read(), ((m_egc_ctrl >> 2) & 0x03) ^ 0x03);
//data |= BIT(m_sw->read(), ((m_egc_ctrl >> 2) & 0x03) ^ 0x03);
break;
case 0x15: // Sequencer Data Register
@ -183,7 +323,7 @@ READ8_MEMBER( pc1640_state::iga_r )
// iga_w -
//-------------------------------------------------
WRITE8_MEMBER( pc1640_state::iga_w )
WRITE8_MEMBER( isa8_pc1640_iga_device::iga_w )
{
//logerror("IGA write %03x:%02x\n", offset+0x3b0, data);
@ -337,66 +477,3 @@ WRITE8_MEMBER( pc1640_state::iga_w )
break;
}
}
//-------------------------------------------------
// mc6845_interface crtc_intf
//-------------------------------------------------
static MC6845_UPDATE_ROW( pc1640_update_row )
{
}
static MC6845_INTERFACE( crtc_intf )
{
SCREEN_TAG,
false,
8,
NULL,
pc1640_update_row,
NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
NULL
};
//-------------------------------------------------
// VIDEO_START( pc1640 )s
//-------------------------------------------------
void pc1640_state::video_start()
{
// allocate memory
m_video_ram.allocate(0x20000);
}
//-------------------------------------------------
// SCREEN_UPDATE( pc1640 )
//-------------------------------------------------
UINT32 pc1640_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
return 0;
}
//-------------------------------------------------
// MACHINE_CONFIG( pc1640 )
//-------------------------------------------------
MACHINE_CONFIG_FRAGMENT( pc1640_video )
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
MCFG_SCREEN_UPDATE_DRIVER(pc1640_state, screen_update)
MCFG_SCREEN_SIZE(80*8, 25*8)
MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 25*8-1)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_PALETTE_LENGTH(64)
MCFG_MC6845_ADD(AMS40041_TAG, AMS40041, XTAL_28_63636MHz/32, crtc_intf)
MACHINE_CONFIG_END

View File

@ -0,0 +1,73 @@
/**********************************************************************
Amstrad PC1640 Integrated Graphics Adapter emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#pragma once
#ifndef __ISA8_PC1640_IGA__
#define __ISA8_PC1640_IGA__
#include "emu.h"
#include "machine/isa.h"
#include "video/mc6845.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> isa8_pc1640_iga_device
class isa8_pc1640_iga_device : public device_t,
public device_isa8_card_interface
{
public:
// construction/destruction
isa8_pc1640_iga_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;
DECLARE_READ8_MEMBER( video_ram_r );
DECLARE_WRITE8_MEMBER( video_ram_w );
DECLARE_READ8_MEMBER( iga_r );
DECLARE_WRITE8_MEMBER( iga_w );
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
private:
required_device<ams40041_device> m_vdu;
optional_shared_ptr<UINT8> m_video_ram;
int m_lpen;
UINT8 m_egc_ctrl;
UINT8 m_emcr; // extended mode control register
UINT8 m_emcrp; // extended mode control register protection read counter
UINT8 m_sar; // sequencer address register
UINT8 m_sdr[8]; // sequencer data registers
UINT8 m_gcar; // graphics controller address register
UINT8 m_gcdr[16]; // graphics controller data registers
UINT8 m_crtcar; // CRT controller address register
UINT8 m_crtcdr[32]; // CRT controller data registers
UINT8 m_plr; // Plantronics mode register
};
// device type definition
extern const device_type ISA8_PC1640_IGA;
#endif