diff --git a/src/mess/drivers/apricot.c b/src/mess/drivers/apricot.c index 50a3251fc89..41ed2eab629 100644 --- a/src/mess/drivers/apricot.c +++ b/src/mess/drivers/apricot.c @@ -47,7 +47,6 @@ public: m_sio(*this, "ic15"), m_rs232(*this, "rs232"), m_centronics(*this, "centronics"), - m_cent_data_out(*this, "cent_data_out"), m_fdc(*this, "ic68"), m_floppy0(*this, "ic68:0"), m_floppy1(*this, "ic68:1"), @@ -70,7 +69,6 @@ public: required_device m_sio; required_device m_rs232; required_device m_centronics; - required_device m_cent_data_out; required_device m_fdc; required_device m_floppy0; required_device m_floppy1; @@ -79,14 +77,16 @@ public: DECLARE_WRITE8_MEMBER( i8089_ca1_w ); DECLARE_WRITE8_MEMBER( i8089_ca2_w ); - DECLARE_READ8_MEMBER( apricot_sysctrl_r ); - DECLARE_WRITE8_MEMBER( apricot_sysctrl_w ); + DECLARE_WRITE8_MEMBER( i8255_portb_w ); + DECLARE_READ8_MEMBER( i8255_portc_r ); + DECLARE_WRITE8_MEMBER( i8255_portc_w ); DECLARE_WRITE_LINE_MEMBER( timer_out1 ); DECLARE_WRITE_LINE_MEMBER( timer_out2 ); void wd2793_intrq_w(bool state); void wd2793_drq_w(bool state); - DECLARE_WRITE8_MEMBER( centronics_write ); + DECLARE_WRITE_LINE_MEMBER( write_centronics_fault ); + DECLARE_WRITE_LINE_MEMBER( write_centronics_perror ); DECLARE_WRITE_LINE_MEMBER( apricot_mc6845_de ) { m_display_enabled = state; }; @@ -106,6 +106,9 @@ public: int m_display_enabled; UINT32 screen_update_apricot(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + int m_centronics_fault; + int m_centronics_perror; }; @@ -127,16 +130,31 @@ WRITE8_MEMBER( apricot_state::i8089_ca2_w ) m_iop->ca_w(0); } -READ8_MEMBER( apricot_state::apricot_sysctrl_r ) +WRITE_LINE_MEMBER( apricot_state::write_centronics_fault ) +{ + m_centronics_fault = state; + m_sio->syncb_w(state); + m_ppi->pc2_w(state); +} + +WRITE_LINE_MEMBER( apricot_state::write_centronics_perror ) +{ + m_centronics_perror = state; +} + +READ8_MEMBER( apricot_state::i8255_portc_r ) { UINT8 data = 0; + data |= m_centronics_perror << 0; + // schematic page 294 says pc1 is centronics pin 34, which is n/c. + data |= m_centronics_fault << 2; data |= m_display_enabled << 3; return data; } -WRITE8_MEMBER( apricot_state::apricot_sysctrl_w ) +WRITE8_MEMBER( apricot_state::i8255_portb_w ) { m_display_on = BIT(data, 3); m_video_mode = BIT(data, 4); @@ -151,23 +169,21 @@ WRITE8_MEMBER( apricot_state::apricot_sysctrl_w ) // PB7 Centronics transceiver direction. 0 = output, 1 = input } -WRITE8_MEMBER( apricot_state::centronics_write ) +WRITE8_MEMBER( apricot_state::i8255_portc_w ) { - m_cent_data_out->write(space, 0, data); - - /// HACK: This is impossible, strobe might be connected to one of i8255 Port C output bits (4/5/6/7) - m_centronics->write_strobe(0); - m_centronics->write_strobe(1); +// schematic page 294 says pc4 outputs to centronics pin 13, which is the "select" output from the printer. + m_centronics->write_strobe(BIT(data, 5)); +// schematic page 294 says pc6 outputs to centronics pin 15, which is unused } static const i8255_interface apricot_i8255a_intf = { DEVCB_DEVICE_MEMBER("cent_data_in", input_buffer_device, read), - DEVCB_DRIVER_MEMBER(apricot_state, centronics_write), + DEVCB_DEVICE_MEMBER("cent_data_out", output_latch_device, write), DEVCB_NULL, - DEVCB_DRIVER_MEMBER(apricot_state, apricot_sysctrl_w), - DEVCB_DRIVER_MEMBER(apricot_state, apricot_sysctrl_r), - DEVCB_NULL + DEVCB_DRIVER_MEMBER(apricot_state, i8255_portb_w), + DEVCB_DRIVER_MEMBER(apricot_state, i8255_portc_r), + DEVCB_DRIVER_MEMBER(apricot_state, i8255_portc_w) }; WRITE_LINE_MEMBER( apricot_state::timer_out1 ) @@ -425,10 +441,9 @@ static MACHINE_CONFIG_START( apricot, apricot_state ) MCFG_CENTRONICS_DATA_INPUT_BUFFER("cent_data_in") MCFG_CENTRONICS_ACK_HANDLER(DEVWRITELINE("ic15", z80dart_device, ctsb_w)) MCFG_CENTRONICS_BUSY_HANDLER(DEVWRITELINE("ic15", z80dart_device, dcdb_w)) - MCFG_CENTRONICS_FAULT_HANDLER(DEVWRITELINE("ic15", z80dart_device, syncb_w)) - // TODO: these might be connected to i8255 Port C input bits (0/1/2) - //MCFG_CENTRONICS_SELECT_HANDLER() - //MCFG_CENTRONICS_PERROR_HANDLER() + MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(apricot_state, write_centronics_fault)) + MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE(apricot_state, write_centronics_perror)) + //MCFG_CENTRONICS_SELECT_HANDLER() // schematic page 294 says this is connected to pc4, but that is an output to the printer MCFG_DEVICE_ADD("cent_data_in", INPUT_BUFFER, 0) MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")