i8155: Update port outputs upon mode change

This commit is contained in:
AJR 2019-07-19 19:13:28 -04:00
parent 4d1582c793
commit d1e92898e4
2 changed files with 76 additions and 58 deletions

View File

@ -443,17 +443,14 @@ uint8_t i8155_device::io_r(offs_t offset)
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)
{
case REGISTER_COMMAND:
m_command = data;
uint8_t old_command = std::exchange(m_command, data);
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");
@ -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 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)
{
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;
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;
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;
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;
}
@ -511,6 +515,19 @@ void i8155_device::register_w(int offset, uint8_t data)
}
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;
case REGISTER_PORT_A:

View File

@ -116,6 +116,7 @@ private:
inline int get_port_mode(int port);
inline uint8_t read_port(int port);
inline void write_port(int port, uint8_t data);
void write_command(uint8_t data);
void register_w(int offset, uint8_t data);
};