diff --git a/src/mess/drivers/compis.c b/src/mess/drivers/compis.c index 1d5985e0642..b2cd86eebc7 100644 --- a/src/mess/drivers/compis.c +++ b/src/mess/drivers/compis.c @@ -99,7 +99,7 @@ static ADDRESS_MAP_START( compis_io, AS_IO, 16, compis_state ) //AM_RANGE(0x0310, 0x0311) /* PCS6:2 0x00ff */ AM_MIRROR(0xe) // 8274 INTERRUPT ACKNOWLEDGE AM_RANGE(0x0310, 0x0311) /* PCS6:3 */ AM_MIRROR(0xc) AM_DEVREADWRITE8("uart", i8251_device, data_r, data_w, 0xff00) AM_RANGE(0x0312, 0x0313) /* PCS6:3 */ AM_MIRROR(0xc) AM_DEVREADWRITE8("uart", i8251_device, status_r, control_w, 0xff00) - //AM_RANGE(0x0320, 0x0321) /* PCS6:4 0x00ff */ AM_MIRROR(0xe) // 8274 + AM_RANGE(0x0320, 0x0323) /* PCS6:4 */ AM_MIRROR(0xc) AM_DEVREADWRITE8(I8274_TAG, z80dart_device, cd_ba_r, cd_ba_w, 0x00ff) //AM_RANGE(0x0320, 0x0321) /* PCS6:5 0xff00 */ AM_MIRROR(0xe) // DMA-TERMINATE J8 (iSBX0) AM_RANGE(0x0330, 0x0333) /* PCS6:6 */ AM_DEVREADWRITE8("upd7220", upd7220_device, read, write, 0x00ff) //AM_RANGE(0x0330, 0x0331) /* PCS6:7 0xff00 */ AM_MIRROR(0xe) // DMA-TERMINATE J9 (iSBX1) @@ -149,6 +149,60 @@ static const cassette_interface compis_cassette_interface = NULL }; + +//------------------------------------------------- +// I8274_INTERFACE( mpsc_intf ) +//------------------------------------------------- + +static I8274_INTERFACE( mpsc_intf ) +{ + 0, 0, 0, 0, + + DEVCB_DEVICE_LINE_MEMBER(RS232_A_TAG, serial_port_device, rx), + DEVCB_DEVICE_LINE_MEMBER(RS232_A_TAG, serial_port_device, tx), + DEVCB_DEVICE_LINE_MEMBER(RS232_A_TAG, rs232_port_device, dtr_w), + DEVCB_DEVICE_LINE_MEMBER(RS232_A_TAG, rs232_port_device, rts_w), + DEVCB_NULL, + DEVCB_NULL, + + DEVCB_DEVICE_LINE_MEMBER(RS232_B_TAG, serial_port_device, rx), + DEVCB_DEVICE_LINE_MEMBER(RS232_B_TAG, serial_port_device, tx), + DEVCB_DEVICE_LINE_MEMBER(RS232_B_TAG, rs232_port_device, dtr_w), + DEVCB_DEVICE_LINE_MEMBER(RS232_B_TAG, rs232_port_device, rts_w), + DEVCB_NULL, + DEVCB_NULL, + + DEVCB_DEVICE_LINE_MEMBER("maincpu", i80186_cpu_device, int3_w) +}; + + +//------------------------------------------------- +// rs232_port_interface rs232a_intf +//------------------------------------------------- + +static const rs232_port_interface rs232a_intf = +{ + DEVCB_NULL, + DEVCB_DEVICE_LINE_MEMBER(I8274_TAG, z80dart_device, dcda_w), + DEVCB_NULL, + DEVCB_NULL, + DEVCB_DEVICE_LINE_MEMBER(I8274_TAG, z80dart_device, ctsa_w) +}; + + +//------------------------------------------------- +// rs232_port_interface rs232b_intf +//------------------------------------------------- + +static const rs232_port_interface rs232b_intf = +{ + DEVCB_NULL, + DEVCB_DEVICE_LINE_MEMBER(I8274_TAG, z80dart_device, dcdb_w), + DEVCB_NULL, + DEVCB_NULL, + DEVCB_DEVICE_LINE_MEMBER(I8274_TAG, z80dart_device, ctsb_w) +}; + const floppy_format_type compis_floppy_formats[] = { FLOPPY_D88_FORMAT, FLOPPY_DFI_FORMAT, @@ -200,6 +254,10 @@ static MACHINE_CONFIG_START( compis, compis_state ) MCFG_FLOPPY_DRIVE_ADD("i8272a:0", compis_floppies, "525qd", compis_floppy_formats) MCFG_FLOPPY_DRIVE_ADD("i8272a:1", compis_floppies, "525qd", compis_floppy_formats) MCFG_CASSETTE_ADD(CASSETTE_TAG, compis_cassette_interface) + MCFG_TIMER_DRIVER_ADD_PERIODIC("tape", compis_state, tape_tick, attotime::from_hz(44100)) + MCFG_I8274_ADD(I8274_TAG, XTAL_16MHz/4, mpsc_intf) + MCFG_RS232_PORT_ADD(RS232_A_TAG, rs232a_intf, default_rs232_devices, NULL) + MCFG_RS232_PORT_ADD(RS232_B_TAG, rs232b_intf, default_rs232_devices, NULL) MCFG_COMPIS_KEYBOARD_ADD(NULL) /* software lists */ @@ -237,6 +295,10 @@ static MACHINE_CONFIG_START( compis2, compis_state ) MCFG_FLOPPY_DRIVE_ADD("i8272a:0", compis_floppies, "525qd", compis_floppy_formats) MCFG_FLOPPY_DRIVE_ADD("i8272a:1", compis_floppies, "525qd", compis_floppy_formats) MCFG_CASSETTE_ADD(CASSETTE_TAG, compis_cassette_interface) + MCFG_TIMER_DRIVER_ADD_PERIODIC("tape", compis_state, tape_tick, attotime::from_hz(44100)) + MCFG_I8274_ADD(I8274_TAG, XTAL_16MHz/4, mpsc_intf) + MCFG_RS232_PORT_ADD(RS232_A_TAG, rs232a_intf, default_rs232_devices, NULL) + MCFG_RS232_PORT_ADD(RS232_B_TAG, rs232b_intf, default_rs232_devices, NULL) MCFG_COMPIS_KEYBOARD_ADD(NULL) /* software lists */ diff --git a/src/mess/includes/compis.h b/src/mess/includes/compis.h index 7d9c83ba7e3..77bc04047e1 100644 --- a/src/mess/includes/compis.h +++ b/src/mess/includes/compis.h @@ -24,10 +24,15 @@ #include "machine/mm58274c.h" #include "machine/pic8259.h" #include "machine/pit8253.h" +#include "machine/serial.h" #include "machine/upd765.h" +#include "machine/z80dart.h" #include "video/upd7220.h" -#define CASSETTE_TAG "cassette" +#define I8274_TAG "ic65" +#define RS232_A_TAG "rs232a" +#define RS232_B_TAG "rs232b" +#define CASSETTE_TAG "cassette" class compis_state : public driver_device { @@ -39,6 +44,7 @@ public: m_8254(*this, "pit8254"), m_8259m(*this, "pic8259_master"), m_8255(*this, "ppi8255"), + m_mpsc(*this, I8274_TAG), m_centronics(*this, "centronics"), m_uart(*this, "uart"), m_rtc(*this, "mm58274c"), @@ -48,11 +54,12 @@ public: m_video_ram(*this, "video_ram") { } - required_device m_maincpu; + required_device m_maincpu; required_device m_8253; required_device m_8254; required_device m_8259m; required_device m_8255; + required_device m_mpsc; required_device m_centronics; required_device m_uart; required_device m_rtc; @@ -70,7 +77,11 @@ public: bool m_mon; DECLARE_WRITE_LINE_MEMBER(tmr0_w); DECLARE_WRITE_LINE_MEMBER(tmr2_w); + DECLARE_WRITE_LINE_MEMBER(tmr3_w); + DECLARE_WRITE_LINE_MEMBER(tmr4_w); + DECLARE_WRITE_LINE_MEMBER(tmr5_w); DECLARE_WRITE8_MEMBER(tape_mon_w); + TIMER_DEVICE_CALLBACK_MEMBER(tape_tick); void fdc_irq(bool state); void fdc_drq(bool state); diff --git a/src/mess/machine/compis.c b/src/mess/machine/compis.c index b9edb38774d..b8bd9ac0838 100644 --- a/src/mess/machine/compis.c +++ b/src/mess/machine/compis.c @@ -154,15 +154,30 @@ I8255A_INTERFACE( compis_ppi_interface ) /* PIT 8253 */ /*-------------------------------------------------------------------------*/ +WRITE_LINE_MEMBER( compis_state::tmr3_w ) +{ + m_mpsc->rxtxcb_w(state); +} + +WRITE_LINE_MEMBER( compis_state::tmr4_w ) +{ +} + +WRITE_LINE_MEMBER( compis_state::tmr5_w ) +{ + m_mpsc->rxca_w(state); + m_mpsc->txca_w(state); +} + const struct pit8253_interface compis_pit8253_config = { { /* Timer0 */ - {XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_NULL }, // TMR3 + {XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(compis_state, tmr3_w) }, /* Timer1 */ - {XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_NULL }, // TMR4 + {XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(compis_state, tmr4_w) }, /* Timer2 */ - {XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_NULL } // TMR5 + {XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(compis_state, tmr5_w) } } }; @@ -231,6 +246,11 @@ WRITE8_MEMBER( compis_state::tape_mon_w ) m_cassette->change_state(state, CASSETTE_MASK_MOTOR); } +TIMER_DEVICE_CALLBACK_MEMBER( compis_state::tape_tick ) +{ + m_maincpu->tmrin0_w(m_cassette->input() > 0.0); +} + void compis_state::machine_start() { m_fdc->setup_intrq_cb(i8272a_device::line_cb(FUNC(compis_state::fdc_irq), this));