machine/mediagx_cs5530_bridge.cpp: add $92 A20 gate

This commit is contained in:
angelosa 2023-12-17 00:30:48 +01:00
parent e3440b86e2
commit e2350b15c9
4 changed files with 96 additions and 17 deletions

View File

@ -11,6 +11,11 @@
#include "speaker.h"
#define VERBOSE (LOG_GENERAL)
//#define LOG_OUTPUT_FUNC osd_printf_warning
#include "logmacro.h"
DEFINE_DEVICE_TYPE(MEDIAGX_CS5530_BRIDGE, mediagx_cs5530_bridge_device, "mediagx_cs5530_bridge", "MediaGX CS5530 Bridge")
mediagx_cs5530_bridge_device::mediagx_cs5530_bridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
@ -128,7 +133,61 @@ void mediagx_cs5530_bridge_device::device_reset()
void mediagx_cs5530_bridge_device::config_map(address_map &map)
{
pci_device::config_map(map);
// ...
// map(0x40, 0x42) PCI Function Control
// map(0x43, 0x43) USB Shadow
// map(0x44, 0x44) Reset Control
// map(0x50, 0x50) PIT Control/ISA CLK divider
// map(0x51, 0x51) ISA I/O Recovery Control
// map(0x52, 0x52) ROM/AT Logic Control
// map(0x53, 0x53) Alternate CPU Support
// map(0x5a, 0x5b) Decode Control
// map(0x5c, 0x5d) PCI Interrupt Steering
// map(0x70, 0x71) GPCS Base Address
// map(0x72, 0x72) GPCS Control
// map(0x80, 0x83) Power Management Enable
// map(0x84, 0x87) Second Level Power Management Status Mirror (r/o)
// map(0x88, 0x89) General Purpose Timer 1 Count/Control
// map(0x8a, 0x8b) General Purpose Timer 2 Count/Control
// map(0x8c, 0x8c) IRQ Speedup Timer Count
// map(0x8d, 0x8d) Video Speedup Timer Count
// map(0x8e, 0x8e) VGA Timer COunt
// map(0x90, 0x90) GPIO Pin Direction
// map(0x91, 0x91) GPIO Pin Data
// map(0x92, 0x92) GPIO Control 1
// map(0x93, 0x93) Miscellaneous Device Control
// map(0x94, 0x95) Suspend Modulation OFF/ON Count
// map(0x96, 0x96) Suspend Configuration
// map(0x97, 0x97) GPIO Control 2
// map(0x98, 0x99) Primary HDD Idle Timer Count
// map(0x9a, 0x9b) Floppy Disk Idle Timer Count
// map(0x9c, 0x9d) Parallel / Serial Idle Timer Count
// map(0x9e, 0x9f) Keyboard / Mouse Idle Timer Count
// map(0xa0, 0xa5) User Defined Device # Idle Timer Count
// map(0xa6, 0xa7) Video Idle Timer Count
// map(0xa8, 0xa9) Video Overflow Count
// map(0xac, 0xad) Secondary HDD Idle Timer Count
// map(0xae, 0xae) CPU Suspend Command (w/o)
// map(0xaf, 0xaf) Suspend Notebook Command (w/o)
// map(0xb4, 0xb7) Floppy Port Shadows (r/o)
// map(0xb8, 0xb8) DMA Shadow (r/o)
// map(0xb9, 0xb9) PIC Shadow (r/o)
// map(0xba, 0xba) PIT Shadow (r/o)
// map(0xbb, 0xbb) RTC Index Shadow (r/o)
// map(0xbc, 0xbc) Clock Stop Control
// map(0xc0, 0xcb) User Defined Device # Base Address
// map(0xcc, 0xce) User Defined Device # Control
// map(0xd0, 0xd0) Software SMI (w/o)
// map(0xec, 0xec) Timer Test
// map(0xf4, 0xf7) Second Level Power Management Status
}
void mediagx_cs5530_bridge_device::internal_io_map(address_map &map)
@ -153,8 +212,19 @@ void mediagx_cs5530_bridge_device::internal_io_map(address_map &map)
m_rtccs_write(data);
})
);
map(0x0080, 0x009f).rw(FUNC(mediagx_cs5530_bridge_device::at_page8_r), FUNC(mediagx_cs5530_bridge_device::at_page8_w));
// TODO: $92 A20 fast reset/override
map(0x0080, 0x008f).rw(FUNC(mediagx_cs5530_bridge_device::at_page8_r), FUNC(mediagx_cs5530_bridge_device::at_page8_w));
// TODO: port decoding driven by PCI register $52
map(0x0092, 0x0092).lrw8(
NAME([this] () {
LOG("Fast init $92 read\n");
return m_fast_init;
}),
NAME([this] (u8 data) {
LOG("Fast init $92 write %02x\n", data);
m_host_cpu->set_input_line(INPUT_LINE_A20, BIT(data, 1));
m_fast_init = data;
})
);
map(0x00a0, 0x00a1).rw("pic8259_slave", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0x00c0, 0x00df).rw(FUNC(mediagx_cs5530_bridge_device::at_dma8237_2_r), FUNC(mediagx_cs5530_bridge_device::at_dma8237_2_w));
// map(0x04d0, 0x04d1).rw(FUNC(mediagx_cs5530_bridge_device::eisa_irq_read), FUNC(mediagx_cs5530_bridge_device::eisa_irq_write));

View File

