summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--scripts/src/bus.lua2
-rw-r--r--scripts/src/video.lua13
-rw-r--r--src/devices/bus/isa/isa_cards.cpp2
-rw-r--r--src/devices/bus/isa/tiga_spea.cpp80
-rw-r--r--src/devices/bus/isa/tiga_spea.h44
-rw-r--r--src/devices/bus/pci/sis6326.cpp2
-rw-r--r--src/devices/video/pc_vga_tseng.cpp6
-rw-r--r--src/devices/video/pc_vga_tseng.h4
-rw-r--r--src/devices/video/pc_vga_video7.cpp109
-rw-r--r--src/devices/video/pc_vga_video7.h40
10 files changed, 295 insertions, 7 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index d0f18f5880d..8e4ffbae4ea 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -2949,6 +2949,8 @@ if BUSES["ISA"] then
MAME_DIR .. "src/devices/bus/isa/svga_tseng.h",
MAME_DIR .. "src/devices/bus/isa/tekram_dc820.cpp",
MAME_DIR .. "src/devices/bus/isa/tekram_dc820.h",
+ MAME_DIR .. "src/devices/bus/isa/tiga_spea.cpp",
+ MAME_DIR .. "src/devices/bus/isa/tiga_spea.h",
MAME_DIR .. "src/devices/bus/isa/ubpnic.cpp",
MAME_DIR .. "src/devices/bus/isa/ubpnic.h",
MAME_DIR .. "src/devices/bus/isa/ultra12f.cpp",
diff --git a/scripts/src/video.lua b/scripts/src/video.lua
index c5e8931c6ed..535113692f7 100644
--- a/scripts/src/video.lua
+++ b/scripts/src/video.lua
@@ -1173,6 +1173,19 @@ end
--------------------------------------------------
--
+--@src/devices/video/pc_vga_video7.h,VIDEOS["PC_VGA_VIDEO7"] = true
+--------------------------------------------------
+
+if VIDEOS["PC_VGA_VIDEO7"] then
+ files {
+ MAME_DIR .. "src/devices/video/pc_vga_video7.cpp",
+ MAME_DIR .. "src/devices/video/pc_vga_video7.h",
+ }
+end
+
+
+--------------------------------------------------
+--
--@src/devices/video/wd90c26.h,VIDEOS["WD90C26"] = true
--------------------------------------------------
diff --git a/src/devices/bus/isa/isa_cards.cpp b/src/devices/bus/isa/isa_cards.cpp
index 8a845e64eca..f16f94fda11 100644
--- a/src/devices/bus/isa/isa_cards.cpp
+++ b/src/devices/bus/isa/isa_cards.cpp
@@ -24,6 +24,7 @@
#include "svga_s3.h"
#include "svga_trident.h"
#include "svga_tseng.h"
+#include "tiga_spea.h"
#include "vga.h"
#include "vga_ati.h"
@@ -213,6 +214,7 @@ void pc_isa16_cards(device_slot_interface &device)
device.option_add("wd90c33_zz", ISA16_WD90C33_ZZ);
device.option_add("3c505", ISA16_3C505);
device.option_add("mach64", ISA16_SVGA_MACH64);
+ device.option_add("fga_4he", ISA16_FGA4HE);
device.option_add("sb16_lle", ISA16_SB16);
device.option_add("mcd", ISA16_MCD);
device.option_add("sad8852", ISA16_SAD8852);
diff --git a/src/devices/bus/isa/tiga_spea.cpp b/src/devices/bus/isa/tiga_spea.cpp
new file mode 100644
index 00000000000..516d0223d42
--- /dev/null
+++ b/src/devices/bus/isa/tiga_spea.cpp
@@ -0,0 +1,80 @@
+// license:BSD-3-Clause
+// copyright-holders: Angelo Salese
+/**************************************************************************************************
+
+Spea TIGA based video cards
+
+**************************************************************************************************/
+
+#include "emu.h"
+#include "tiga_spea.h"
+
+DEFINE_DEVICE_TYPE(ISA16_FGA4HE, isa16_fga4he_device, "fga4he", "SPEA Graphiti FGA 4/HE TIGA card")
+
+isa16_fga4he_device::isa16_fga4he_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ isa16_fga4he_device(mconfig, ISA16_FGA4HE, tag, owner, clock)
+{
+}
+
+isa16_fga4he_device::isa16_fga4he_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_isa16_card_interface(mconfig, *this)
+ , m_vga(*this, "vga")
+ , m_bios(*this, "bios")
+{
+}
+
+ROM_START( fga4he )
+ ROM_REGION(0x8000, "bios", 0)
+ ROM_SYSTEM_BIOS(0, "v219", "Video Seven v2.19 01/18/90")
+ ROMX_LOAD("spea_fga4he.vbi", 0x00000, 0x8000, CRC(ce472e63) SHA1(fe4bc168ad7ccb186a6f8158964e2116435c994b), ROM_BIOS(0) )
+ROM_END
+
+const tiny_rom_entry *isa16_fga4he_device::device_rom_region() const
+{
+ return ROM_NAME( fga4he );
+}
+
+void isa16_fga4he_device::device_add_mconfig(machine_config &config)
+{
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(25.175_MHz_XTAL, 800, 0, 640, 524, 0, 480);
+ screen.set_screen_update(m_vga, FUNC(vga_device::screen_update));
+
+ HT208_VIDEO7_VGA(config, m_vga, 0);
+ m_vga->set_screen("screen");
+ m_vga->set_vram_size(256*1024);
+// m_vga->setup_rom_bank_cb().set([this] (u8 data) { printf("%02x\n", data); });
+// m_vga->vsync_cb().set([this](int state) { m_isa->irq2_w(state); });
+
+ // TODO: TMS34020-32 + Bt459 + Spea "VEMU"
+ // 2MB VRAM + 4MB of DRAM, dual monitor with separate DB9 connector
+}
+
+void isa16_fga4he_device::device_start()
+{
+ set_isa_device();
+}
+
+void isa16_fga4he_device::device_reset()
+{
+ remap(AS_PROGRAM, 0, 0xfffff);
+ remap(AS_IO, 0, 0xffff);
+}
+
+void isa16_fga4he_device::remap(int space_id, offs_t start, offs_t end)
+{
+ if (space_id == AS_PROGRAM)
+ {
+ m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(vga_device::mem_w)));
+ m_isa->install_rom(this, 0xc0000, 0xc7fff, "bios");
+ }
+ else if (space_id == AS_IO)
+ m_isa->install_device(0x0000, 0xffff, *this, &isa16_fga4he_device::io_isa_map);
+}
+
+void isa16_fga4he_device::io_isa_map(address_map &map)
+{
+ map(0x03b0, 0x03df).m(m_vga, FUNC(ht208_video7_vga_device::io_map));
+ map(0x46e8, 0x46e8).w(m_vga, FUNC(ht208_video7_vga_device::mode_setup_w));
+}
diff --git a/src/devices/bus/isa/tiga_spea.h b/src/devices/bus/isa/tiga_spea.h
new file mode 100644
index 00000000000..9cbc9a82709
--- /dev/null
+++ b/src/devices/bus/isa/tiga_spea.h
@@ -0,0 +1,44 @@
+// license:BSD-3-Clause
+// copyright-holders: Angelo Salese
+
+#ifndef MAME_BUS_ISA_TIGA_SPEA_H
+#define MAME_BUS_ISA_TIGA_SPEA_H
+
+#pragma once
+
+#include "isa.h"
+#include "video/pc_vga_video7.h"
+
+class isa16_fga4he_device :
+ public device_t,
+ public device_isa16_card_interface
+{
+public:
+ isa16_fga4he_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // beyond Video7 issues: lacks actual TIGA section
+ static constexpr feature_type unemulated_features() { return feature::GRAPHICS; }
+
+protected:
+ isa16_fga4he_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
+ virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
+
+ void io_isa_map(address_map &map) ATTR_COLD;
+
+ virtual void remap(int space_id, offs_t start, offs_t end) override;
+
+private:
+ required_device<ht208_video7_vga_device> m_vga;
+ required_memory_region m_bios;
+};
+
+
+DECLARE_DEVICE_TYPE(ISA16_FGA4HE, isa16_fga4he_device)
+
+
+#endif // MAME_BUS_ISA_TIGA_SPEA_H
diff --git a/src/devices/bus/pci/sis6326.cpp b/src/devices/bus/pci/sis6326.cpp
index 332e93dc93c..484b60f0898 100644
--- a/src/devices/bus/pci/sis6326.cpp
+++ b/src/devices/bus/pci/sis6326.cpp
@@ -82,7 +82,7 @@ void sis6326_pci_device::device_start()
// INTA#
// TODO: VGA D3/MD27 can strap this to no irq pin
- // ls5amvp3 goes N/A, assume it's disabled by default
+ // ls5amvp3 goes N/A in Award Config list, assume it's disabled by default
intr_pin = 0;
}
diff --git a/src/devices/video/pc_vga_tseng.cpp b/src/devices/video/pc_vga_tseng.cpp
index 3ffeecf5161..41d843b8d3c 100644
--- a/src/devices/video/pc_vga_tseng.cpp
+++ b/src/devices/video/pc_vga_tseng.cpp
@@ -27,7 +27,7 @@
DEFINE_DEVICE_TYPE(TSENG_VGA, tseng_vga_device, "tseng_vga", "Tseng Labs ET4000AX VGA i/f")
DEFINE_DEVICE_TYPE(ET4KW32I_VGA, et4kw32i_vga_device, "et4kw32i_vga", "Tseng Labs ET4000/W32i TC6167HF VGA i/f")
-tseng_vga_device::tseng_vga_device(const machine_config &mconfig, const char *tag, device_type type, device_t *owner, uint32_t clock)
+tseng_vga_device::tseng_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: svga_device(mconfig, type, tag, owner, clock)
{
m_main_if_space_config = address_space_config("io_regs", ENDIANNESS_LITTLE, 8, 4, 0, address_map_constructor(FUNC(tseng_vga_device::io_3bx_3dx_map), this));
@@ -37,7 +37,7 @@ tseng_vga_device::tseng_vga_device(const machine_config &mconfig, const char *ta
}
tseng_vga_device::tseng_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : tseng_vga_device(mconfig, tag, TSENG_VGA, owner, clock)
+ : tseng_vga_device(mconfig, TSENG_VGA, tag, owner, clock)
{
}
@@ -375,7 +375,7 @@ uint32_t tseng_vga_device::latch_start_addr()
*************************************/
et4kw32i_vga_device::et4kw32i_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : tseng_vga_device(mconfig, tag, ET4KW32I_VGA, owner, clock)
+ : tseng_vga_device(mconfig, ET4KW32I_VGA, tag, owner, clock)
{
m_acl_space_config = address_space_config("acl_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(et4kw32i_vga_device::acl_map), this));
m_mmu_space_config = address_space_config("mmu_regs", ENDIANNESS_LITTLE, 8, 15, 0, address_map_constructor(FUNC(et4kw32i_vga_device::mmu_map), this));
diff --git a/src/devices/video/pc_vga_tseng.h b/src/devices/video/pc_vga_tseng.h
index f64ed95ce3f..0d24aeb23bb 100644
--- a/src/devices/video/pc_vga_tseng.h
+++ b/src/devices/video/pc_vga_tseng.h
@@ -8,8 +8,6 @@
#include "video/pc_vga.h"
-#include "screen.h"
-
class tseng_vga_device : public svga_device
{
@@ -23,7 +21,7 @@ public:
virtual void mem_w(offs_t offset, uint8_t data) override;
protected:
- tseng_vga_device(const machine_config &mconfig, const char *tag, device_type type, device_t *owner, uint32_t clock);
+ tseng_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
virtual void device_start() override ATTR_COLD;
diff --git a/src/devices/video/pc_vga_video7.cpp b/src/devices/video/pc_vga_video7.cpp
new file mode 100644
index 00000000000..273d5cf9ce7
--- /dev/null
+++ b/src/devices/video/pc_vga_video7.cpp
@@ -0,0 +1,109 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/**************************************************************************************************
+
+Video7 / Headland / SPEA (S)VGA chipsets
+
+TODO:
+- drops in MDA mode with IOAS = 1 (EGA switch or extended switch at $f7?)
+
+**************************************************************************************************/
+
+#include "emu.h"
+#include "pc_vga_video7.h"
+
+#define VERBOSE (LOG_GENERAL)
+//#define LOG_OUTPUT_FUNC osd_printf_info
+
+#include "logmacro.h"
+
+
+DEFINE_DEVICE_TYPE(HT208_VIDEO7_VGA, ht208_video7_vga_device, "ht208_video7_vga", "Headland HT208 VGA i/f")
+
+ht208_video7_vga_device::ht208_video7_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : svga_device(mconfig, type, tag, owner, clock)
+{
+ m_seq_space_config = address_space_config("sequencer_regs", ENDIANNESS_LITTLE, 8, 8, 0, address_map_constructor(FUNC(ht208_video7_vga_device::sequencer_map), this));
+}
+
+ht208_video7_vga_device::ht208_video7_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : ht208_video7_vga_device(mconfig, HT208_VIDEO7_VGA, tag, owner, clock)
+{
+}
+
+void ht208_video7_vga_device::device_start()
+{
+ svga_device::device_start();
+ zero();
+
+ vga.crtc.maximum_scan_line = 1;
+
+ save_item(NAME(m_seq_unlock_reg));
+ save_item(NAME(m_ext_b0_scratch));
+ save_item(NAME(m_ext_fbctrl));
+ save_item(NAME(m_ext_16bit));
+}
+
+void ht208_video7_vga_device::device_reset()
+{
+ svga_device::device_reset();
+
+ std::fill(std::begin(m_ext_b0_scratch), std::end(m_ext_b0_scratch), 0);
+ m_seq_unlock_reg = false;
+ m_ext_fbctrl = 0;
+ m_ext_16bit = 0;
+}
+
+void ht208_video7_vga_device::sequencer_map(address_map &map)
+{
+ svga_device::sequencer_map(map);
+ map(0x08, 0xff).unmaprw();
+
+ map(0x06, 0x06).lrw8(
+ NAME([this] (offs_t offset) {
+ // xxxx xxx- <unused>
+ // ---- ---x unlocked if '1'
+ return m_seq_unlock_reg;
+ }),
+ NAME([this] (offs_t offset, u8 data) {
+ // TODO: log & actual space unlock
+ if (data == 0xea)
+ m_seq_unlock_reg = true;
+ if (data == 0xae)
+ m_seq_unlock_reg = false;
+ })
+ );
+
+ map(0xa4, 0xa4).lrw8(
+ NAME([this] (offs_t offset) { return m_ext_clock_select; }),
+ NAME([this] (offs_t offset, u8 data) {
+ LOG("ERA4: Clock Select %02x\n", data);
+ m_ext_clock_select = data;
+ })
+ );
+ map(0xb0, 0xbf).lrw8(
+ NAME([this] (offs_t offset) { return m_ext_b0_scratch[offset]; }),
+ NAME([this] (offs_t offset, u8 data) {
+ m_ext_b0_scratch[offset] = data;
+ })
+ );
+
+ map(0xf7, 0xf7).lr8(
+ NAME([] (offs_t offset) { return 0; })
+ );
+
+ map(0xfe, 0xfe).lrw8(
+ NAME([this] (offs_t offset) { return m_ext_fbctrl; }),
+ NAME([this] (offs_t offset, u8 data) {
+ LOG("ERFE: Foreground/Background Control %02x\n", data);
+ m_ext_fbctrl = data;
+ })
+ );
+ map(0xff, 0xff).lrw8(
+ NAME([this] (offs_t offset) { return m_ext_16bit; }),
+ NAME([this] (offs_t offset, u8 data) {
+ LOG("ERFF: 16-bit i/f Control %02x\n", data);
+ m_ext_16bit = data;
+ })
+ );
+}
diff --git a/src/devices/video/pc_vga_video7.h b/src/devices/video/pc_vga_video7.h
new file mode 100644
index 00000000000..8c9c2325be7
--- /dev/null
+++ b/src/devices/video/pc_vga_video7.h
@@ -0,0 +1,40 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+
+#ifndef MAME_VIDEO_PC_VGA_VIDEO7_H
+#define MAME_VIDEO_PC_VGA_VIDEO7_H
+
+#pragma once
+
+#include "video/pc_vga.h"
+
+class ht208_video7_vga_device : public svga_device
+{
+public:
+ ht208_video7_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // black screen, several missing features
+ static constexpr feature_type unemulated_features() { return feature::GRAPHICS; }
+
+protected:
+ ht208_video7_vga_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+
+ virtual void sequencer_map(address_map &map) override ATTR_COLD;
+
+private:
+ bool m_seq_unlock_reg;
+
+ u8 m_ext_b0_scratch[16];
+
+ u8 m_ext_clock_select;
+ u8 m_ext_fbctrl;
+ u8 m_ext_16bit;
+};
+
+DECLARE_DEVICE_TYPE(HT208_VIDEO7_VGA, ht208_video7_vga_device)
+
+
+#endif // MAME_VIDEO_PC_VGA_VIDEO7_H