1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-01-30 05:24:52 +00:00

IBM360: Add support for 3400 tape drives.

This commit is contained in:
Richard Cornwell
2024-01-25 17:59:11 -05:00
parent 8cc79906e8
commit 32788919c4

View File

@@ -43,6 +43,7 @@
#define DEV_BUF_NUM(x) (((x) & 07) << DEV_V_UF)
#define GET_DEV_BUF(x) (((x) >> DEV_V_UF) & 07)
#define MT_BUSY (1 << (MTUF_V_UF + 1)) /* Flag to send a CUE */
#define MTUF_3400 (1 << (MTUF_V_UF + 2))
#define UNIT_MT(x) UNIT_ATTABLE | UNIT_DISABLE | UNIT_ROABLE | MTUF_9TR | \
DEV_BUF_NUM(x)
@@ -59,14 +60,19 @@
#define MT_BSF 0x2f /* Back space file */
#define MT_FSR 0x37 /* Forward space record */
#define MT_FSF 0x3f /* Forward space file */
#define MT_SECURE_ERA 0x97 /* 3400 Security erase */
#define MT_SENSE_RES 0xf4 /* 3400 Sense reserve */
#define MT_SENSE_REL 0xb4 /* 3400 Sense release */
#define MT_RTIE 0x1b /* Request track in error */
#define MT_MODE 0x03 /* Mode command */
#define MT_MODEMSK 0x07 /* Mode Mask */
#define MT_MDEN_200 0x00 /* 200 BPI mode 7 track only */
#define MT_MDEN_556 0x40 /* 556 BPI mode 7 track only */
#define MT_MDEN_800 0x80 /* 800 BPI mode 7 track only */
#define MT_MDEN_1600 0xc0 /* 1600 BPI mode 9 track only */
#define MT_MDEN_MSK 0xc0 /* Density mask */
#define MT_MDEN_200 0x000 /* 200 BPI mode 7 track only */
#define MT_MDEN_556 0x040 /* 556 BPI mode 7 track only */
#define MT_MDEN_800 0x080 /* 800 BPI mode 7 track only */
#define MT_MDEN_1600 0x0c0 /* 1600 BPI mode 9 track only */
#define MT_MDEN_6520 0x1c0 /* 6520 BPI mode 9 track only */
#define MT_MDEN_MSK 0x1c0 /* Density mask */
#define MT_CTL_MSK 0x38 /* Mask for control flags */
#define MT_CTL_NOP 0x00 /* Nop control mode */
@@ -163,6 +169,8 @@ MTAB mt_mod[] = {
{MTUF_WLK, MTUF_WLK, "write locked", "LOCKED", NULL},
{MTUF_9TR, 0, "7 track", "7T", NULL},
{MTUF_9TR, MTUF_9TR, "9 track", "9T", NULL},
{MTUF_3400, 0, "2400", "2400", NULL},
{MTUF_3400, MTUF_3400, "3400", "3400", NULL},
{MTAB_XTD | MTAB_VUN, 0, "FORMAT", "FORMAT",
&sim_tape_set_fmt, &sim_tape_show_fmt, NULL},
{MTAB_XTD | MTAB_VUN | MTAB_VALR, 0, "DEV", "DEV", &set_dev_addr,
@@ -284,9 +292,15 @@ uint8 mt_startcmd(UNIT *uptr, uint8 cmd) {
case 0x2: /* Read command */
case 0xc: /* Read backward */
uptr->SNS = 0;
/* Fall through */
goto do_cmd;
case 0x4: /* Sense */
if ((cmd & 0xf0) != 0) {
uptr->SNS |= SNS_CMDREJ;
uptr->flags &= ~MT_BUSY;
return SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK|f;
}
do_cmd:
if ((uptr->CMD & MT_CMDREW) != 0) {
sim_debug(DEBUG_CMD, dptr, "CMD rewinding unit=%d %x\n", unit, cmd);
return SNS_BSY;
@@ -361,6 +375,8 @@ uint8 mt_startcmd(UNIT *uptr, uint8 cmd) {
uptr->CMD &= ~MT_MDEN_MSK;
if (cmd & 0x8)
uptr->CMD |= MT_MDEN_800;
else if (cmd & 0x10)
uptr->CMD |= MT_MDEN_6520;
else
uptr->CMD |= MT_MDEN_1600;
}
@@ -499,6 +515,65 @@ t_stat mt_srv(UNIT * uptr)
chan_write_byte(addr, &ch) ;
ch = SNS_BYTE5;
chan_write_byte(addr, &ch);
if ((uptr->flags & MTUF_3400) != 0) {
/* Sense byte 6 */
ch = 0x23; /* Model 3, Support dual density */
if ((uptr->flags & MTUF_9TR) == 0) {
ch |= 0x80; /* Indicate 7 track */
}
chan_write_byte(addr, &ch);
/* Sense byte 7 */
ch = 0;
chan_write_byte(addr, &ch);
/* Sense byte 8 */
ch = 0;
chan_write_byte(addr, &ch);
/* Sense byte 9 */
ch = 0;
chan_write_byte(addr, &ch);
/* Sense byte 10 */
ch = (uptr->CMD & SNS_CMDREJ);
chan_write_byte(addr, &ch);
/* Sense byte 11 */
ch = 0;
chan_write_byte(addr, &ch);
/* Sense byte 12 */
ch = 0;
chan_write_byte(addr, &ch);
/* Sense byte 13 */
ch = (uptr->flags & MTUF_9TR) ? 0x80 : 0x40;
chan_write_byte(addr, &ch);
/* Sense byte 14 */
ch = 0;
chan_write_byte(addr, &ch);
/* Sense byte 15 */
ch = 0;
chan_write_byte(addr, &ch);
/* Sense byte 16 */
ch = 0;
chan_write_byte(addr, &ch);
/* Sense byte 17 */
ch = 0; /* No features */
chan_write_byte(addr, &ch);
/* Sense byte 18 */
ch = 0;
chan_write_byte(addr, &ch);
/* Sense byte 19 */
ch = 0;
chan_write_byte(addr, &ch);
/* Sense byte 20 */
ch = 0;
chan_write_byte(addr, &ch);
/* Sense byte 21 */
ch = 0;
chan_write_byte(addr, &ch);
/* Sense byte 22 */
ch = 0;
chan_write_byte(addr, &ch);
/* Sense byte 23 */
ch = 0;
chan_write_byte(addr, &ch);
}
uptr->CMD &= ~MT_CMDMSK;
mt_busy[bufnum] &= ~1;
if (uptr->flags & MT_BUSY) {