diff options
| -rw-r--r-- | scripts/src/bus.lua | 2 | ||||
| -rw-r--r-- | scripts/src/video.lua | 13 | ||||
| -rw-r--r-- | src/devices/bus/isa/isa_cards.cpp | 2 | ||||
| -rw-r--r-- | src/devices/bus/isa/tiga_spea.cpp | 80 | ||||
| -rw-r--r-- | src/devices/bus/isa/tiga_spea.h | 44 | ||||
| -rw-r--r-- | src/devices/bus/pci/sis6326.cpp | 2 | ||||
| -rw-r--r-- | src/devices/video/pc_vga_tseng.cpp | 6 | ||||
| -rw-r--r-- | src/devices/video/pc_vga_tseng.h | 4 | ||||
| -rw-r--r-- | src/devices/video/pc_vga_video7.cpp | 109 | ||||
| -rw-r--r-- | src/devices/video/pc_vga_video7.h | 40 |
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 |
