pci/oti_spitfire: fix BAR2 IO flag, add revision register

This commit is contained in:
angelosa 2024-02-14 22:01:13 +01:00
parent 863e5496e2
commit f4c8b1225b
4 changed files with 43 additions and 20 deletions

View File

@ -72,7 +72,7 @@ void oti64111_pci_device::device_start()
add_map( 256, M_MEM, FUNC(oti64111_pci_device::mmio_map));
add_map(8*1024*1024, M_MEM, FUNC(oti64111_pci_device::vram_aperture_map));
add_map( 256, M_MEM, FUNC(oti64111_pci_device::extio_map));
add_map( 256, M_IO, FUNC(oti64111_pci_device::extio_map));
add_rom((u8 *)m_vga_rom->base(), 0x8000);
expansion_rom_base = 0xc0000;
@ -100,6 +100,7 @@ void oti64111_pci_device::config_map(address_map &map)
void oti64111_pci_device::mmio_map(address_map &map)
{
map(0x00, 0x7f).rw(m_svga, FUNC(oak_oti111_vga_device::xga_read), FUNC(oak_oti111_vga_device::xga_write));
}
void oti64111_pci_device::vram_aperture_map(address_map &map)
@ -109,6 +110,7 @@ void oti64111_pci_device::vram_aperture_map(address_map &map)
void oti64111_pci_device::extio_map(address_map &map)
{
map(0x00e0, 0x00ef).m(m_svga, FUNC(oak_oti111_vga_device::ramdac_mmio_map));
}
void oti64111_pci_device::legacy_io_map(address_map &map)

View File

@ -1082,7 +1082,7 @@ void vga_device::sequencer_map(address_map &map)
NAME([this] (offs_t offset) {
const u8 res = vga.sequencer.data[offset];
if (!machine().side_effects_disabled())
LOG("Reading unmapped sequencer read register [%02x] -> %02x (SVGA?)\n", offset, res);
LOGREGS("Reading unmapped sequencer read register [%02x] -> %02x (SVGA?)\n", offset, res);
return res;
})
);

View File

@ -57,28 +57,41 @@ void oak_oti111_vga_device::device_reset()
void oak_oti111_vga_device::io_3bx_3dx_map(address_map &map)
{
svga_device::io_3bx_3dx_map(map);
map(0x0e, 0x0e).lrw8(
NAME([this] (offs_t offset) {
return m_oak_idx;
}),
NAME([this] (offs_t offset, u8 data) {
m_oak_idx = data;
})
);
map(0x0f, 0x0f).lrw8(
NAME([this] (offs_t offset) {
return space(EXT_REG).read_byte(m_oak_idx);
}),
NAME([this] (offs_t offset, u8 data) {
space(EXT_REG).write_byte(m_oak_idx, data);
})
);
map(0x0e, 0x0e).rw(FUNC(oak_oti111_vga_device::oak_index_r), FUNC(oak_oti111_vga_device::oak_index_w));
map(0x0f, 0x0f).rw(FUNC(oak_oti111_vga_device::oak_data_r), FUNC(oak_oti111_vga_device::oak_data_w));
}
u8 oak_oti111_vga_device::oak_index_r(offs_t offset)
{
return m_oak_idx;
}
void oak_oti111_vga_device::oak_index_w(offs_t offset, u8 data)
{
m_oak_idx = data;
}
u8 oak_oti111_vga_device::oak_data_r(offs_t offset)
{
return space(EXT_REG).read_byte(m_oak_idx);
}
void oak_oti111_vga_device::oak_data_w(offs_t offset, u8 data)
{
space(EXT_REG).write_byte(m_oak_idx, data);
}
void oak_oti111_vga_device::oak_map(address_map &map)
{
// (undocumented) Revision ID
// win98se tests 0x06 / 0x07 / 0x0a / 0x0b paths, failing in case it doesn't find a valid value.
// 64111 BIOS wants it to be == 6 at POST, printing 64107 in case it isn't
map(0x00, 0x00).lr8(
NAME([this] (offs_t offset) {
//machine().debug_break();
return 0x06;
})
);
// status, set by BIOS for memory size
map(0x02, 0x02).lrw8(
NAME([this] (offs_t offset) {
@ -286,7 +299,8 @@ void oak_oti111_vga_device::xga_write(offs_t offset, u8 data)
void oak_oti111_vga_device::ramdac_mmio_map(address_map &map)
{
map.unmap_value_high();
// TODO: 0x04, 0x05 alt accesses for CRTC?
map(0x04, 0x04).rw(FUNC(oak_oti111_vga_device::oak_index_r), FUNC(oak_oti111_vga_device::oak_index_w));
map(0x05, 0x05).rw(FUNC(oak_oti111_vga_device::oak_data_r), FUNC(oak_oti111_vga_device::oak_data_w));
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));

View File

@ -17,8 +17,8 @@ public:
u8 xga_read(offs_t offset);
void xga_write(offs_t offset, u8 data);
// $xxe0-$xxef in EXTIO
void ramdac_mmio_map(address_map &map);
void oak_map(address_map &map);
virtual uint8_t mem_r(offs_t offset) override;
virtual void mem_w(offs_t offset, uint8_t data) override;
@ -38,6 +38,13 @@ private:
required_device<xga_copro_device> m_xga;
void oak_map(address_map &map);
u8 oak_index_r(offs_t offset);
void oak_index_w(offs_t offset, u8 data);
u8 oak_data_r(offs_t offset);
void oak_data_w(offs_t offset, u8 data);
u8 m_oak_idx = 0;
u8 m_memory_size = 0;