summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine
diff options
context:
space:
mode:
author yz70s <yz70s@users.noreply.github.com>2019-11-24 17:45:01 +0100
committer yz70s <yz70s@users.noreply.github.com>2019-11-24 17:49:52 +0100
commit48393e5de8daf4eb098a0c86b658d90e20bb0312 (patch)
treeae68f4ba087cb431e613dd13bea2932c1fcea850 /src/mame/machine
parent4ce85e28caac8d1893aa5890efbc8e6adfce6e10 (diff)
xbox_pci.cpp: support io port 61 (nw)
Diffstat (limited to 'src/mame/machine')
-rw-r--r--src/mame/machine/xbox_pci.cpp55
1 files changed, 51 insertions, 4 deletions
diff --git a/src/mame/machine/xbox_pci.cpp b/src/mame/machine/xbox_pci.cpp
index 876d593f0e9..d1fc892f6e0 100644
--- a/src/mame/machine/xbox_pci.cpp
+++ b/src/mame/machine/xbox_pci.cpp
@@ -106,6 +106,7 @@ void mcpx_isalpc_device::internal_io_map(address_map &map)
{
map(0x0020, 0x0023).rw("pic8259_1", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
map(0x0040, 0x0043).rw("pit8254", FUNC(pit8254_device::read), FUNC(pit8254_device::write));
+ map(0x0061, 0x0061).rw(FUNC(mcpx_isalpc_device::portb_r), FUNC(mcpx_isalpc_device::portb_w));
map(0x0070, 0x0073).rw("rtc", FUNC(ds12885ext_device::read_extended), FUNC(ds12885ext_device::write_extended));
map(0x0080, 0x0080).w(FUNC(mcpx_isalpc_device::boot_state_w));
map(0x00a0, 0x00a3).rw("pic8259_2", FUNC(pic8259_device::read), FUNC(pic8259_device::write));
@@ -141,7 +142,12 @@ mcpx_isalpc_device::mcpx_isalpc_device(const machine_config &mconfig, const char
m_gpe0_status(0),
m_gpe0_enable(0),
m_global_smi_control(0),
- m_smi_command_port(0)
+ m_smi_command_port(0),
+ m_speaker(0),
+ m_refresh(false),
+ m_pit_out2(0),
+ m_spkrdata(0),
+ m_channel_check(0)
{
}
@@ -186,6 +192,9 @@ void mcpx_isalpc_device::device_start()
void mcpx_isalpc_device::device_reset()
{
pci_device::device_reset();
+ m_refresh = false;
+ m_pit_out2 = 1;
+ m_spkrdata = 0;
}
void mcpx_isalpc_device::device_add_mconfig(machine_config &config)
@@ -202,7 +211,8 @@ void mcpx_isalpc_device::device_add_mconfig(machine_config &config)
pit8254_device &pit8254(PIT8254(config, "pit8254", 0));
pit8254.set_clk<0>(1125000); /* heartbeat IRQ */
pit8254.out_handler<0>().set(FUNC(mcpx_isalpc_device::pit8254_out0_changed));
- pit8254.set_clk<1>(1125000); /* (unused) dram refresh */
+ pit8254.set_clk<1>(1125000); /* originally dram refresh, now only legacy support */
+ pit8254.out_handler<1>().set(FUNC(mcpx_isalpc_device::pit8254_out1_changed));
pit8254.set_clk<2>(1125000); /* (unused) pio port c pin 4, and speaker polling enough */
pit8254.out_handler<2>().set(FUNC(mcpx_isalpc_device::pit8254_out2_changed));
@@ -300,9 +310,16 @@ WRITE_LINE_MEMBER(mcpx_isalpc_device::pit8254_out0_changed)
pic8259_1->ir0_w(state);
}
+WRITE_LINE_MEMBER(mcpx_isalpc_device::pit8254_out1_changed)
+{
+ if (state)
+ m_refresh = !m_refresh;
+}
+
WRITE_LINE_MEMBER(mcpx_isalpc_device::pit8254_out2_changed)
{
- //xbox_speaker_set_input( state ? 1 : 0 );
+ m_pit_out2 = state ? 1 : 0;
+ //xbox_speaker_set_input(m_at_spkrdata & m_pit_out2);
}
WRITE_LINE_MEMBER(mcpx_isalpc_device::irq1)
@@ -335,11 +352,41 @@ WRITE_LINE_MEMBER(mcpx_isalpc_device::irq15)
pic8259_2->ir7_w(state);
}
+READ8_MEMBER(mcpx_isalpc_device::portb_r)
+{
+ uint8_t data = m_speaker;
+
+ data &= ~0xd0; /* AT BIOS don't likes this being set */
+ /* 0x10 is the dram refresh line bit on the 5170, just a timer here, 15.085us. */
+ data |= m_refresh ? 0x10 : 0;
+ if (m_pit_out2)
+ data |= 0x20;
+ else
+ data &= ~0x20; /* ps2m30 wants this */
+
+ return data;
+}
+
+WRITE8_MEMBER(mcpx_isalpc_device::portb_w)
+{
+ m_speaker = data;
+ pit8254->write_gate2(BIT(data, 0));
+ speaker_set_spkrdata(BIT(data, 1));
+ m_channel_check = BIT(data, 3);
+ //if (m_channel_check) m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
+}
+
uint32_t mcpx_isalpc_device::acknowledge()
{
return pic8259_1->acknowledge();
}
+void mcpx_isalpc_device::speaker_set_spkrdata(uint8_t data)
+{
+ m_spkrdata = data ? 1 : 0;
+ //xbox_speaker_set_input(m_at_spkrdata & m_pit_out2);
+}
+
void mcpx_isalpc_device::debug_generate_irq(int irq, int state)
{
set_virtual_line(irq, state);
@@ -601,7 +648,7 @@ void mcpx_ohci_device::device_start()
status = 0x00b0;
ohci_usb = new ohci_usb_controller();
ohci_usb->set_cpu(maincpu.target());
- ohci_usb->set_irq_callbaclk(
+ ohci_usb->set_irq_callback(
[&](int state)
{
m_interrupt_handler(state);