diff options
Diffstat (limited to 'src/devices/video/voodoo_pci.cpp')
-rw-r--r-- | src/devices/video/voodoo_pci.cpp | 175 |
1 files changed, 118 insertions, 57 deletions
diff --git a/src/devices/video/voodoo_pci.cpp b/src/devices/video/voodoo_pci.cpp index 10d88b058e4..e8f7dad1031 100644 --- a/src/devices/video/voodoo_pci.cpp +++ b/src/devices/video/voodoo_pci.cpp @@ -6,31 +6,32 @@ #include "screen.h" -MACHINE_CONFIG_START(voodoo_pci_device::device_add_mconfig) - switch (m_type) { - case TYPE_VOODOO_1: - MCFG_DEVICE_ADD("voodoo", VOODOO_1, STD_VOODOO_1_CLOCK) - MCFG_VOODOO_FBMEM(4) - MCFG_VOODOO_TMUMEM(1, 0) - break; - case TYPE_VOODOO_2: - MCFG_DEVICE_ADD("voodoo", VOODOO_2, STD_VOODOO_2_CLOCK) - MCFG_VOODOO_FBMEM(4) - MCFG_VOODOO_TMUMEM(1, 0) - break; - case TYPE_VOODOO_BANSHEE: - MCFG_DEVICE_ADD("voodoo", VOODOO_BANSHEE, STD_VOODOO_BANSHEE_CLOCK) - MCFG_VOODOO_FBMEM(16) - break; - //case TYPE_VOODOO_3 - default: - MCFG_DEVICE_ADD("voodoo", VOODOO_3, STD_VOODOO_3_CLOCK) - MCFG_VOODOO_FBMEM(16) - break;} +MACHINE_CONFIG_START(voodoo_1_pci_device::device_add_mconfig) + MCFG_DEVICE_ADD("voodoo", VOODOO_1, STD_VOODOO_1_CLOCK) + MCFG_VOODOO_FBMEM(4) + MCFG_VOODOO_TMUMEM(1, 0) +MACHINE_CONFIG_END + +MACHINE_CONFIG_START(voodoo_2_pci_device::device_add_mconfig) + MCFG_DEVICE_ADD("voodoo", VOODOO_2, STD_VOODOO_2_CLOCK) + MCFG_VOODOO_FBMEM(4) + MCFG_VOODOO_TMUMEM(1, 0) +MACHINE_CONFIG_END + +MACHINE_CONFIG_START(voodoo_banshee_pci_device::device_add_mconfig) + MCFG_DEVICE_ADD("voodoo", VOODOO_BANSHEE, STD_VOODOO_BANSHEE_CLOCK) + MCFG_VOODOO_FBMEM(16) MACHINE_CONFIG_END +MACHINE_CONFIG_START(voodoo_3_pci_device::device_add_mconfig) + MCFG_DEVICE_ADD("voodoo", VOODOO_3, STD_VOODOO_3_CLOCK) + MCFG_VOODOO_FBMEM(16) +MACHINE_CONFIG_END -DEFINE_DEVICE_TYPE(VOODOO_PCI, voodoo_pci_device, "voodoo_pci", "Voodoo PCI") +DEFINE_DEVICE_TYPE(VOODOO_1_PCI, voodoo_1_pci_device, "voodoo_1_pci", "Voodoo 1 PCI") +DEFINE_DEVICE_TYPE(VOODOO_2_PCI, voodoo_2_pci_device, "voodoo_2_pci", "Voodoo 2 PCI") +DEFINE_DEVICE_TYPE(VOODOO_BANSHEE_PCI, voodoo_banshee_pci_device, "voodoo_banshee_pci", "Voodoo Banshee PCI") +DEFINE_DEVICE_TYPE(VOODOO_3_PCI, voodoo_3_pci_device, "voodoo_3_pci", "Voodoo 3 PCI") void voodoo_pci_device::config_map(address_map &map) { @@ -59,12 +60,32 @@ void voodoo_pci_device::io_map(address_map &map) map(0x000, 0x0ff).rw("voodoo", FUNC(voodoo_banshee_device::banshee_io_r), FUNC(voodoo_banshee_device::banshee_io_w)); } -voodoo_pci_device::voodoo_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : pci_device(mconfig, VOODOO_PCI, tag, owner, clock), +voodoo_pci_device::voodoo_pci_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : pci_device(mconfig, type, tag, owner, clock), m_voodoo(*this, "voodoo"), m_cpu(*this, finder_base::DUMMY_TAG), m_screen(*this, finder_base::DUMMY_TAG), m_fbmem(2), m_tmumem0(0), m_tmumem1(0) { } +voodoo_1_pci_device::voodoo_1_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : voodoo_pci_device(mconfig, VOODOO_1_PCI, tag, owner, clock) +{ +} + +voodoo_2_pci_device::voodoo_2_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : voodoo_pci_device(mconfig, VOODOO_2_PCI, tag, owner, clock) +{ +} + +voodoo_banshee_pci_device::voodoo_banshee_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : voodoo_pci_device(mconfig, VOODOO_BANSHEE_PCI, tag, owner, clock) +{ +} + +voodoo_3_pci_device::voodoo_3_pci_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : voodoo_pci_device(mconfig, VOODOO_3_PCI, tag, owner, clock) +{ +} + void voodoo_pci_device::device_start() { if (m_cpu) @@ -73,38 +94,60 @@ void voodoo_pci_device::device_start() m_voodoo->set_screen(*m_screen); m_voodoo->set_fbmem(m_fbmem); m_voodoo->set_tmumem(m_tmumem0, m_tmumem1); - switch (m_type) { - //void set_ids(uint32_t main_id, uint8_t revision, uint32_t pclass, uint32_t subsystem_id); - case TYPE_VOODOO_1: - set_ids(0x121a0001, 0x02, 0x030000, 0x000000); - break; - case TYPE_VOODOO_2: - set_ids(0x121a0002, 0x02, 0x038000, 0x000000); - break; - case TYPE_VOODOO_BANSHEE: - set_ids(0x121a0003, 0x02, 0x030000, 0x000000); - break; - //case TYPE_VOODOO_3 - default: - set_ids(0x121a0005, 0x02, 0x030000, 0x000000); - break; - } pci_device::device_start(); - if (m_type<=TYPE_VOODOO_2) { - add_map(16*1024*1024, M_MEM | M_PREF, FUNC(voodoo_pci_device::voodoo_reg_map)); - bank_infos[0].adr = 0xff000000; - } else { - add_map(32*1024*1024, M_MEM, FUNC(voodoo_pci_device::banshee_reg_map)); - add_map(32*1024*1024, M_MEM, FUNC(voodoo_pci_device::lfb_map)); - add_map(256, M_IO, FUNC(voodoo_pci_device::io_map)); - bank_infos[0].adr = 0xf8000000; - bank_infos[1].adr = 0xf8000008; - bank_infos[2].adr = 0xfffffff0; - } save_item(NAME(m_pcictrl_reg)); machine().save().register_postload(save_prepost_delegate(FUNC(voodoo_pci_device::postload), this)); } +//void set_ids(uint32_t main_id, uint8_t revision, uint32_t pclass, uint32_t subsystem_id); +void voodoo_1_pci_device::device_start() +{ + set_ids(0x121a0001, 0x02, 0x030000, 0x000000); + + voodoo_pci_device::device_start(); + + add_map(16 * 1024 * 1024, M_MEM | M_PREF, FUNC(voodoo_pci_device::voodoo_reg_map)); + bank_infos[0].adr = 0xff000000; +} + +void voodoo_2_pci_device::device_start() +{ + set_ids(0x121a0002, 0x02, 0x038000, 0x000000); + + voodoo_pci_device::device_start(); + + add_map(16 * 1024 * 1024, M_MEM | M_PREF, FUNC(voodoo_pci_device::voodoo_reg_map)); + bank_infos[0].adr = 0xff000000; +} + +void voodoo_banshee_pci_device::device_start() +{ + set_ids(0x121a0003, 0x02, 0x030000, 0x000000); + + voodoo_pci_device::device_start(); + + add_map(32 * 1024 * 1024, M_MEM, FUNC(voodoo_pci_device::banshee_reg_map)); + add_map(32 * 1024 * 1024, M_MEM, FUNC(voodoo_pci_device::lfb_map)); + add_map(256, M_IO, FUNC(voodoo_pci_device::io_map)); + bank_infos[0].adr = 0xf8000000; + bank_infos[1].adr = 0xf8000008; + bank_infos[2].adr = 0xfffffff0; +} + +void voodoo_3_pci_device::device_start() +{ + set_ids(0x121a0005, 0x02, 0x030000, 0x000000); + + voodoo_pci_device::device_start(); + + add_map(32 * 1024 * 1024, M_MEM, FUNC(voodoo_pci_device::banshee_reg_map)); + add_map(32 * 1024 * 1024, M_MEM, FUNC(voodoo_pci_device::lfb_map)); + add_map(256, M_IO, FUNC(voodoo_pci_device::io_map)); + bank_infos[0].adr = 0xf8000000; + bank_infos[1].adr = 0xf8000008; + bank_infos[2].adr = 0xfffffff0; +} + void voodoo_pci_device::postload() { remap_cb(); @@ -120,14 +163,32 @@ void voodoo_pci_device::map_extra(uint64_t memory_window_start, uint64_t memory_ uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) { logerror("%s: map_extra\n", this->tag()); +} + +void voodoo_banshee_pci_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, + uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) +{ + logerror("%s: map_extra\n", this->tag()); + // Map VGA legacy access // Should really be dependent on voodoo VGAINIT0 bit 8 and IO base + 0xc3 bit 0 - if (m_type>=TYPE_VOODOO_BANSHEE) { - uint64_t start = io_offset + 0x3b0; - uint64_t end = io_offset + 0x3df; - io_space->install_readwrite_handler(start, end, read32_delegate(FUNC(voodoo_pci_device::vga_r), this), write32_delegate(FUNC(voodoo_pci_device::vga_w), this)); - logerror("%s: map %s at %0*x-%0*x\n", this->tag(), "vga_r/w", 4, uint32_t(start), 4, uint32_t(end)); - } + uint64_t start = io_offset + 0x3b0; + uint64_t end = io_offset + 0x3df; + io_space->install_readwrite_handler(start, end, read32_delegate(FUNC(voodoo_pci_device::vga_r), this), write32_delegate(FUNC(voodoo_pci_device::vga_w), this)); + logerror("%s: map %s at %0*x-%0*x\n", this->tag(), "vga_r/w", 4, uint32_t(start), 4, uint32_t(end)); +} + +void voodoo_3_pci_device::map_extra(uint64_t memory_window_start, uint64_t memory_window_end, uint64_t memory_offset, address_space *memory_space, + uint64_t io_window_start, uint64_t io_window_end, uint64_t io_offset, address_space *io_space) +{ + logerror("%s: map_extra\n", this->tag()); + + // Map VGA legacy access + // Should really be dependent on voodoo VGAINIT0 bit 8 and IO base + 0xc3 bit 0 + uint64_t start = io_offset + 0x3b0; + uint64_t end = io_offset + 0x3df; + io_space->install_readwrite_handler(start, end, read32_delegate(FUNC(voodoo_pci_device::vga_r), this), write32_delegate(FUNC(voodoo_pci_device::vga_w), this)); + logerror("%s: map %s at %0*x-%0*x\n", this->tag(), "vga_r/w", 4, uint32_t(start), 4, uint32_t(end)); } uint32_t voodoo_pci_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) |