(MESS) compis: Added MPSC and RS-232 ports. [Curt Coder]

This commit is contained in:
Curt Coder 2013-10-20 09:11:32 +00:00
parent fd77a104f5
commit dfadf49eba
3 changed files with 99 additions and 6 deletions

View File

@ -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 */

View File

@ -24,9 +24,14 @@
#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 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<cpu_device> m_maincpu;
required_device<i80186_cpu_device> m_maincpu;
required_device<pit8253_device> m_8253;
required_device<pit8254_device> m_8254;
required_device<pic8259_device> m_8259m;
required_device<i8255_device> m_8255;
required_device<i8274_device> m_mpsc;
required_device<centronics_device> m_centronics;
required_device<i8251_device> m_uart;
required_device<mm58274c_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);

View File

@ -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));