From 1420684c858bb4d77102a7b3f96b5230600e97b1 Mon Sep 17 00:00:00 2001 From: angelosa Date: Tue, 11 Jul 2023 22:28:11 +0200 Subject: [PATCH] isa/svga_paradise.cpp: add WD90C31-LR, WD90C31A_LR, WD90C31A_ZS, W90C33_ZZ ISA cards --- src/devices/bus/isa/isa_cards.cpp | 4 + src/devices/bus/isa/svga_paradise.cpp | 240 ++++++++++++++++++++++++-- src/devices/bus/isa/svga_paradise.h | 92 ++++++++++ 3 files changed, 326 insertions(+), 10 deletions(-) diff --git a/src/devices/bus/isa/isa_cards.cpp b/src/devices/bus/isa/isa_cards.cpp index 461fdc97d31..25122a59579 100644 --- a/src/devices/bus/isa/isa_cards.cpp +++ b/src/devices/bus/isa/isa_cards.cpp @@ -225,6 +225,10 @@ void pc_isa16_cards(device_slot_interface &device) device.option_add("wd90c00_jk", ISA16_WD90C00_JK); device.option_add("wd90c11_lr", ISA16_WD90C11_LR); device.option_add("wd90c30_lr", ISA16_WD90C30_LR); + device.option_add("wd90c31_lr", ISA16_WD90C31_LR); + device.option_add("wd90c31a_lr", ISA16_WD90C31A_LR); + device.option_add("wd90c31a_zs", ISA16_WD90C31A_ZS); + device.option_add("wd90c33_zz", ISA16_WD90C33_ZZ); device.option_add("3c505", ISA16_3C505); device.option_add("mach64", ISA16_SVGA_MACH64); device.option_add("sb16_lle", ISA16_SB16); diff --git a/src/devices/bus/isa/svga_paradise.cpp b/src/devices/bus/isa/svga_paradise.cpp index abccda6ca06..fcdc64588bf 100644 --- a/src/devices/bus/isa/svga_paradise.cpp +++ b/src/devices/bus/isa/svga_paradise.cpp @@ -26,13 +26,18 @@ TODO: #include "screen.h" // TODO: some of these are also ISA8 -DEFINE_DEVICE_TYPE(ISA16_PVGA1A, isa16_pvga1a_device, "pvga1a", "Paradise Systems PVGA1A Graphics Card") -DEFINE_DEVICE_TYPE(ISA16_PVGA1A_JK, isa16_pvga1a_jk_device, "pvga1a_jk", "Paradise Systems PVGA1A-JK Graphics Card") -DEFINE_DEVICE_TYPE(ISA8_WD90C90_JK, isa8_wd90c90_jk_device, "wd90c90_jk", "Western Digital WD90C90-JK Graphics Card") -DEFINE_DEVICE_TYPE(ISA16_WD90C00_JK, isa16_wd90c00_jk_device, "wd90c00_jk", "Western Digital WD90C00-JK Graphics Card") -DEFINE_DEVICE_TYPE(ISA16_WD90C11_LR, isa16_wd90c11_lr_device, "wd90c11_lr", "Western Digital WD90C11-LR Graphics Card \"1024 CX\"") -DEFINE_DEVICE_TYPE(ISA16_WD90C30_LR, isa16_wd90c30_lr_device, "wd90c30_lr", "Western Digital WD90C30-LR Graphics Card \"1024 DX\"") - +DEFINE_DEVICE_TYPE(ISA16_PVGA1A, isa16_pvga1a_device, "pvga1a", "Paradise Systems PVGA1A Graphics Card") +DEFINE_DEVICE_TYPE(ISA16_PVGA1A_JK, isa16_pvga1a_jk_device, "pvga1a_jk", "Paradise Systems PVGA1A-JK Graphics Card") +DEFINE_DEVICE_TYPE(ISA8_WD90C90_JK, isa8_wd90c90_jk_device, "wd90c90_jk", "Western Digital WD90C90-JK Graphics Card") +DEFINE_DEVICE_TYPE(ISA16_WD90C00_JK, isa16_wd90c00_jk_device, "wd90c00_jk", "Western Digital WD90C00-JK Graphics Card") +DEFINE_DEVICE_TYPE(ISA16_WD90C11_LR, isa16_wd90c11_lr_device, "wd90c11_lr", "Western Digital WD90C11-LR Graphics Card \"1024 CX\"") +DEFINE_DEVICE_TYPE(ISA16_WD90C30_LR, isa16_wd90c30_lr_device, "wd90c30_lr", "Western Digital WD90C30-LR Graphics Card \"1024 DX\"") +DEFINE_DEVICE_TYPE(ISA16_WD90C31_LR, isa16_wd90c31_lr_device, "wd90c31_lr", "Western Digital WD90C31-LR Graphics Card") +DEFINE_DEVICE_TYPE(ISA16_WD90C31A_LR, isa16_wd90c31a_lr_device, "wd90c31a_lr", "Western Digital WD90C31A-LR Graphics Card") +//DEFINE_DEVICE_TYPE(ISA16_WD90C31_ZS, isa16_wd90c31_zs_device, "wd90c31_zs", "Western Digital WD90C31-ZS Graphics Card") +DEFINE_DEVICE_TYPE(ISA16_WD90C31A_ZS, isa16_wd90c31a_zs_device, "wd90c31a_zs", "Western Digital WD90C31A-ZS Graphics Card") +// TODO: Also VL-Bus +DEFINE_DEVICE_TYPE(ISA16_WD90C33_ZZ, isa16_wd90c33_zz_device, "wd90c33_zz", "Western Digital WD90C33-ZZ Graphics Card") isa16_pvga1a_device::isa16_pvga1a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, ISA16_PVGA1A, tag, owner, clock), @@ -289,7 +294,7 @@ void isa16_wd90c11_lr_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("vga", FUNC(wd90c00_vga_device::screen_update)); + screen.set_screen_update("vga", FUNC(wd90c11a_vga_device::screen_update)); WD90C11A(config, m_vga, 0); m_vga->set_screen("screen"); @@ -308,7 +313,7 @@ void isa16_wd90c11_lr_device::device_start() m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom"); - m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c00_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c00_vga_device::mem_w))); + m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c11a_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c11a_vga_device::mem_w))); m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c11_lr_device::io_isa_map); } @@ -340,7 +345,7 @@ void isa16_wd90c30_lr_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("vga", FUNC(wd90c00_vga_device::screen_update)); + screen.set_screen_update("vga", FUNC(wd90c30_vga_device::screen_update)); WD90C30(config, m_vga, 0); m_vga->set_screen("screen"); @@ -362,3 +367,218 @@ void isa16_wd90c30_lr_device::device_start() m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c30_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c30_vga_device::mem_w))); m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c30_lr_device::io_isa_map); } + +/****************** + * + * WD90C31-LR + * + *****************/ + +isa16_wd90c31_lr_device::isa16_wd90c31_lr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, ISA16_WD90C31_LR, tag, owner, clock), + device_isa16_card_interface(mconfig, *this), + m_vga(*this, "vga") +{ +} + +ROM_START( wd90c31_lr ) + ROM_REGION(0x8000,"vga_rom", ROMREGION_ERASE00) + ROM_SYSTEM_BIOS(0, "wdxlr831", "Western Digital WD90C31-LR") + ROMX_LOAD( "62-003259-800.bin", 0x000001, 0x004000, CRC(e71090bd) SHA1(f784ebc14801a0944271aab9ba4746dd9d0e001d), ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "62-003260-800.bin", 0x000000, 0x004000, CRC(1e66af70) SHA1(7f236d6acb34d07480584d51f6bb57836ff262c4), ROM_SKIP(1) |ROM_BIOS(0) ) +ROM_END + +const tiny_rom_entry *isa16_wd90c31_lr_device::device_rom_region() const +{ + return ROM_NAME( wd90c31_lr ); +} + +void isa16_wd90c31_lr_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("vga", FUNC(wd90c30_vga_device::screen_update)); + + // TODO: WD90C31 + WD90C30(config, m_vga, 0); + m_vga->set_screen("screen"); + // 512KB, 1MB + m_vga->set_vram_size(0x100000); +} + +void isa16_wd90c31_lr_device::io_isa_map(address_map &map) +{ + map(0x00, 0x2f).m(m_vga, FUNC(wd90c30_vga_device::io_map)); +} + +void isa16_wd90c31_lr_device::device_start() +{ + set_isa_device(); + + m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom"); + + m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c30_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c30_vga_device::mem_w))); + m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c31_lr_device::io_isa_map); +} + + +/****************** + * + * WD90C31A-LR + * + *****************/ + +isa16_wd90c31a_lr_device::isa16_wd90c31a_lr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, ISA16_WD90C31A_LR, tag, owner, clock), + device_isa16_card_interface(mconfig, *this), + m_vga(*this, "vga") +{ +} + +ROM_START( wd90c31a_lr ) + ROM_REGION(0x8000,"vga_rom", ROMREGION_ERASE00) + ROM_SYSTEM_BIOS(0, "speed24x", "Diamond Speedstar 24x (Vers. 1.04)") + ROMX_LOAD( "wd90c31alrdiamondspeedstar24x2.bin", 0x000000, 0x008000, CRC(578cb3c3) SHA1(ca7d871f9589eb06ace8075dd2d87a59bd191744), ROM_BIOS(0) ) +// "wd90c31alrdiamondspeedstar24x1.bin" identical to above + ROM_SYSTEM_BIOS(1, "wd90c31a_lr", "Western Digital WD90C31A-LR") + ROMX_LOAD( "bios.bin", 0x000000, 0x008000, CRC(cdc4c32e) SHA1(52ed7b8301ec5ebab0d87bab8cddd9cc8612e2ab), ROM_BIOS(1) ) + ROM_IGNORE( 0x8000 ) +ROM_END + +const tiny_rom_entry *isa16_wd90c31a_lr_device::device_rom_region() const +{ + return ROM_NAME( wd90c31a_lr ); +} + +void isa16_wd90c31a_lr_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("vga", FUNC(wd90c00_vga_device::screen_update)); + + // TODO: WD90C31A + WD90C30(config, m_vga, 0); + m_vga->set_screen("screen"); + // 512KB, 1MB + m_vga->set_vram_size(0x100000); +} + +void isa16_wd90c31a_lr_device::io_isa_map(address_map &map) +{ + map(0x00, 0x2f).m(m_vga, FUNC(wd90c30_vga_device::io_map)); +} + +void isa16_wd90c31a_lr_device::device_start() +{ + set_isa_device(); + + m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom"); + + m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c30_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c30_vga_device::mem_w))); + m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c31a_lr_device::io_isa_map); +} + +/****************** + * + * WD90C31A-ZS + * + *****************/ + +isa16_wd90c31a_zs_device::isa16_wd90c31a_zs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, ISA16_WD90C31A_ZS, tag, owner, clock), + device_isa16_card_interface(mconfig, *this), + m_vga(*this, "vga") +{ +} + +ROM_START( wd90c31a_zs ) + ROM_REGION(0x8000,"vga_rom", ROMREGION_ERASE00) + ROM_SYSTEM_BIOS(0, "wd90c31a_zs", "Western Digital WD90C31A-ZS") + ROM_LOAD( "wd90c31azs.bin", 0x000000, 0x008000, CRC(521db1dd) SHA1(52cefcc9a1b7374c7414bb93a7805207ba5b7fe3) ) +ROM_END + +const tiny_rom_entry *isa16_wd90c31a_zs_device::device_rom_region() const +{ + return ROM_NAME( wd90c31a_zs ); +} + +void isa16_wd90c31a_zs_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("vga", FUNC(wd90c00_vga_device::screen_update)); + + // TODO: WD90C31A + WD90C30(config, m_vga, 0); + m_vga->set_screen("screen"); + // 512KB, 1MB + m_vga->set_vram_size(0x100000); +} + +void isa16_wd90c31a_zs_device::io_isa_map(address_map &map) +{ + map(0x00, 0x2f).m(m_vga, FUNC(wd90c30_vga_device::io_map)); +} + +void isa16_wd90c31a_zs_device::device_start() +{ + set_isa_device(); + + m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom"); + + m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c30_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c30_vga_device::mem_w))); + m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c31a_zs_device::io_isa_map); +} + +/****************** + * + * WD90C33-ZZ + * + *****************/ + +isa16_wd90c33_zz_device::isa16_wd90c33_zz_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, ISA16_WD90C33_ZZ, tag, owner, clock), + device_isa16_card_interface(mconfig, *this), + m_vga(*this, "vga") +{ +} + +ROM_START( wd90c33_zz ) + ROM_REGION(0x8000,"vga_rom", ROMREGION_ERASE00) + ROM_SYSTEM_BIOS(0, "wd90c33_zz", "Western Digital WD90C33-ZZ") + ROM_LOAD( "bios.bin", 0x000000, 0x008000, CRC(b719d557) SHA1(0f93213ed439059d23e0793478793ffd6188ce12) ) + ROM_IGNORE( 0x8000 ) +ROM_END + +const tiny_rom_entry *isa16_wd90c33_zz_device::device_rom_region() const +{ + return ROM_NAME( wd90c33_zz ); +} + +void isa16_wd90c33_zz_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("vga", FUNC(wd90c30_vga_device::screen_update)); + + // TODO: WD90C33 + WD90C30(config, m_vga, 0); + m_vga->set_screen("screen"); + // 1MB, 2MB + m_vga->set_vram_size(0x100000); +} + +void isa16_wd90c33_zz_device::io_isa_map(address_map &map) +{ + map(0x00, 0x2f).m(m_vga, FUNC(wd90c30_vga_device::io_map)); +} + +void isa16_wd90c33_zz_device::device_start() +{ + set_isa_device(); + + m_isa->install_rom(this, 0xc0000, 0xc7fff, "vga_rom"); + + m_isa->install_memory(0xa0000, 0xbffff, read8sm_delegate(*m_vga, FUNC(wd90c30_vga_device::mem_r)), write8sm_delegate(*m_vga, FUNC(wd90c30_vga_device::mem_w))); + m_isa->install_device(0x03b0, 0x03df, *this, &isa16_wd90c33_zz_device::io_isa_map); +} diff --git a/src/devices/bus/isa/svga_paradise.h b/src/devices/bus/isa/svga_paradise.h index 7e34e1d2389..0e8b5ff6336 100644 --- a/src/devices/bus/isa/svga_paradise.h +++ b/src/devices/bus/isa/svga_paradise.h @@ -145,6 +145,94 @@ private: required_device m_vga; }; +class isa16_wd90c31_lr_device : + public device_t, + public device_isa16_card_interface +{ +public: + // construction/destruction + isa16_wd90c31_lr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device-level overrides + virtual void device_start() override; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + + void io_isa_map(address_map &map); + +private: + required_device m_vga; +}; + +class isa16_wd90c31a_lr_device : + public device_t, + public device_isa16_card_interface +{ +public: + // construction/destruction + isa16_wd90c31a_lr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device-level overrides + virtual void device_start() override; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + + void io_isa_map(address_map &map); + +private: + required_device m_vga; +}; + +class isa16_wd90c31a_zs_device : + public device_t, + public device_isa16_card_interface +{ +public: + // construction/destruction + isa16_wd90c31a_zs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device-level overrides + virtual void device_start() override; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + + void io_isa_map(address_map &map); + +private: + required_device m_vga; +}; + +class isa16_wd90c33_zz_device : + public device_t, + public device_isa16_card_interface +{ +public: + // construction/destruction + isa16_wd90c33_zz_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device-level overrides + virtual void device_start() override; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + + void io_isa_map(address_map &map); + +private: + required_device m_vga; +}; + // device type definition DECLARE_DEVICE_TYPE(ISA16_PVGA1A, isa16_pvga1a_device) DECLARE_DEVICE_TYPE(ISA16_PVGA1A_JK, isa16_pvga1a_jk_device) @@ -152,6 +240,10 @@ DECLARE_DEVICE_TYPE(ISA8_WD90C90_JK, isa8_wd90c90_jk_device) DECLARE_DEVICE_TYPE(ISA16_WD90C00_JK, isa16_wd90c00_jk_device) DECLARE_DEVICE_TYPE(ISA16_WD90C11_LR, isa16_wd90c11_lr_device) DECLARE_DEVICE_TYPE(ISA16_WD90C30_LR, isa16_wd90c30_lr_device) +DECLARE_DEVICE_TYPE(ISA16_WD90C31_LR, isa16_wd90c31_lr_device) +DECLARE_DEVICE_TYPE(ISA16_WD90C31A_LR, isa16_wd90c31a_lr_device) +DECLARE_DEVICE_TYPE(ISA16_WD90C31A_ZS, isa16_wd90c31a_zs_device) +DECLARE_DEVICE_TYPE(ISA16_WD90C33_ZZ, isa16_wd90c33_zz_device) #endif // MAME_BUS_ISA_SVGA_PARADISE_H