mirror of
https://github.com/holub/mame
synced 2025-04-23 08:49:55 +03:00
xbox_pci.cpp: add simple interfaces for lpc bus devices (nw)
This commit is contained in:
parent
acc073745a
commit
a73650ea2a
@ -58,7 +58,18 @@ DECLARE_DEVICE_TYPE(NV2A_RAM, nv2a_ram_device)
|
||||
* LPC Bus
|
||||
*/
|
||||
|
||||
class mcpx_isalpc_device : public pci_device {
|
||||
class lpcbus_host_interface {
|
||||
public:
|
||||
virtual void set_virtual_line(int line, int state) = 0;
|
||||
};
|
||||
|
||||
class lpcbus_device_interface {
|
||||
public:
|
||||
virtual void map_extra(address_space *memory_space, address_space *io_space) = 0;
|
||||
virtual void set_host(int index, lpcbus_host_interface *host) = 0;
|
||||
};
|
||||
|
||||
class mcpx_isalpc_device : public pci_device, public lpcbus_host_interface {
|
||||
public:
|
||||
mcpx_isalpc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, uint32_t subsystem_id);
|
||||
mcpx_isalpc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
@ -69,6 +80,8 @@ public:
|
||||
uint32_t acknowledge();
|
||||
void debug_generate_irq(int irq, int state);
|
||||
|
||||
virtual void set_virtual_line(int line, int state) override;
|
||||
|
||||
DECLARE_READ32_MEMBER(acpi_r);
|
||||
DECLARE_WRITE32_MEMBER(acpi_w);
|
||||
DECLARE_WRITE8_MEMBER(boot_state_w);
|
||||
@ -100,6 +113,8 @@ private:
|
||||
required_device<pic8259_device> pic8259_1;
|
||||
required_device<pic8259_device> pic8259_2;
|
||||
required_device<pit8254_device> pit8254;
|
||||
|
||||
lpcbus_device_interface *lpcdevices[16];
|
||||
};
|
||||
|
||||
DECLARE_DEVICE_TYPE(MCPX_ISALPC, mcpx_isalpc_device)
|
||||
|
@ -102,6 +102,9 @@ void mcpx_isalpc_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)
|
||||
{
|
||||
io_space->install_device(0, 0xffff, *this, &mcpx_isalpc_device::internal_io_map);
|
||||
for (int a = 0; a < 16; a++)
|
||||
if (lpcdevices[a] != nullptr)
|
||||
lpcdevices[a]->map_extra(memory_space, io_space);
|
||||
}
|
||||
|
||||
mcpx_isalpc_device::mcpx_isalpc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, uint32_t subsystem_id)
|
||||
@ -127,6 +130,30 @@ void mcpx_isalpc_device::device_start()
|
||||
m_boot_state_hook.resolve_safe();
|
||||
add_map(0x00000100, M_IO, FUNC(mcpx_isalpc_device::lpc_io));
|
||||
bank_infos[0].adr = 0x8000;
|
||||
for (int a = 0; a < 16; a++)
|
||||
lpcdevices[a] = nullptr;
|
||||
for (device_t &d : subdevices())
|
||||
{
|
||||
const char *t = d.basetag();
|
||||
int l = strlen(t);
|
||||
|
||||
if (l == 1)
|
||||
{
|
||||
int address = strtol(t + l, nullptr, 16);
|
||||
|
||||
address = address & 15;
|
||||
if (lpcdevices[address] == nullptr)
|
||||
{
|
||||
lpcbus_device_interface *i = dynamic_cast<lpcbus_device_interface *>(&d);
|
||||
lpcdevices[address] = i;
|
||||
if (i)
|
||||
i->set_host(address, this);
|
||||
}
|
||||
else
|
||||
logerror("Duplicate address for LPC bus device with tag %s\n", t);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void mcpx_isalpc_device::device_reset()
|
||||
@ -164,13 +191,21 @@ void mcpx_isalpc_device::device_add_mconfig(machine_config &config)
|
||||
|
||||
READ32_MEMBER(mcpx_isalpc_device::acpi_r)
|
||||
{
|
||||
logerror("Acpi read from %04X mask %08X\n", bank_infos[0].adr + offset, mem_mask);
|
||||
logerror("Acpi read from %04X mask %08X\n", bank_infos[0].adr + offset * 4, mem_mask);
|
||||
return 0;
|
||||
}
|
||||
|
||||
WRITE32_MEMBER(mcpx_isalpc_device::acpi_w)
|
||||
{
|
||||
logerror("Acpi write %08X to %04X mask %08X\n", data, bank_infos[0].adr + offset, mem_mask);
|
||||
// Seen using word registers at the following offsets
|
||||
// 0x00 0x02 0x04 0x08 0x20 0x22 0x28 0xa0 0xa2 0xc0-0xd8
|
||||
if ((offset == 0xb) && ACCESSING_BITS_16_23)
|
||||
{
|
||||
// SMI Command Port
|
||||
// write to byte 0x2e must generate a SMI interrupt
|
||||
logerror("Generate software SMI with value %02X\n", (data >> 16) & 0xff);
|
||||
}
|
||||
logerror("Acpi write %08X to %04X mask %08X\n", data, bank_infos[0].adr + offset * 4, mem_mask);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(mcpx_isalpc_device::boot_state_w)
|
||||
@ -233,54 +268,64 @@ uint32_t mcpx_isalpc_device::acknowledge()
|
||||
|
||||
void mcpx_isalpc_device::debug_generate_irq(int irq, int state)
|
||||
{
|
||||
switch (irq)
|
||||
set_virtual_line(irq, state);
|
||||
}
|
||||
|
||||
void mcpx_isalpc_device::set_virtual_line(int line, int state)
|
||||
{
|
||||
if (line < 16)
|
||||
{
|
||||
case 0:
|
||||
pic8259_1->ir0_w(state);
|
||||
break;
|
||||
case 1:
|
||||
pic8259_1->ir1_w(state);
|
||||
break;
|
||||
case 3:
|
||||
pic8259_1->ir3_w(state);
|
||||
break;
|
||||
case 4:
|
||||
pic8259_1->ir4_w(state);
|
||||
break;
|
||||
case 5:
|
||||
pic8259_1->ir5_w(state);
|
||||
break;
|
||||
case 6:
|
||||
pic8259_1->ir6_w(state);
|
||||
break;
|
||||
case 7:
|
||||
pic8259_1->ir7_w(state);
|
||||
break;
|
||||
case 8:
|
||||
pic8259_2->ir0_w(state);
|
||||
break;
|
||||
case 9:
|
||||
pic8259_2->ir1_w(state);
|
||||
break;
|
||||
case 10:
|
||||
pic8259_2->ir2_w(state);
|
||||
break;
|
||||
case 11:
|
||||
pic8259_2->ir3_w(state);
|
||||
break;
|
||||
case 12:
|
||||
pic8259_2->ir4_w(state);
|
||||
break;
|
||||
case 13:
|
||||
pic8259_2->ir5_w(state);
|
||||
break;
|
||||
case 14:
|
||||
pic8259_2->ir6_w(state);
|
||||
break;
|
||||
case 15:
|
||||
pic8259_2->ir7_w(state);
|
||||
break;
|
||||
switch (line)
|
||||
{
|
||||
case 0:
|
||||
pic8259_1->ir0_w(state);
|
||||
break;
|
||||
case 1:
|
||||
pic8259_1->ir1_w(state);
|
||||
break;
|
||||
case 3:
|
||||
pic8259_1->ir3_w(state);
|
||||
break;
|
||||
case 4:
|
||||
pic8259_1->ir4_w(state);
|
||||
break;
|
||||
case 5:
|
||||
pic8259_1->ir5_w(state);
|
||||
break;
|
||||
case 6:
|
||||
pic8259_1->ir6_w(state);
|
||||
break;
|
||||
case 7:
|
||||
pic8259_1->ir7_w(state);
|
||||
break;
|
||||
case 8:
|
||||
pic8259_2->ir0_w(state);
|
||||
break;
|
||||
case 9:
|
||||
pic8259_2->ir1_w(state);
|
||||
break;
|
||||
case 10:
|
||||
pic8259_2->ir2_w(state);
|
||||
break;
|
||||
case 11:
|
||||
pic8259_2->ir3_w(state);
|
||||
break;
|
||||
case 12:
|
||||
pic8259_2->ir4_w(state);
|
||||
break;
|
||||
case 13:
|
||||
pic8259_2->ir5_w(state);
|
||||
break;
|
||||
case 14:
|
||||
pic8259_2->ir6_w(state);
|
||||
break;
|
||||
case 15:
|
||||
pic8259_2->ir7_w(state);
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
//line = line - 16;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user