// TODO add support for sense status void pit68230_device::wr_pitreg_pbcr(uint8_t data) { LOG("%s(%02x) \"%s\": %s - %02x\n", FUNCNAME, data, tag(), FUNCNAME, data); m_pbcr = data; if ((m_pgcr & REG_PGCR_H34_ENABLE) || ((m_pbcr & REG_PBCR_SUBMODE_MASK) == REG_PBCR_SUBMODE_1X)) { if (m_pbcr & REG_PBCR_H4_CTRL_IN_OUT) { switch(m_pbcr & REG_PBCR_H4_CTRL_MASK) { case REG_PBCR_H4_CTRL_OUT_00: LOG(" - H4 cleared\n"); m_h4_out_cb(CLEAR_LINE); break; case REG_PBCR_H4_CTRL_OUT_01: LOG(" - H4 asserted\n"); m_h4_out_cb(ASSERT_LINE); break; case REG_PBCR_H4_CTRL_OUT_10: LOGSETUP(" - interlocked handshake not implemented\n"); break; case REG_PBCR_H4_CTRL_OUT_11: LOGSETUP(" - pulsed handshake not implemented\n"); break; default: logerror(("Undefined H4 mode, broken driver - please report!\n")); } } } else { LOG(" - H4 cleared because being disabled in PGCR\n"); m_h4_out_cb(CLEAR_LINE); } }
void pit68230_device::wr_pitreg_psrr(uint8_t data) { LOG("%s(%02x) \"%s\": %s - %02x\n", FUNCNAME, data, tag(), FUNCNAME, data); LOGSETUP("PSSR - %s pin activated,", data & 0x40 ? "DMA" : "PC4"); LOGSETUP(" %s pin support %s interrupts,", data & 0x80 ? "PIRQ" : "PC5", data & 0x08 ? "no" : (data & 0x10 ? "vectored" : "autovectored" ) ); LOGSETUP(" H prio mode:%d\n", data & 0x03 ); m_psrr = data; }
void pit68230_device::wr_pitreg_pgcr(uint8_t data) { LOG("%s(%02x) \"%s\": %s - %02x\n", FUNCNAME, data, tag(), FUNCNAME, data); LOGSETUP("PGCR - Mode %d,", (data >> 6) & 3 ); LOGSETUP(" H34:%s, H12:%s,", (data & 0x20) ? "enabled" : "disabled", (data & 0x10) ? "enabled" : "disabled" ); LOGSETUP(" Sense assert H4:%s, H3:%s, H2:%s, H1:%s\n", data & 0x04 ? "Hi" : "Lo", data & 0x03 ? "Hi" : "Lo", data & 0x02 ? "Hi" : "Lo", data & 0x01 ? "Hi" : "Lo"); m_pgcr = data; }
//------------------------------------------------- // control_write - write control register //------------------------------------------------- void z80sio_channel::control_write(uint8_t data) { uint8_t reg = m_wr0 & WR0_REGISTER_MASK; if (reg != 0) { LOGSETUP(" * %s %c Reg %02x <- %02x \n", m_owner->tag(), 'A' + m_index, reg, data); // mask out register index m_wr0 &= ~WR0_REGISTER_MASK; } LOG("\n%s(%02x) reg %02x\n", FUNCNAME, data, reg); switch (reg) { case REG_WR0_COMMAND_REGPT: do_sioreg_wr0(data); break; case REG_WR1_INT_DMA_ENABLE: do_sioreg_wr1(data); m_uart->check_interrupts(); break; case REG_WR2_INT_VECTOR: do_sioreg_wr2(data); break; case REG_WR3_RX_CONTROL: do_sioreg_wr3(data); update_serial(); break; case REG_WR4_RX_TX_MODES: do_sioreg_wr4(data); update_serial(); break; case REG_WR5_TX_CONTROL: do_sioreg_wr5(data); update_serial(); update_rts(); break; case REG_WR6_SYNC_OR_SDLC_A: do_sioreg_wr6(data); break; case REG_WR7_SYNC_OR_SDLC_F: do_sioreg_wr7(data); break; default: logerror("Z80SIO \"%s\" Channel %c : Unsupported WRx register:%02x\n", m_owner->tag(), 'A' + m_index, reg); } }
//------------------------------------------------- // device_reset - device-specific reset //------------------------------------------------- void pit68230_device::device_reset () { LOGSETUP("%s %s \n",tag(), FUNCNAME); m_pgcr = 0; m_psrr = 0; m_paddr = 0; m_pbddr = 0; m_pcddr = 0; m_pivr = 0x0f; m_pirq_out_cb(CLEAR_LINE); m_pacr = 0; m_h2_out_cb(CLEAR_LINE); m_pbcr = 0; m_h4_out_cb(CLEAR_LINE); m_padr = 0; m_pa_out_cb((offs_t)0, m_padr); m_pbdr = 0; m_pb_out_cb((offs_t)0, m_pbdr); m_pcdr = 0; m_pc_out_cb((offs_t)0, m_pcdr); m_psr = 0; m_tcr = 0; m_tivr = 0x0f; m_tirq_out_cb(CLEAR_LINE); m_tsr = 0; LOGSETUP("%s %s DONE!\n",tag(), FUNCNAME); }
//------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void pit68230_device::device_start () { LOGSETUP("%s\n", FUNCNAME); // NOTE: // Not using resolve_safe for the m_px_in_cb's is a temporary way to be able to check // if a handler is installed with isnull(). The safe function installs a dummy default // handler which disable the isnull() test. TODO: Need a better fix? // resolve callbacks Port A m_pa_out_cb.resolve_safe(); m_pa_in_cb.resolve(); // resolve callbacks Port B m_pb_out_cb.resolve_safe(); m_pb_in_cb.resolve(); // resolve callbacks Port C m_pc_out_cb.resolve_safe(); m_pc_in_cb.resolve(); m_h1_out_cb.resolve_safe(); m_h2_out_cb.resolve_safe(); m_h3_out_cb.resolve_safe(); m_h4_out_cb.resolve_safe(); m_tirq_out_cb.resolve_safe(); m_pirq_out_cb.resolve_safe(); // Timers pit_timer = timer_alloc(TIMER_ID_PIT); // state saving save_item(NAME(m_pgcr)); save_item(NAME(m_psrr)); save_item(NAME(m_paddr)); save_item(NAME(m_pbddr)); save_item(NAME(m_pcddr)); save_item(NAME(m_pivr)); save_item(NAME(m_pacr)); save_item(NAME(m_pbcr)); save_item(NAME(m_padr)); save_item(NAME(m_pbdr)); save_item(NAME(m_pcdr)); save_item(NAME(m_psr)); save_item(NAME(m_tcr)); save_item(NAME(m_tivr)); save_item(NAME(m_cpr)); save_item(NAME(m_cntr)); save_item(NAME(m_tsr)); }
void pit68230_device::wr_pitreg_pacr(uint8_t data) { LOG("%s(%02x) \"%s\": %s - %02x\n", FUNCNAME, data, tag(), FUNCNAME, data); LOGSETUP("%s PACR", tag()); m_pacr = data; // callbacks /*PACR in Mode 0 * 5 43 H2 Control in Submode 00 && 01 * ------------------------------------ * 0 XX Input pin - edge-sensitive status input, H2S is set on an asserted edge. * 1 00 Output pin - negated, H2S is always clear. * 1 01 Output pin - asserted, H2S is always clear. * 1 10 Output pin - interlocked input handshake protocol, H2S is always clear. * 1 11 Output pin - pulsed input handshake protocol, H2S is always clear. * * 5 43 H2 Control in Submode 1x * ------------------------------------ * 0 XX Input pin - edge-sensitive status input, H2S is set on an asserted edge. * 1 X0 Output pin - negated, H2S is always cleared. * 1 X1 Output pin - asserted, H2S is always cleared. */ if (m_pgcr & REG_PGCR_H12_ENABLE) { if (m_pacr & REG_PACR_H2_CTRL_IN_OUT) { switch(m_pacr & REG_PACR_H2_CTRL_MASK) { case REG_PACR_H2_CTRL_OUT_00: LOGSETUP(" - H2 cleared\n"); m_h2_out_cb(CLEAR_LINE); break; case REG_PACR_H2_CTRL_OUT_01: LOGSETUP(" - H2 asserted\n"); m_h2_out_cb(ASSERT_LINE); break; case REG_PACR_H2_CTRL_OUT_10: LOGSETUP(" - interlocked handshake not implemented\n"); break; case REG_PACR_H2_CTRL_OUT_11: LOGSETUP(" - pulsed handshake not implemented\n"); break; default: logerror(("Undefined H2 mode, broken driver - please report!\n")); } } } else { LOGSETUP(" - H2 cleared because being disabled in PGCR\n"); m_h2_out_cb(CLEAR_LINE); } }
void pit68230_device::wr_pitreg_pcddr(uint8_t data) { LOG("%s(%02x) \"%s\": %s - %02x\n", FUNCNAME, data, tag(), FUNCNAME, data); LOGSETUP("%s PCDDR: %02x\n", tag(), data); m_pcddr = data; }
void pit68230_device::wr_pitreg_pbddr(uint8_t data) { LOGSETUP("%s PBDDR: %02x\n", tag(), data); m_pbddr = data; }