@ -9,6 +9,7 @@
#include "pci.h"
#include "bus/isa/isa.h"
#include "cpu/i386/i386.h"
#include "machine/am9517a.h"
#include "machine/pic8259.h"
#include "machine/pit8253.h"
@ -129,6 +130,8 @@ private:
uint16_t m_dma_high_byte = 0;
uint8_t m_channel_check = 0;
bool m_nmi_enabled = false;
u8 m_fast_init;
};
DECLARE_DEVICE_TYPE(MEDIAGX_CS5530_BRIDGE, mediagx_cs5530_bridge_device)

View File

@ -6,7 +6,7 @@
Hardware consists of:
Motherboard (GXM-530D): (ETA: BIOS boots as SuperTek ST-MGXm3HB -AS)
Motherboard (GXM-530D): (ETA: BIOS boots as SuperTek ST-MGXm3HB, is 530 actually referring to SiS530? -AS)
Cyrix MediaGX GXm-266GP 2.9V
Cyrix GXm Cx5530 with GCT bios
128MB RAM
@ -29,6 +29,8 @@
#include "machine/mediagx_cs5530_bridge.h"
#include "machine/mediagx_host.h"
#include "machine/pci.h"
//#include "machine/sis7001_usb.h"
//#include "video/rivatnt.h"
#include "screen.h"
@ -67,38 +69,47 @@ void matrix_state::matrix(machine_config &config)
// basic machine hardware
MEDIAGX(config, m_maincpu, 233'000'000); // Cyrix MediaGX GXm-266GP
m_maincpu->set_addrmap(AS_PROGRAM, &matrix_state::main_map);
m_maincpu->set_irq_acknowledge_callback("pci:07.0:pic8259_master", FUNC(pic8259_device::inta_cb));
m_maincpu->set_irq_acknowledge_callback("pci:12.0:pic8259_master", FUNC(pic8259_device::inta_cb));
// TODO: from FDC37C93x super I/O
// NOTE: it's not initialized at $3f0 - $370 but accessed anyway, wtf
DS1287(config, m_rtc, 32.768_kHz_XTAL);
m_rtc->set_binary(true);
m_rtc->set_epoch(1980);
m_rtc->irq().set("pci:07.0", FUNC(mediagx_cs5530_bridge_device::pc_irq8n_w));
m_rtc->irq().set("pci:12.0", FUNC(mediagx_cs5530_bridge_device::pc_irq8n_w));
PCI_ROOT(config, "pci", 0);
MEDIAGX_HOST(config, "pci:00.0", 0, "maincpu", 128*1024*1024);
// TODO: no clue about the ID used for this, definitely tested
// Tries to initialize MediaGX F4 -> ISA -> PCI/AGP, failing in all cases
// May actually be a ZFMicro PCI Bridge (0x10780400)?
PCI_BRIDGE(config, "pci:01.0", 0, 0x10780000, 0);
//RIVATNT(config, "pci:01.0:00.0", 0);
// TODO: unconfirmed PCI space
mediagx_cs5530_bridge_device &isa(MEDIAGX_CS5530_BRIDGE(config, "pci:07.0", 0, "maincpu"));
// "pci:12.0" or "pci:10.0" depending on pin H26 (readable in bridge thru PCI index $44)
mediagx_cs5530_bridge_device &isa(MEDIAGX_CS5530_BRIDGE(config, "pci:12.0", 0, "maincpu"));
isa.boot_state_hook().set([](u8 data) { /* printf("%02x\n", data); */ });
//isa.smi().set_inputline("maincpu", INPUT_LINE_SMI);
isa.rtcale().set([this](u8 data) { m_rtc->address_w(data); });
isa.rtccs_read().set([this]() { return m_rtc->data_r(); });
isa.rtccs_write().set([this](u8 data) { m_rtc->data_w(data); });
// TODO: unknown number of ISA slots
ISA16_SLOT(config, "isa1", 0, "pci:07.0:isabus", pc_isa16_cards, nullptr, false);
// "pci:12.1" SMI & ACPI
// "pci:12.2" IDE
// "pci:12.3" XpressAUDIO
// "pci:12.4" XpressVIDEO
// "pci:13.0" (different) 0x0e11a0f8 ZF Micro Chipset USB (Compaq OpenHCI)
//SIS7001_USB(config, "pci:13.0", 0, 2);
// 2 PCI slots, 2 ISA slots
ISA16_SLOT(config, "isa1", 0, "pci:12.0:isabus", pc_isa16_cards, nullptr, false);
ISA16_SLOT(config, "isa2", 0, "pci:12.0:isabus", pc_isa16_cards, nullptr, false);
}
ROM_START( matrix )
ROM_REGION32_LE(0x40000, "pci:07.0", 0)
ROM_REGION32_LE(0x40000, "pci:12.0", 0)
ROM_LOAD("d586_bios.bin", 0x00000, 0x40000, CRC(39fc093a) SHA1(3376bac4f0d6e729d5939e3078ecdf700464cba3) )
ROM_REGION(0x300000, "unsorted", 0) // encrypted?

View File

@ -594,12 +594,6 @@ void xtom3d_state::romdisk_config(device_t *device)
romdisk.set_rom_tag("game_rom");
}
// TODO: stub for drive options (speed/drive type etc.)
/*void xtom3d_state::cdrom_config(device_t *device)
{
}
*/
// TODO: unverified PCI config space
void xtom3d_state::xtom3d(machine_config &config)
{
@ -660,6 +654,7 @@ void xtom3d_state::xtom3d(machine_config &config)
// "pci:0e.0" J4D1
}
// TODO: stub for drive options (speed/drive type etc.)
static void cdrom_config(device_t *device)
{
device->subdevice<cdda_device>("cdda")->add_route(0, ":lmicrophone", 0.25);