video/pc_xga: move OAK VGA core to standalone pc_vga_oak file

This commit is contained in:
angelosa 2024-02-12 19:13:06 +01:00
parent 0636e54bb6
commit f68a0c03e6
8 changed files with 153 additions and 118 deletions

View File

@ -941,6 +941,18 @@ if (VIDEOS["WD90C26"]~=null) then
}
end
--------------------------------------------------
--
--@src/devices/video/pc_vga_oak.h,VIDEOS["PC_VGA_OAK"] = true
--------------------------------------------------
if (VIDEOS["PC_VGA_OAK"]~=null) then
files {
MAME_DIR .. "src/devices/video/pc_vga_oak.cpp",
MAME_DIR .. "src/devices/video/pc_vga_oak.h",
}
end
--------------------------------------------------
--
--@src/devices/video/pc_vga_s3.h,VIDEOS["PC_VGA_S3"] = true

View File

@ -104,7 +104,7 @@ void oti64111_pci_device::mmio_map(address_map &map)
void oti64111_pci_device::vram_aperture_map(address_map &map)
{
// map(0x000000, 0x7fffff).rw(m_svga, FUNC(oak_oti111_vga_device::mem_linear_r), FUNC(oak_oti111_vga_device::mem_linear_w));
map(0x000000, 0x7fffff).rw(m_svga, FUNC(oak_oti111_vga_device::mem_linear_r), FUNC(oak_oti111_vga_device::mem_linear_w));
}
void oti64111_pci_device::extio_map(address_map &map)

View File

