From e6c0e41d89de48d540a9c2fef255cace58efba21 Mon Sep 17 00:00:00 2001 From: mahlemiut Date: Tue, 27 May 2014 06:49:38 +0000 Subject: [PATCH] vga_ati: added ATI mach64 ISA card. --- src/emu/bus/isa/isa_cards.c | 1 + src/emu/bus/isa/mach32.c | 73 +++++++++++++++++++++++++++- src/emu/bus/isa/mach32.h | 39 ++++++++++++++- src/emu/bus/isa/vga_ati.c | 95 +++++++++++++++++++++++++++++++++++++ src/emu/bus/isa/vga_ati.h | 22 +++++++++ 5 files changed, 228 insertions(+), 2 deletions(-) diff --git a/src/emu/bus/isa/isa_cards.c b/src/emu/bus/isa/isa_cards.c index 553d16cb855..4eae29e5cf5 100644 --- a/src/emu/bus/isa/isa_cards.c +++ b/src/emu/bus/isa/isa_cards.c @@ -91,4 +91,5 @@ SLOT_INTERFACE_START( pc_isa16_cards ) SLOT_INTERFACE("dms3d2kp", ISA16_DMS3D2KPRO) SLOT_INTERFACE("gfxultra", ISA16_VGA_GFXULTRA) SLOT_INTERFACE("gfxultrap", ISA16_SVGA_GFXULTRAPRO) + SLOT_INTERFACE("mach64", ISA16_SVGA_MACH64) SLOT_INTERFACE_END diff --git a/src/emu/bus/isa/mach32.c b/src/emu/bus/isa/mach32.c index 76e6669ff0e..b44949131d6 100644 --- a/src/emu/bus/isa/mach32.c +++ b/src/emu/bus/isa/mach32.c @@ -1,7 +1,7 @@ /* * mach32.c * - * Implementation of the ATi Mach32 video chip + * Implementation of the ATi mach32 and mach64 video chips * Based on ati_vga and mach8 * * Created on: 16/05/2014 @@ -11,6 +11,13 @@ const device_type ATIMACH32 = &device_creator; const device_type ATIMACH32_8514A = &device_creator; +const device_type ATIMACH64 = &device_creator; +const device_type ATIMACH64_8514A = &device_creator; + + +/* + * mach32 + */ // 8514/A device mach32_8514a_device::mach32_8514a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) @@ -71,3 +78,67 @@ void mach32_device::device_reset() { ati_vga_device::device_reset(); } + +/* + * mach64 + */ + +// 8514/A device +mach64_8514a_device::mach64_8514a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : mach32_8514a_device(mconfig, ATIMACH64_8514A, "ATi mach64 (2D acceleration module)", tag, owner, clock, "mach64_8514a", __FILE__) +{ +} + +mach64_8514a_device::mach64_8514a_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) + : mach32_8514a_device(mconfig, type, name, tag, owner, clock, shortname, source) +{ +} + + +// SVGA device +mach64_device::mach64_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : mach32_device(mconfig, ATIMACH64, "ATi mach64", tag, owner, clock, "mach64", __FILE__), + m_8514a(*this,"8514a") +{ +} + +mach64_device::mach64_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) + : mach32_device(mconfig, type, name, tag, owner, clock, shortname, source), + m_8514a(*this,"8514a") +{ +} + +static MACHINE_CONFIG_FRAGMENT( mach64_8514a ) + MCFG_DEVICE_ADD("8514a", ATIMACH64_8514A, 0) + MCFG_EEPROM_SERIAL_93C56_ADD("ati_eeprom") +MACHINE_CONFIG_END + +machine_config_constructor mach64_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( mach64_8514a ); +} + +void mach64_8514a_device::device_start() +{ + mach32_8514a_device::device_start(); + // 017h 68800-AX + // 177h 68800-LX + // 2F7h 68800-6 + // The 68800-3 appears to return 0 for this field (undocumented) + m_chip_ID = 0x0000; // value is unknown for mach64 + m_membounds = 0; +} + +void mach64_8514a_device::device_reset() +{ +} + +void mach64_device::device_start() +{ + mach32_device::device_start(); +} + +void mach64_device::device_reset() +{ + mach32_device::device_reset(); +} diff --git a/src/emu/bus/isa/mach32.h b/src/emu/bus/isa/mach32.h index cd92d822890..613acab07cf 100644 --- a/src/emu/bus/isa/mach32.h +++ b/src/emu/bus/isa/mach32.h @@ -112,7 +112,6 @@ public: DECLARE_READ16_MEMBER(ibm8514_pixel_xfer_r) { return m_8514a->ibm8514_pixel_xfer_r(space,offset,mem_mask); } DECLARE_WRITE16_MEMBER(ibm8514_pixel_xfer_w) { m_8514a->ibm8514_pixel_xfer_w(space,offset,data,mem_mask); } - // Mach32 specific handlers DECLARE_READ16_MEMBER(mach32_chipid_r) { return m_8514a->mach32_chipid_r(space,offset,mem_mask); } DECLARE_READ16_MEMBER(mach8_clksel_r) { return m_8514a->mach8_clksel_r(space,offset,mem_mask); } DECLARE_WRITE16_MEMBER(mach32_clksel_w) { m_8514a->mach32_clksel_w(space,offset,data,mem_mask); } // read only on the mach8 @@ -128,8 +127,46 @@ protected: private: }; +/* + * ATi mach64 + */ + +// 8514/A module of the Mach64 +class mach64_8514a_device : public mach32_8514a_device +{ +public: + // construction/destruction + mach64_8514a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + mach64_8514a_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); + +protected: + virtual void device_start(); + virtual void device_reset(); +}; + +// main SVGA device +class mach64_device : public mach32_device +{ +public: + // construction/destruction + mach64_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + mach64_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); + + required_device m_8514a; // provides accelerated 2D drawing, derived from the Mach8 device + + DECLARE_WRITE16_MEMBER(mach64_config1_w) { } // why does the mach64 BIOS write to these, they are read only on the mach32 and earlier + DECLARE_WRITE16_MEMBER(mach64_config2_w) { } + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + virtual machine_config_constructor device_mconfig_additions() const; +}; // device type definition extern const device_type ATIMACH32; extern const device_type ATIMACH32_8514A; +extern const device_type ATIMACH64; +extern const device_type ATIMACH64_8514A; #endif /* MACH32_H_ */ diff --git a/src/emu/bus/isa/vga_ati.c b/src/emu/bus/isa/vga_ati.c index 72537e34865..0b8496dc2be 100644 --- a/src/emu/bus/isa/vga_ati.c +++ b/src/emu/bus/isa/vga_ati.c @@ -7,6 +7,9 @@ * ATi Graphics Ultra Pro ISA Video card * - ATi 68800-3 (Mach32, combined VGA and 8514/A) * + * ATi mach64 ISA Video card + * - ATi 88800 (Mach64, combined VGA and 8514/A) + * * Created on: 9/09/2012 */ @@ -26,12 +29,18 @@ ROM_START( gfxultrp ) ROM_LOAD("gfxultrapro.bin", 0x00000, 0x8000, CRC(4e5effd7) SHA1(84ad3abf7653e4734bf39f5d5c8b88e74527e8ce) ) ROM_END +ROM_START( mach64 ) + ROM_REGION(0x8000,"mach64", 0) + ROM_LOAD("mach64.bin", 0x00000, 0x8000, CRC(1300aa8f) SHA1(dfc7f817900f125b89b0bda16fcb205f066a47fc) ) +ROM_END + //************************************************************************** // GLOBAL VARIABLES //************************************************************************** const device_type ISA16_VGA_GFXULTRA = &device_creator; const device_type ISA16_SVGA_GFXULTRAPRO = &device_creator; +const device_type ISA16_SVGA_MACH64 = &device_creator; static MACHINE_CONFIG_FRAGMENT( vga_ati ) MCFG_SCREEN_ADD("screen", RASTER) @@ -53,6 +62,16 @@ static MACHINE_CONFIG_FRAGMENT( vga_mach32 ) MCFG_DEVICE_ADD("vga", ATIMACH32, 0) MACHINE_CONFIG_END +static MACHINE_CONFIG_FRAGMENT( vga_mach64 ) + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_RAW_PARAMS(XTAL_25_1748MHz,900,0,640,526,0,480) + MCFG_SCREEN_UPDATE_DEVICE("vga", mach64_device, screen_update) + + MCFG_PALETTE_ADD("palette", 0x100) + + MCFG_DEVICE_ADD("vga", ATIMACH64, 0) +MACHINE_CONFIG_END + //------------------------------------------------- // machine_config_additions - device-specific // machine configurations @@ -68,6 +87,11 @@ machine_config_constructor isa16_vga_gfxultrapro_device::device_mconfig_addition return MACHINE_CONFIG_NAME( vga_mach32 ); } +machine_config_constructor isa16_vga_mach64_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( vga_mach64 ); +} + //------------------------------------------------- // rom_region - device-specific ROM region //------------------------------------------------- @@ -82,6 +106,11 @@ const rom_entry *isa16_vga_gfxultrapro_device::device_rom_region() const return ROM_NAME( gfxultrp ); } +const rom_entry *isa16_vga_mach64_device::device_rom_region() const +{ + return ROM_NAME( mach64 ); +} + //************************************************************************** // LIVE DEVICE //************************************************************************** @@ -102,11 +131,18 @@ isa16_vga_gfxultrapro_device::isa16_vga_gfxultrapro_device(const machine_config { } +isa16_vga_mach64_device::isa16_vga_mach64_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, ISA16_SVGA_MACH64, "ATi mach64 Card", tag, owner, clock, "mach64", __FILE__), + device_isa16_card_interface(mconfig, *this) +{ +} + //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- READ8_MEMBER(isa16_vga_gfxultra_device::input_port_0_r ) { return 0xff; } //return space.machine().root_device().ioport("IN0")->read(); } READ8_MEMBER(isa16_vga_gfxultrapro_device::input_port_0_r ) { return 0xff; } //return space.machine().root_device().ioport("IN0")->read(); } +READ8_MEMBER(isa16_vga_mach64_device::input_port_0_r ) { return 0xff; } //return space.machine().root_device().ioport("IN0")->read(); } void isa16_vga_gfxultra_device::device_start() { @@ -216,6 +252,61 @@ void isa16_vga_gfxultrapro_device::device_start() m_isa->install_memory(0xa0000, 0xbffff, 0, 0, read8_delegate(FUNC(mach32_device::mem_r),m_vga), write8_delegate(FUNC(mach32_device::mem_w),m_vga)); } +void isa16_vga_mach64_device::device_start() +{ + set_isa_device(); + + m_vga = subdevice("vga"); + + m_isa->install_rom(this, 0xc0000, 0xc7fff, 0, 0, "vga", "mach64"); + + m_isa->install_device(0x1ce, 0x1cf, 0, 0, read8_delegate(FUNC(mach64_device::ati_port_ext_r),m_vga), write8_delegate(FUNC(mach64_device::ati_port_ext_w),m_vga)); + m_isa->install16_device(0x2e8, 0x2eb, 0, 0, read16_delegate(FUNC(mach64_device::mach32_status_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_htotal_w),m_vga)); + m_isa->install_device(0x3b0, 0x3bf, 0, 0, read8_delegate(FUNC(mach64_device::port_03b0_r),m_vga), write8_delegate(FUNC(mach64_device::port_03b0_w),m_vga)); + m_isa->install_device(0x3c0, 0x3cf, 0, 0, read8_delegate(FUNC(mach64_device::port_03c0_r),m_vga), write8_delegate(FUNC(mach64_device::port_03c0_w),m_vga)); + m_isa->install_device(0x3d0, 0x3df, 0, 0, read8_delegate(FUNC(mach64_device::port_03d0_r),m_vga), write8_delegate(FUNC(mach64_device::port_03d0_w),m_vga)); + m_isa->install16_device(0x12e8, 0x12eb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_vtotal_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_vtotal_w),m_vga)); + m_isa->install16_device(0x12ec, 0x12ef, 0, 0, read16_delegate(FUNC(mach64_device::mach8_config1_r),m_vga), write16_delegate(FUNC(mach64_device::mach64_config1_w),m_vga)); + m_isa->install16_device(0x16e8, 0x16eb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_vdisp_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_vdisp_w),m_vga)); + m_isa->install16_device(0x16ec, 0x16ef, 0, 0, read16_delegate(FUNC(mach64_device::mach8_config2_r),m_vga), write16_delegate(FUNC(mach64_device::mach64_config2_w),m_vga)); + m_isa->install16_device(0x1ae8, 0x1aeb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_vsync_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_vsync_w),m_vga)); + m_isa->install16_device(0x26e8, 0x26eb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_htotal_r),m_vga),write16_delegate()); + m_isa->install16_device(0x2ee8, 0x2eeb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_subcontrol_r),m_vga),write16_delegate()); + m_isa->install16_device(0x42e8, 0x42eb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_substatus_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_subcontrol_w),m_vga)); + m_isa->install16_device(0x42ec, 0x42ef, 0, 0, read16_delegate(FUNC(mach64_device::mach32_mem_boundary_r),m_vga), write16_delegate(FUNC(mach64_device::mach32_mem_boundary_w),m_vga)); + m_isa->install16_device(0x4aec, 0x4aef, 0, 0, read16_delegate(FUNC(mach64_device::mach8_clksel_r),m_vga), write16_delegate(FUNC(mach64_device::mach32_clksel_w),m_vga)); + m_isa->install16_device(0x52e8, 0x52eb, 0, 0, read16_delegate(FUNC(mach64_device::mach8_ec0_r),m_vga), write16_delegate(FUNC(mach64_device::mach8_ec0_w),m_vga)); + m_isa->install16_device(0x52ec, 0x52ef, 0, 0, read16_delegate(FUNC(mach64_device::mach8_scratch0_r),m_vga), write16_delegate(FUNC(mach64_device::mach8_scratch0_w),m_vga)); + m_isa->install16_device(0x56e8, 0x56eb, 0, 0, read16_delegate(FUNC(mach64_device::mach8_ec1_r),m_vga), write16_delegate(FUNC(mach64_device::mach8_ec1_w),m_vga)); + m_isa->install16_device(0x56ec, 0x56ef, 0, 0, read16_delegate(FUNC(mach64_device::mach8_scratch0_r),m_vga), write16_delegate(FUNC(mach64_device::mach8_scratch0_w),m_vga)); + m_isa->install16_device(0x5ae8, 0x5aeb, 0, 0, read16_delegate(FUNC(mach64_device::mach8_ec2_r),m_vga), write16_delegate(FUNC(mach64_device::mach8_ec2_w),m_vga)); + m_isa->install16_device(0x5ee8, 0x5eeb, 0, 0, read16_delegate(FUNC(mach64_device::mach8_ec3_r),m_vga), write16_delegate(FUNC(mach64_device::mach8_ec3_w),m_vga)); + m_isa->install16_device(0x82e8, 0x82eb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_currenty_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_currenty_w),m_vga)); + m_isa->install16_device(0x86e8, 0x86eb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_currentx_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_currentx_w),m_vga)); + m_isa->install16_device(0x8ae8, 0x8aeb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_desty_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_desty_w),m_vga)); + m_isa->install16_device(0x8ee8, 0x8eeb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_destx_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_destx_w),m_vga)); + m_isa->install16_device(0x92e8, 0x92eb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_line_error_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_line_error_w),m_vga)); + m_isa->install16_device(0x96e8, 0x96eb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_width_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_width_w),m_vga)); + m_isa->install16_device(0x96ec, 0x96ef, 0, 0, read16_delegate(FUNC(mach64_device::mach8_bresenham_count_r),m_vga), write16_delegate(FUNC(mach64_device::mach8_bresenham_count_w),m_vga)); + m_isa->install16_device(0x9ae8, 0x9aeb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_gpstatus_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_cmd_w),m_vga)); + m_isa->install16_device(0x9aec, 0x9aef, 0, 0, read16_delegate(FUNC(mach64_device::mach8_ext_fifo_r),m_vga), write16_delegate(FUNC(mach64_device::mach8_linedraw_index_w),m_vga)); + m_isa->install16_device(0x9ee8, 0x9eeb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_ssv_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_ssv_w),m_vga)); + m_isa->install16_device(0xa2e8, 0xa2eb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_bgcolour_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_bgcolour_w),m_vga)); + m_isa->install16_device(0xa6e8, 0xa6eb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_fgcolour_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_fgcolour_w),m_vga)); + m_isa->install16_device(0xaae8, 0xaaeb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_write_mask_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_write_mask_w),m_vga)); + m_isa->install16_device(0xaee8, 0xaeeb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_read_mask_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_read_mask_w),m_vga)); + m_isa->install16_device(0xb6e8, 0xb6eb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_backmix_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_backmix_w),m_vga)); + m_isa->install16_device(0xbae8, 0xbaeb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_foremix_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_foremix_w),m_vga)); + m_isa->install16_device(0xbee8, 0xbeeb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_multifunc_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_multifunc_w),m_vga)); + m_isa->install16_device(0xe2e8, 0xe2eb, 0, 0, read16_delegate(FUNC(mach64_device::ibm8514_pixel_xfer_r),m_vga), write16_delegate(FUNC(mach64_device::ibm8514_pixel_xfer_w),m_vga)); + m_isa->install16_device(0xdaec, 0xdaef, 0, 0, read16_delegate(FUNC(mach64_device::mach8_sourcex_r),m_vga), write16_delegate(FUNC(mach64_device::mach8_ext_leftscissor_w),m_vga)); + m_isa->install16_device(0xdeec, 0xdeef, 0, 0, read16_delegate(FUNC(mach64_device::mach8_sourcey_r),m_vga), write16_delegate(FUNC(mach64_device::mach8_ext_topscissor_w),m_vga)); + m_isa->install16_device(0xfaec, 0xfaef, 0, 0, read16_delegate(FUNC(mach64_device::mach32_chipid_r),m_vga), write16_delegate()); + m_isa->install16_device(0xfeec, 0xfeef, 0, 0, read16_delegate(FUNC(mach64_device::mach8_linedraw_r),m_vga), write16_delegate(FUNC(mach64_device::mach8_linedraw_w),m_vga)); + + m_isa->install_memory(0xa0000, 0xbffff, 0, 0, read8_delegate(FUNC(mach64_device::mem_r),m_vga), write8_delegate(FUNC(mach64_device::mem_w),m_vga)); +} + //------------------------------------------------- // device_reset - device-specific reset //------------------------------------------------- @@ -227,3 +318,7 @@ void isa16_vga_gfxultra_device::device_reset() void isa16_vga_gfxultrapro_device::device_reset() { } + +void isa16_vga_mach64_device::device_reset() +{ +} diff --git a/src/emu/bus/isa/vga_ati.h b/src/emu/bus/isa/vga_ati.h index ced53e01b16..a71a651609e 100644 --- a/src/emu/bus/isa/vga_ati.h +++ b/src/emu/bus/isa/vga_ati.h @@ -64,10 +64,32 @@ private: mach32_device *m_vga; }; +class isa16_vga_mach64_device : + public device_t, + public device_isa16_card_interface +{ +public: + // construction/destruction + isa16_vga_mach64_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(input_port_0_r); +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); +private: + mach64_device *m_vga; +}; + // device type definition extern const device_type ISA16_VGA_GFXULTRA; extern const device_type ISA16_SVGA_GFXULTRAPRO; +extern const device_type ISA16_SVGA_MACH64; #endif /* ISA_VGA_ATI_H_ */