1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-05-03 22:50:05 +00:00

IBM360: Added 3350 drives, fixed bug with overflow records.

This commit is contained in:
Richard Cornwell
2020-05-09 20:19:43 -04:00
parent e44197a69c
commit e445f8a933

View File

@@ -214,11 +214,9 @@ disk_type[] =
{"2314", 203, 20, 7294, 6, 0x14}, /* 29.17 M */ {"2314", 203, 20, 7294, 6, 0x14}, /* 29.17 M */
{"3330", 411, 19, 13165, 24, 0x30}, /* 100.00 M */ {"3330", 411, 19, 13165, 24, 0x30}, /* 100.00 M */
{"3330-2",815, 19, 13165, 24, 0x30}, {"3330-2",815, 19, 13165, 24, 0x30},
#if 0 {"3340", 349, 12, 8535, 24, 0x40}, /* 34.94 M */
{"3340", 349, 12, 8535}, /* 34.94 M */ {"3340-2",698, 12, 8535, 24, 0x40}, /* 69.89 M */
{"3340-2",698, 12, 8535}, /* 69.89 M */ {"3350", 560, 30, 19254, 24, 0x50}, /* 304.80 M */
{"3350", 560, 12, 19254}, /* */
#endif
{NULL, 0} {NULL, 0}
}; };
@@ -641,6 +639,10 @@ index:
if ((rec[0] & rec[1] & rec[2] & rec[3]) == 0xff) { if ((rec[0] & rec[1] & rec[2] & rec[3]) == 0xff) {
state = DK_POS_END; state = DK_POS_END;
data->state = DK_POS_END; data->state = DK_POS_END;
if (data->ovfl == 0) {
data->klen = rec[5];
data->dlen = (rec[6] << 8) | rec[7];
}
sim_debug(DEBUG_POS, dptr, "state end tr unit=%d\n", unit); sim_debug(DEBUG_POS, dptr, "state end tr unit=%d\n", unit);
} else { } else {
if (rec[0] & 0x80) if (rec[0] & 0x80)
@@ -1047,7 +1049,7 @@ sense_end:
ch = *da; ch = *da;
sim_debug(DEBUG_DETAIL, dptr, "readcnt ID unit=%d %d %x %02x %x %d %x\n", sim_debug(DEBUG_DETAIL, dptr, "readcnt ID unit=%d %d %x %02x %x %d %x\n",
unit, count, state, ch, uptr->u4, data->tpos, uptr->u4); unit, count, state, ch, uptr->u4, data->tpos, uptr->u4);
if (count = 0) /* Mask off overflow bit */ if (count == 0) /* Mask off overflow bit */
ch &= 0x7f; ch &= 0x7f;
if (chan_write_byte(addr, &ch) || count == 7) { if (chan_write_byte(addr, &ch) || count == 7) {
uptr->u6 = cmd; uptr->u6 = cmd;
@@ -1075,13 +1077,15 @@ sense_end:
/* Wait for start of record */ /* Wait for start of record */
if (chan_read_byte(addr, &ch)) { if (chan_read_byte(addr, &ch)) {
uptr->u3 |= DK_SHORTSRC; uptr->u3 |= DK_SHORTSRC;
} else if (ch != *da) { } else {
if (count = 0) /* Mask off overflow bit */ if (count == 0) /* Mask off overflow bit */
ch &= 0x7f; ch &= 0x7f;
if ((uptr->u3 & DK_NOEQ) == 0) { if (ch != *da) {
uptr->u3 |= DK_NOEQ; if ((uptr->u3 & DK_NOEQ) == 0) {
if (ch < *da) uptr->u3 |= DK_NOEQ;
uptr->u3 |= DK_HIGH; if (ch < *da)
uptr->u3 |= DK_HIGH;
}
} }
} }
sim_debug(DEBUG_DETAIL, dptr, sim_debug(DEBUG_DETAIL, dptr,
@@ -1234,6 +1238,16 @@ sense_end:
goto rd; goto rd;
case DK_RD_CKD: /* Read count, key and data */ case DK_RD_CKD: /* Read count, key and data */
if (data->ovfl) {
if (count == 0 && state == DK_POS_DATA && data->rec != 0) {
uptr->u3 |= DK_PARAM;
sim_debug(DEBUG_DETAIL, dptr, "RD CKD ov unit=%d %d k=%d d=%d %02x %04x %04x\n",
unit, data->rec, data->klen, data->dlen, data->state, data->dlen,
8 + data->klen + data->dlen);
}
goto rd;
}
/* Wait for any count */ /* Wait for any count */
if (count == 0 && state == DK_POS_CNT && data->rec != 0) { if (count == 0 && state == DK_POS_CNT && data->rec != 0) {
uptr->u3 |= DK_PARAM; uptr->u3 |= DK_PARAM;
@@ -1245,6 +1259,15 @@ sense_end:
goto rd; goto rd;
case DK_RD_KD: /* Read key and data */ case DK_RD_KD: /* Read key and data */
if (data->ovfl) {
if (count == 0 && state == DK_POS_DATA && data->rec != 0) {
uptr->u3 |= DK_PARAM;
sim_debug(DEBUG_DETAIL, dptr, "RD CKD ov unit=%d %d k=%d d=%d %02x %04x %04x\n",
unit, data->rec, data->klen, data->dlen, data->state, data->dlen,
8 + data->klen + data->dlen);
}
goto rd;
}
/* Wait for next key */ /* Wait for next key */
if (count == 0 && ((data->klen != 0 && state == DK_POS_KEY) || if (count == 0 && ((data->klen != 0 && state == DK_POS_KEY) ||
(data->klen == 0 && state == DK_POS_DATA))) { (data->klen == 0 && state == DK_POS_DATA))) {
@@ -1262,6 +1285,7 @@ sense_end:
case DK_RD_D: /* Read Data */ case DK_RD_D: /* Read Data */
/* Wait for next data */ /* Wait for next data */
if (count == 0 && state == DK_POS_DATA) { if (count == 0 && state == DK_POS_DATA) {
/* Skip R0 */
if ((uptr->u3 & DK_INDEX) && data->rec == 0 && if ((uptr->u3 & DK_INDEX) && data->rec == 0 &&
(uptr->u3 & DK_SRCOK) == 0) (uptr->u3 & DK_SRCOK) == 0)
break; break;
@@ -1283,11 +1307,16 @@ rd:
chan_end(addr, SNS_CHNEND|SNS_DEVEND|SNS_UNITEXP); chan_end(addr, SNS_CHNEND|SNS_DEVEND|SNS_UNITEXP);
break; break;
} }
if (state == DK_POS_INDEX && data->ovfl == 0) { if (state == DK_POS_INDEX) {
uptr->u5 = SNS_TRKOVR << 8; if (data->ovfl == 0) {
uptr->u3 &= ~(0xff|DK_PARAM); uptr->u5 = SNS_TRKOVR << 8;
chan_end(addr, SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK); uptr->u3 &= ~(0xff|DK_PARAM);
break; chan_end(addr, SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK);
break;
} else {
uptr->u3 &= ~(DK_PARAM);
break;
}
} }
if (state == DK_POS_DATA && count == data->dlen) { if (state == DK_POS_DATA && count == data->dlen) {
sim_debug(DEBUG_DETAIL, dptr, sim_debug(DEBUG_DETAIL, dptr,