i8155: Update port outputs upon mode change
This commit is contained in:
parent
4d1582c793
commit
d1e92898e4
@ -443,17 +443,14 @@ uint8_t i8155_device::io_r(offs_t offset)
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
// register_w - register write
|
// write_command - set port modes and start/stop
|
||||||
|
// timer
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
|
|
||||||
void i8155_device::register_w(int offset, uint8_t data)
|
void i8155_device::write_command(uint8_t data)
|
||||||
{
|
{
|
||||||
switch (offset & 0x07)
|
uint8_t old_command = std::exchange(m_command, data);
|
||||||
{
|
|
||||||
case REGISTER_COMMAND:
|
|
||||||
m_command = data;
|
|
||||||
|
|
||||||
LOGMASKED(LOG_PORT, "Port A Mode: %s\n", (data & COMMAND_PA) ? "output" : "input");
|
LOGMASKED(LOG_PORT, "Port A Mode: %s\n", (data & COMMAND_PA) ? "output" : "input");
|
||||||
LOGMASKED(LOG_PORT, "Port B Mode: %s\n", (data & COMMAND_PB) ? "output" : "input");
|
LOGMASKED(LOG_PORT, "Port B Mode: %s\n", (data & COMMAND_PB) ? "output" : "input");
|
||||||
@ -461,22 +458,29 @@ void i8155_device::register_w(int offset, uint8_t data)
|
|||||||
LOGMASKED(LOG_PORT, "Port A Interrupt: %s\n", (data & COMMAND_IEA) ? "enabled" : "disabled");
|
LOGMASKED(LOG_PORT, "Port A Interrupt: %s\n", (data & COMMAND_IEA) ? "enabled" : "disabled");
|
||||||
LOGMASKED(LOG_PORT, "Port B Interrupt: %s\n", (data & COMMAND_IEB) ? "enabled" : "disabled");
|
LOGMASKED(LOG_PORT, "Port B Interrupt: %s\n", (data & COMMAND_IEB) ? "enabled" : "disabled");
|
||||||
|
|
||||||
|
if ((data & COMMAND_PA) && (!old_command & COMMAND_PA))
|
||||||
|
m_out_pa_cb((offs_t)0, m_output[PORT_A]);
|
||||||
|
if ((data & COMMAND_PB) && (!old_command & COMMAND_PB))
|
||||||
|
m_out_pb_cb((offs_t)0, m_output[PORT_B]);
|
||||||
|
|
||||||
switch (data & COMMAND_PC_MASK)
|
switch (data & COMMAND_PC_MASK)
|
||||||
{
|
{
|
||||||
case COMMAND_PC_ALT_1:
|
case COMMAND_PC_ALT_1:
|
||||||
LOGMASKED(LOG_PORT, "Port C Mode: Alt 1\n");
|
LOGMASKED(LOG_PORT, "Port C Mode: Alt 1 (PC0-PC5 input)\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case COMMAND_PC_ALT_2:
|
case COMMAND_PC_ALT_2:
|
||||||
LOGMASKED(LOG_PORT, "Port C Mode: Alt 2\n");
|
LOGMASKED(LOG_PORT, "Port C Mode: Alt 2 (PC0-PC5 output)\n");
|
||||||
|
if ((old_command & COMMAND_PC_MASK) != COMMAND_PC_ALT_2)
|
||||||
|
m_out_pc_cb((offs_t)0, m_output[PORT_C]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case COMMAND_PC_ALT_3:
|
case COMMAND_PC_ALT_3:
|
||||||
LOGMASKED(LOG_PORT, "Port C Mode: Alt 3\n");
|
LOGMASKED(LOG_PORT, "Port C Mode: Alt 3 (PC0-PC2 A handshake, PC3-PC5 output)\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case COMMAND_PC_ALT_4:
|
case COMMAND_PC_ALT_4:
|
||||||
LOGMASKED(LOG_PORT, "Port C Mode: Alt 4\n");
|
LOGMASKED(LOG_PORT, "Port C Mode: Alt 4 (PC0-PC2 A handshake, PC3-PC5 B handshake)\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -511,6 +515,19 @@ void i8155_device::register_w(int offset, uint8_t data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// register_w - register write
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void i8155_device::register_w(int offset, uint8_t data)
|
||||||
|
{
|
||||||
|
switch (offset & 0x07)
|
||||||
|
{
|
||||||
|
case REGISTER_COMMAND:
|
||||||
|
write_command(data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REGISTER_PORT_A:
|
case REGISTER_PORT_A:
|
||||||
|
@ -116,6 +116,7 @@ private:
|
|||||||
inline int get_port_mode(int port);
|
inline int get_port_mode(int port);
|
||||||
inline uint8_t read_port(int port);
|
inline uint8_t read_port(int port);
|
||||||
inline void write_port(int port, uint8_t data);
|
inline void write_port(int port, uint8_t data);
|
||||||
|
void write_command(uint8_t data);
|
||||||
|
|
||||||
void register_w(int offset, uint8_t data);
|
void register_w(int offset, uint8_t data);
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user