1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-02-04 15:43:38 +00:00

ICL1900: Fixes to help E6RM run better.

This commit is contained in:
Richard Cornwell
2018-09-09 22:37:37 -04:00
parent c9031657a5
commit 688fb9b86c
4 changed files with 76 additions and 68 deletions

View File

@@ -462,6 +462,8 @@ intr:
RA |= B1;
} else {
if (CPU_TYPE >= TYPE_C1) {
Mem_read(RD+9, &RA, 0);
RA &= 077777;
if (Zero)
RA |= B3;
if (OPIP | PIP)
@@ -471,7 +473,7 @@ intr:
}
RA = RC & adrmask;
if (BV)
RA |= B0;
RA |= B0;
if (io_flags & EXT_IO) {
if (BCarry)
RA |= B1;
@@ -570,7 +572,7 @@ obey:
OPIP = PIP;
PIP = 0;
if (hst_lnt) { /* history enabled? */
if (hst_lnt && RC != 7) { /* history enabled? */
hst_p = (hst_p + 1); /* next entry */
if (hst_p >= hst_lnt)
hst_p = 0;
@@ -2266,14 +2268,16 @@ voluntary:
reason = SCPE_STOP;
break;
}
if (CPU_TYPE < TYPE_C1 && !exe_mode)
if ((CPU_TYPE < TYPE_C1) && !exe_mode)
RC += RD;
exe_mode = 1;
/* Store registers */
Mem_write(RD+13, &facch, 0); /* Save F.P.U. */
Mem_write(RD+12, &faccl, 0);
if (CPU_TYPE >= TYPE_C1) {
RA = 0; /* Build ZSTAT */
Mem_read(RD+9, &RA, 0);
RA &= 077777;
/* Build ZSTAT and ASTAT */
if (Zero)
RA |= B3;
if (OPIP)

View File

@@ -113,9 +113,11 @@ void cty_cmd(int dev, uint32 cmd) {
cty_unit[u].STATUS = BUSY;
if (!u)
sim_activate(&cty_unit[u], cty_unit[u].wait);
sim_debug(DEBUG_CMD, &cty_dev, "start %d\n", dev);
}
if (cmd & STOP) {
cty_unit[u].STATUS &= ~BUSY;
sim_debug(DEBUG_CMD, &cty_dev, "stop %d\n", dev);
}
chan_clr_done(GET_UADDR(cty_unit[u].flags));
}
@@ -205,7 +207,7 @@ t_stat ctyi_svc (UNIT *uptr)
uptr->HOLD = 0;
return SCPE_OK;
}
if (uptr->CMD && (uptr->STATUS & BUSY) != 0) {
if (uptr->CMD) {
/* Handle end of buffer */
switch (ch) {
case '\r':
@@ -263,7 +265,7 @@ t_stat ctyi_svc (UNIT *uptr)
sim_putchar (ch);
if (eor) {
uptr->CMD = 0;
uptr->STATUS |= END;
uptr->STATUS |= ACCEPT|END;
chan_set_done(dev);
}
break;
@@ -290,7 +292,7 @@ t_stat ctyi_svc (UNIT *uptr)
break;
default:
sim_debug(DEBUG_DATA, &cty_dev, ": key '%c'\n", ch);
sim_debug(DEBUG_DATA, &cty_dev, ": ikey '%c'\n", ch);
sim_putchar('\007');
}
}

View File

@@ -176,11 +176,13 @@ void eds8_cmd(int dev, uint32 cmd, uint32 *resp) {
*resp |= STQ_CTL_RDY;
if ((uptr->flags & UNIT_ATT) != 0)
*resp |= STQ_P1;
uptr->CMD &= ~EDS8_TERM;
chan_clr_done(dev);
} else if (cmd == SEND_P) {
*resp = (uptr->CMD >> 10) & 036;
if ((uptr->flags & UNIT_ATT) != 0)
*resp |= 1;
uptr->CMD &= ~(036 << 10);
}
sim_debug(DEBUG_STATUS, &eds8_dev, "Status: unit:=%d %02o %02o\n", eds8_drive, cmd, *resp);
return;
@@ -217,7 +219,7 @@ void eds8_cmd(int dev, uint32 cmd, uint32 *resp) {
}
uptr->CMD = cmd;
if ((uptr->CMD & (EDS8_QUAL1|EDS8_QUAL2)) == 0) {
sim_debug(DEBUG_CMD, &eds8_dev, "Cmd: unit=%d start %02o\n", eds8_drive, uptr->CMD);
sim_debug(DEBUG_CMD, &eds8_dev, "Cmd: unit=%d start %02o\n", eds8_drive, uptr->CMD);
eds8_busy = 1;
uptr->CMD |= EDS8_BUSY;
chan_clr_done(dev);
@@ -286,7 +288,7 @@ t_stat eds8_svc (UNIT *uptr)
case EDS8_DISC:
/* Retract heads and offline the drive */
detach_unit(uptr);
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM;
eds8_busy = 0;
chan_set_done(dev);
@@ -298,11 +300,11 @@ t_stat eds8_svc (UNIT *uptr)
int trk = (uptr->CMD >> 16) & 0377;
if (uptr->CYL == trk) {
/* Terminate */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM|EDS8_IRQ;
} else if (trk > CYLS) {
/* Terminate with error */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM|EDS8_PATH;
} else {
uptr->CMD |= EDS8_RUN|EDS8_SK;
@@ -314,7 +316,7 @@ t_stat eds8_svc (UNIT *uptr)
}
if (uptr->CYL == ((uptr->CMD >> 16) & 0377)) {
/* Terminate */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM|EDS8_IRQ;
chan_set_done(dev);
}
@@ -328,7 +330,7 @@ t_stat eds8_svc (UNIT *uptr)
uptr->HDSEC = (uptr->CMD >> 16) & 0377;
if (((uptr->HDSEC >> 4) & 017) > HD_CYL || (uptr->HDSEC & 017) > SECT_TRK) {
/* Terminate wrong track */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM|EDS8_PATH;
eds8_busy = 0;
chan_set_done(dev);
@@ -336,12 +338,12 @@ t_stat eds8_svc (UNIT *uptr)
}
}
if (eor = chan_output_word(dev, &word, 0)) {
/* Terminate */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
uptr->CMD |= EDS8_TERM;
eds8_busy = 0;
chan_set_done(dev);
break;
/* Terminate */
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM;
eds8_busy = 0;
chan_set_done(dev);
break;
}
uptr->HDSEC += 9; /* Bump sector number, if more then 8, will bump head */
@@ -349,11 +351,11 @@ t_stat eds8_svc (UNIT *uptr)
/* If empty buffer, fill */
if (((uptr->HDSEC >> 4) & 017) > HD_CYL) {
/* Terminate long read */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
uptr->CMD |= EDS8_TERM|EDS8_LONG;
eds8_busy = 0;
chan_set_done(dev);
break;
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM|EDS8_LONG;
eds8_busy = 0;
chan_set_done(dev);
break;
}
sim_activate(uptr, 100);
break;
@@ -384,7 +386,7 @@ t_stat eds8_svc (UNIT *uptr)
uptr->HDSEC = (uptr->CMD >> 16) & 0377;
if (((uptr->HDSEC >> 4) & 017) > HD_CYL || (uptr->HDSEC & 017) > SECT_TRK) {
/* Terminate wrong track */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM|EDS8_PATH;
eds8_busy = 0;
chan_set_done(dev);
@@ -405,8 +407,8 @@ t_stat eds8_svc (UNIT *uptr)
(((uptr->HDSEC >> 4) & 017) << 6) |
((uptr->HDSEC << 1) & 016);
if (eor = chan_input_word(dev, &word, 0)) {
/* Terminate */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
/* Terminate */
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM;
eds8_busy = 0;
chan_set_done(dev);
@@ -416,8 +418,8 @@ t_stat eds8_svc (UNIT *uptr)
for (i = 0; i < WD_SEC; i++) {
if (eor = chan_input_word(dev, &eds8_buffer[i], 0)) {
/* Terminate */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
/* Terminate */
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM;
eds8_busy = 0;
chan_set_done(dev);
@@ -438,8 +440,8 @@ t_stat eds8_svc (UNIT *uptr)
}
word = ((even & 017) << 12) | (((odd ^ 017) & 017) << 8) | 0100;
if (eor = chan_input_word(dev, &word, 0)) {
/* Terminate */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
/* Terminate */
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM;
eds8_busy = 0;
chan_set_done(dev);
@@ -452,11 +454,11 @@ t_stat eds8_svc (UNIT *uptr)
/* If empty buffer, fill */
if (((uptr->HDSEC >> 4) & 017) > HD_CYL) {
/* Terminate long read */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
uptr->CMD |= EDS8_TERM|EDS8_LONG;
eds8_busy = 0;
chan_set_done(dev);
break;
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM|EDS8_LONG;
eds8_busy = 0;
chan_set_done(dev);
break;
}
sim_activate(uptr, 100);
break;
@@ -466,19 +468,19 @@ t_stat eds8_svc (UNIT *uptr)
if ((uptr->CMD & EDS8_RUN) == 0) {
/* Write the starting at head/sector, if check, then check
that data can be read back at end of each track */
/* Check if write protected */
if ((uptr->flags & (UNIT_RO|UNIT_WLK)) != 0) {
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
uptr->CMD |= EDS8_TERM|EDS8_ERR;
eds8_busy = 0;
chan_set_done(dev);
break;
}
/* Check if write protected */
if ((uptr->flags & (UNIT_RO|UNIT_WLK)) != 0) {
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM|EDS8_ERR;
eds8_busy = 0;
chan_set_done(dev);
break;
}
uptr->CMD |= EDS8_RUN;
uptr->HDSEC = (uptr->CMD >> 16) & 0360;
if (((uptr->HDSEC >> 4) & 017) > HD_CYL) {
/* Terminate wrong track */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
/* Terminate wrong track */
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM|EDS8_PATH;
eds8_busy = 0;
chan_set_done(dev);
@@ -497,11 +499,11 @@ t_stat eds8_svc (UNIT *uptr)
/* If empty buffer, fill */
if ((uptr->HDSEC & 010) != 0) {
/* Terminate */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
uptr->CMD |= EDS8_TERM;
eds8_busy = 0;
chan_set_done(dev);
break;
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM;
eds8_busy = 0;
chan_set_done(dev);
break;
}
sim_activate(uptr, 100);
break;
@@ -511,19 +513,19 @@ t_stat eds8_svc (UNIT *uptr)
/* Write the starting at head/sector, if check, then check
that data can be read back at end of each track */
if ((uptr->CMD & EDS8_RUN) == 0) {
/* Check if write protected */
if ((uptr->flags & (UNIT_RO|UNIT_WLK)) != 0) {
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
/* Check if write protected */
if ((uptr->flags & (UNIT_RO|UNIT_WLK)) != 0) {
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM|EDS8_ERR;
eds8_busy = 0;
chan_set_done(dev);
break;
}
}
uptr->CMD |= EDS8_RUN;
uptr->HDSEC = (uptr->CMD >> 16) & 0377;
if (((uptr->HDSEC >> 4) & 017) > HD_CYL || (uptr->HDSEC & 017) > SECT_TRK) {
/* Terminate wrong track */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM|EDS8_PATH;
eds8_busy = 0;
chan_set_done(dev);
@@ -545,12 +547,12 @@ t_stat eds8_svc (UNIT *uptr)
if (eor) {
/* Terminate */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
uptr->CMD |= EDS8_TERM;
eds8_busy = 0;
chan_set_done(dev);
break;
}
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM;
eds8_busy = 0;
chan_set_done(dev);
break;
}
uptr->HDSEC += 9; /* Bump sector number, if more then 8, will bump head */
@@ -558,11 +560,11 @@ t_stat eds8_svc (UNIT *uptr)
/* If empty buffer, fill */
if (((uptr->HDSEC >> 4) & 017) > HD_CYL) {
/* Terminate long read */
uptr->CMD &= EDS8_RUN|EDS8_SK|EDS8_BUSY;
uptr->CMD |= EDS8_TERM|EDS8_LONG;
eds8_busy = 0;
chan_set_done(dev);
break;
uptr->CMD &= ~(EDS8_RUN|EDS8_SK|EDS8_BUSY);
uptr->CMD |= EDS8_TERM|EDS8_LONG;
eds8_busy = 0;
chan_set_done(dev);
break;
}
sim_activate(uptr, 100);
break;

View File

@@ -200,7 +200,7 @@ void mt_cmd(int dev, uint32 cmd, uint32 *resp) {
}
sim_debug(DEBUG_CMD, &mt_dev, "Cmd: unit=%d %02o\n", mt_drive, cmd);
if ((uptr->flags & UNIT_ATT) == 0) {
*resp = 3;
*resp = 0;
return;
}
if (mt_busy || (uptr->CMD & MT_BUSY)) {