@ -7,7 +7,7 @@
#pragma once
#include "pci_slot.h"
#include "video/pc_xga.h"
#include "video/pc_vga_oak.h"
class oti64111_pci_device : public pci_card_device
{

View File

@ -0,0 +1,102 @@
// license:BSD-3-Clause
// copyright-holders: Carl, Angelo Salese
#include "emu.h"
#include "pc_vga_oak.h"
#define VERBOSE (LOG_GENERAL)
#include "logmacro.h"
DEFINE_DEVICE_TYPE(OTI111, oak_oti111_vga_device, "oti111_vga", "Oak Technologies Spitfire 64111")
oak_oti111_vga_device::oak_oti111_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: svga_device(mconfig, OTI111, tag, owner, clock)
, m_xga(*this, "xga")
{
m_main_if_space_config = address_space_config("io_regs", ENDIANNESS_LITTLE, 8, 4, 0, address_map_constructor(FUNC(oak_oti111_vga_device::io_3bx_3dx_map), this));
}
void oak_oti111_vga_device::device_add_mconfig(machine_config &config)
{
XGA_COPRO(config, m_xga, 0);
m_xga->mem_read_callback().set(FUNC(oak_oti111_vga_device::mem_linear_r));
m_xga->mem_write_callback().set(FUNC(oak_oti111_vga_device::mem_linear_w));
m_xga->set_type(xga_copro_device::TYPE::OTI111);
}
void oak_oti111_vga_device::io_3bx_3dx_map(address_map &map)
{
svga_device::io_3bx_3dx_map(map);
// TODO: convert to address_space
map(0x0e, 0xe).lrw8(
NAME([this] (offs_t offset) {
return m_oak_idx;
}),
NAME([this] (offs_t offset, u8 data) {
m_oak_idx = data;
})
);
map(0x0f, 0xf).lrw8(
NAME([this] (offs_t offset) {
return m_oak_idx <= 0x3a ? m_oak_regs[m_oak_idx] : space().unmap();
}),
NAME([this] (offs_t offset, u8 data) {
m_oak_regs[m_oak_idx] = data;
switch(m_oak_idx)
{
case 0x21:
svga.rgb8_en = BIT(data, 2);
break;
case 0x33:
vga.crtc.no_wrap = BIT(data, 0);
break;
}
})
);
}
// TODO: convert to map
u8 oak_oti111_vga_device::xga_read(offs_t offset)
{
switch(offset)
{
case 0x13: //fifo status
return 0xf;
default:
return m_xga->xga_read(offset);
}
return 0;
}
void oak_oti111_vga_device::xga_write(offs_t offset, u8 data)
{
m_xga->xga_write(offset, data);
}
void oak_oti111_vga_device::device_start()
{
svga_device::device_start();
std::fill(std::begin(m_oak_regs), std::end(m_oak_regs), 0);
}
void oak_oti111_vga_device::ramdac_mmio_map(address_map &map)
{
map.unmap_value_high();
// TODO: 0x04, 0x05 alt accesses for CRTC?
map(0x06, 0x06).rw(FUNC(oak_oti111_vga_device::ramdac_mask_r), FUNC(oak_oti111_vga_device::ramdac_mask_w));
map(0x07, 0x07).rw(FUNC(oak_oti111_vga_device::ramdac_state_r), FUNC(oak_oti111_vga_device::ramdac_read_index_w));
map(0x08, 0x08).rw(FUNC(oak_oti111_vga_device::ramdac_write_index_r), FUNC(oak_oti111_vga_device::ramdac_write_index_w));
map(0x09, 0x09).rw(FUNC(oak_oti111_vga_device::ramdac_data_r), FUNC(oak_oti111_vga_device::ramdac_data_w));
}
uint16_t oak_oti111_vga_device::offset()
{
uint16_t off = svga_device::offset();
if (svga.rgb8_en || svga.rgb15_en || svga.rgb16_en || svga.rgb32_en)
return vga.crtc.offset << 4; // TODO: there must a register to control this
else
return off;
}

View File

@ -0,0 +1,36 @@
// license:BSD-3-Clause
// copyright-holders: Carl, Angelo Salese
#ifndef MAME_VIDEO_PC_VGA_OAK_H
#define MAME_VIDEO_PC_VGA_OAK_H
#include "pc_vga.h"
#include "pc_xga.h"
#include "screen.h"
class oak_oti111_vga_device : public svga_device
{
public:
oak_oti111_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
u8 xga_read(offs_t offset);
void xga_write(offs_t offset, u8 data);
void ramdac_mmio_map(address_map &map);
protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual void device_start() override;
virtual uint16_t offset() override;
virtual void io_3bx_3dx_map(address_map &map) override;
private:
u8 m_oak_regs[0x3b];
u8 m_oak_idx;
required_device<xga_copro_device> m_xga;
};
DECLARE_DEVICE_TYPE(OTI111, oak_oti111_vga_device)
#endif // MAME_VIDEO_PC_VGA_OAK_H

View File

@ -9,7 +9,6 @@
#include "logmacro.h"
DEFINE_DEVICE_TYPE(XGA_COPRO, xga_copro_device, "xga_copro", "IBM XGA Coprocessor")
DEFINE_DEVICE_TYPE(OTI111, oak_oti111_vga_device, "oti111_vga", "Oak Technologies Spitfire 64111")
xga_copro_device::xga_copro_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, XGA_COPRO, tag, owner, clock)
@ -756,93 +755,3 @@ void xga_copro_device::device_reset()
{
m_pelmap = 0;
}
oak_oti111_vga_device::oak_oti111_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: svga_device(mconfig, OTI111, tag, owner, clock)
, m_xga(*this, "xga")
{
m_main_if_space_config = address_space_config("io_regs", ENDIANNESS_LITTLE, 8, 4, 0, address_map_constructor(FUNC(oak_oti111_vga_device::io_3bx_3dx_map), this));
}
void oak_oti111_vga_device::device_add_mconfig(machine_config &config)
{
XGA_COPRO(config, m_xga, 0);
m_xga->mem_read_callback().set(FUNC(oak_oti111_vga_device::mem_linear_r));
m_xga->mem_write_callback().set(FUNC(oak_oti111_vga_device::mem_linear_w));
m_xga->set_type(xga_copro_device::TYPE::OTI111);
}
void oak_oti111_vga_device::io_3bx_3dx_map(address_map &map)
{
svga_device::io_3bx_3dx_map(map);
// TODO: convert to address_space
map(0x0e, 0xe).lrw8(
NAME([this] (offs_t offset) {
return m_oak_idx;
}),
NAME([this] (offs_t offset, u8 data) {
m_oak_idx = data;
})
);
map(0x0f, 0xf).lrw8(
NAME([this] (offs_t offset) {
return m_oak_idx <= 0x3a ? m_oak_regs[m_oak_idx] : space().unmap();
}),
NAME([this] (offs_t offset, u8 data) {
m_oak_regs[m_oak_idx] = data;
switch(m_oak_idx)
{
case 0x21:
svga.rgb8_en = BIT(data, 2);
break;
case 0x33:
vga.crtc.no_wrap = BIT(data, 0);
break;
}
})
);
}
// TODO: convert to map
u8 oak_oti111_vga_device::xga_read(offs_t offset)
{
switch(offset)
{
case 0x13: //fifo status
return 0xf;
default:
return m_xga->xga_read(offset);
}
return 0;
}
void oak_oti111_vga_device::xga_write(offs_t offset, u8 data)
{
m_xga->xga_write(offset, data);
}
void oak_oti111_vga_device::device_start()
{
svga_device::device_start();
std::fill(std::begin(m_oak_regs), std::end(m_oak_regs), 0);
}
void oak_oti111_vga_device::ramdac_mmio_map(address_map &map)
{
map.unmap_value_high();
// TODO: 0x04, 0x05 alt accesses for CRTC?
map(0x06, 0x06).rw(FUNC(oak_oti111_vga_device::ramdac_mask_r), FUNC(oak_oti111_vga_device::ramdac_mask_w));
map(0x07, 0x07).rw(FUNC(oak_oti111_vga_device::ramdac_state_r), FUNC(oak_oti111_vga_device::ramdac_read_index_w));
map(0x08, 0x08).rw(FUNC(oak_oti111_vga_device::ramdac_write_index_r), FUNC(oak_oti111_vga_device::ramdac_write_index_w));
map(0x09, 0x09).rw(FUNC(oak_oti111_vga_device::ramdac_data_r), FUNC(oak_oti111_vga_device::ramdac_data_w));
}
uint16_t oak_oti111_vga_device::offset()
{
uint16_t off = svga_device::offset();
if (svga.rgb8_en || svga.rgb15_en || svga.rgb16_en || svga.rgb32_en)
return vga.crtc.offset << 4; // TODO: there must a register to control this
else
return off;
}

View File

@ -70,28 +70,4 @@ private:
DECLARE_DEVICE_TYPE(XGA_COPRO, xga_copro_device)
class oak_oti111_vga_device : public svga_device
{
public:
oak_oti111_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
u8 xga_read(offs_t offset);
void xga_write(offs_t offset, u8 data);
void ramdac_mmio_map(address_map &map);
protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual void device_start() override;
virtual uint16_t offset() override;
virtual void io_3bx_3dx_map(address_map &map) override;
private:
u8 m_oak_regs[0x3b];
u8 m_oak_idx;
required_device<xga_copro_device> m_xga;
};
DECLARE_DEVICE_TYPE(OTI111, oak_oti111_vga_device)
#endif // MAME_VIDEO_PC_XGA_H

View File

@ -24,7 +24,7 @@
#include "machine/nvram.h"
#include "machine/timer.h"
#include "sound/ymz280b.h"
#include "video/pc_xga.h"
#include "video/pc_vga_oak.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"