AltairZ80: Updated M2SIO device

This commit is contained in:
Peter Schorn 2020-12-17 09:31:53 +01:00
parent 1f6d0822bd
commit 5f2470904b
3 changed files with 57 additions and 32 deletions

View file

@ -176,6 +176,7 @@ static t_stat m2sio_detach(UNIT *uptr);
static t_stat m2sio_set_baud(UNIT *uptr, int32 value, const char *cptr, void *desc);
static t_stat m2sio_show_baud(FILE *st, UNIT *uptr, int32 value, const void *desc);
static t_stat m2sio_config_line(UNIT *uptr);
static t_stat m2sio_config_rts(DEVICE *dptr, char rts);
static int32 m2sio0_io(int32 addr, int32 io, int32 data);
static int32 m2sio1_io(int32 addr, int32 io, int32 data);
static int32 m2sio_io(DEVICE *dptr, int32 addr, int32 io, int32 data);
@ -384,6 +385,9 @@ static t_stat m2sio_reset(DEVICE *dptr, int32 (*routine)(const int32, const int3
/* Reset status registers */
xptr->stb = 0;
xptr->txp = 0;
if (dptr->units[0].flags & UNIT_ATT) {
m2sio_config_rts(dptr, 1); /* disable RTS */
}
if (!(dptr->flags & DEV_DIS)) {
sim_activate(&dptr->units[0], dptr->units[0].wait);
@ -408,11 +412,6 @@ static t_stat m2sio_svc(UNIT *uptr)
if (uptr->flags & UNIT_ATT) {
if (tmxr_poll_conn(xptr->tmxr) >= 0) { /* poll connection */
/* Clear DTR and RTS if serial port */
if (xptr->tmln->serport) {
tmxr_set_get_modem_bits(xptr->tmln, 0, TMXR_MDM_DTR | TMXR_MDM_RTS, NULL);
}
xptr->conn = 1; /* set connected */
sim_debug(STATUS_MSG, uptr->dptr, "new connection.\n");
@ -506,11 +505,11 @@ static t_stat m2sio_attach(UNIT *uptr, CONST char *cptr)
if ((r = tmxr_attach(xptr->tmxr, uptr, cptr)) == SCPE_OK) {
if (xptr->tmln->serport) {
r = m2sio_config_rts(uptr->dptr, xptr->rts); /* update RTS */
}
xptr->tmln->rcve = 1;
sim_activate(uptr, uptr->wait);
sim_debug(VERBOSE_MSG, uptr->dptr, "activated service.\n");
}
return r;
@ -558,11 +557,12 @@ static t_stat m2sio_set_baud(UNIT *uptr, int32 value, const char *cptr, void *de
case 2400:
case 4800:
case 9600:
case 19200:
xptr->baud = baud;
r = m2sio_config_line(uptr);
return r;
default:
break;
}
@ -630,7 +630,7 @@ static t_stat m2sio_config_line(UNIT *uptr)
sim_debug(STATUS_MSG, uptr->dptr, "port configuration set to '%s'.\n", config);
/*
** AltairZ80 and TMXR refuse to want to play together
** AltairZ80 and TMXR refuse to want to play together
** nicely when the CLOCK register is set to anything
** other than 0.
**
@ -651,6 +651,44 @@ static t_stat m2sio_config_line(UNIT *uptr)
return r;
}
/*
** RTS is active low
** 0 = RTS active
** 1 = RTS inactive
*/
static t_stat m2sio_config_rts(DEVICE *dptr, char rts)
{
M2SIO_CTX *xptr;
t_stat r = SCPE_OK;
int32 s;
xptr = (M2SIO_CTX *) dptr->ctxt;
if (dptr->units[0].flags & UNIT_ATT) {
/* RTS Control */
s = TMXR_MDM_RTS;
if (dptr->units[0].flags & UNIT_M2SIO_DTR) {
s |= TMXR_MDM_DTR;
}
if (!rts) {
r = tmxr_set_get_modem_bits(xptr->tmln, s, 0, NULL);
if (xptr->rts) {
sim_debug(STATUS_MSG, dptr, "RTS state changed to HIGH.\n");
}
} else {
r = tmxr_set_get_modem_bits(xptr->tmln, 0, s, NULL);
if (!xptr->rts) {
sim_debug(STATUS_MSG, dptr, "RTS state changed to LOW.\n");
}
}
}
xptr->rts = rts; /* Active low */
return r;
}
static int32 m2sio0_io(int32 addr, int32 io, int32 data)
{
DEVICE *dptr;
@ -685,7 +723,7 @@ static int32 m2sio_io(DEVICE *dptr, int32 addr, int32 io, int32 data)
static int32 m2sio_stat(DEVICE *dptr, int32 io, int32 data)
{
M2SIO_CTX *xptr;
int32 r,s;
int32 r;
xptr = (M2SIO_CTX *) dptr->ctxt;
@ -696,37 +734,25 @@ static int32 m2sio_stat(DEVICE *dptr, int32 io, int32 data)
/* Master Reset */
if ((data & M2SIO_RESET) == M2SIO_RESET) {
xptr->stb &= (M2SIO_CTS | M2SIO_DCD); /* Reset status register */
xptr->txp = 0;
sim_debug(STATUS_MSG, dptr, "MC6850 master reset.\n");
xptr->stb &= (M2SIO_CTS | M2SIO_DCD); /* Reset status register */
xptr->rxb = 0;
xptr->txp = 0;
m2sio_config_rts(dptr, 1); /* disable RTS */
} else if (dptr->units[0].flags & UNIT_ATT) {
/* Interrupt Enable */
xptr->tie = (data & M2SIO_RIE) == M2SIO_RIE; /* Receive enable */
xptr->rie = (data & M2SIO_RTSMSK) == M2SIO_RTSLTIE; /* Transmit enable */
/* RTS Control */
s = TMXR_MDM_RTS;
if (dptr->units[0].flags & UNIT_M2SIO_DTR) {
s |= TMXR_MDM_DTR;
}
switch (data & M2SIO_RTSMSK) {
case M2SIO_RTSLTIE:
case M2SIO_RTSLTID:
tmxr_set_get_modem_bits(xptr->tmln, s, 0, NULL);
if (xptr->rts) {
sim_debug(STATUS_MSG, dptr, "RTS state changed to HIGH.\n");
}
xptr->rts = 0; /* Active low */
r = m2sio_config_rts(dptr, 0); /* enable RTS */
break;
case M2SIO_RTSHTID:
case M2SIO_RTSHTBR:
tmxr_set_get_modem_bits(xptr->tmln, 0, s, NULL);
if (!xptr->rts) {
sim_debug(STATUS_MSG, dptr, "RTS state changed to LOW.\n");
}
xptr->rts = 1; /* Active low */
r = m2sio_config_rts(dptr, 1); /* disable RTS */
break;
default:

View file

@ -627,7 +627,6 @@ static t_stat HDC1001_doCommand(void)
uint32 track_len;
uint32 xfr_len;
uint32 file_offset;
uint32 xfr_count = 0;
uint8 rwopts; /* Options specified in the command: DMA, Multi-sector, long. */
/* Abort the read/write operation if C/H/S/N is not valid. */

View file

@ -842,7 +842,7 @@ static t_stat icom_set_membase(UNIT *uptr, int32 val, CONST char *cptr, void *de
}
if (newba) {
r = set_membase(uptr, val, cptr, desc);
r = set_membase(uptr, val, cptr, desc);
if (r) {
sim_debug(ERROR_MSG, &icom_dev, "Error setting MEM resource at 0x%04x\n", icom_info->mem_base);
icom_info->mem_base = 0;