mirror of
https://github.com/rcornwell/sims.git
synced 2026-04-30 21:40:14 +00:00
IBM360: Patches to allow DOS/360 and OS/360 to build.
This commit is contained in:
@@ -604,7 +604,7 @@ int startio(uint16 addr) {
|
||||
}
|
||||
if (chan_status[chan] & STATUS_BUSY) {
|
||||
M[0x40 >> 2] = 0;
|
||||
M[0x44 >> 2] = ((uint32)chan_status[chan]<<16);// | M[0x44 >> 2] & 0xffff;
|
||||
M[0x44 >> 2] = ((uint32)chan_status[chan]<<16);
|
||||
sim_debug(DEBUG_EXP, &cpu_dev, "Channel store csw %02x %08x\n",
|
||||
chan, M[0x44 >> 2]);
|
||||
chan_status[chan] = 0;
|
||||
@@ -634,7 +634,6 @@ int testio(uint16 addr) {
|
||||
sim_debug(DEBUG_CMD, &cpu_dev, "TIO %x %x %x %x cc=1\n", addr, chan,
|
||||
ccw_cmd[chan], ccw_flags[chan]);
|
||||
store_csw(chan);
|
||||
// chan_dev[chan] = 0;
|
||||
return 1;
|
||||
}
|
||||
if (ccw_cmd[chan] != 0 || (ccw_flags[chan] & (FLAG_CD|FLAG_CC)) != 0) {
|
||||
|
||||
@@ -76,7 +76,6 @@ con_data[NUM_DEVS_CON];
|
||||
uint8 con_startcmd(UNIT *, uint16, uint8);
|
||||
void con_ini(UNIT *, t_bool);
|
||||
t_stat con_srv(UNIT *);
|
||||
t_stat con_reset(DEVICE *);
|
||||
t_stat con_attach(UNIT *, char *);
|
||||
t_stat con_detach(UNIT *);
|
||||
|
||||
@@ -110,6 +109,7 @@ void
|
||||
con_ini(UNIT *uptr, t_bool f) {
|
||||
int u = (uptr - con_unit);
|
||||
con_data[u].inptr = 0;
|
||||
uptr->u3 &= ~CON_MSK;
|
||||
uptr->u5 = 0;
|
||||
sim_activate(uptr, 1000);
|
||||
}
|
||||
@@ -262,7 +262,6 @@ con_srv(UNIT *uptr) {
|
||||
case '\r':
|
||||
case '\n':
|
||||
sim_debug(DEBUG_DATA, &con_dev, "%d: ent\n", u);
|
||||
// if (con_data[u].inptr != 0)
|
||||
uptr->u3 |= CON_INPUT;
|
||||
uptr->u3 |= CON_CR;
|
||||
sim_putchar('\r');
|
||||
|
||||
@@ -405,7 +405,7 @@ uint8 dasd_startcmd(UNIT *uptr, uint16 chan, uint8 cmd) {
|
||||
if (cmd == 0x0)
|
||||
return SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK;
|
||||
|
||||
uptr->u5 = 0x48; //SNS_INTVENT|SNS_CMDREJ;
|
||||
uptr->u5 = 0x48; /*SNS_INTVENT|SNS_CMDREJ; */
|
||||
return SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK;
|
||||
}
|
||||
|
||||
@@ -419,6 +419,7 @@ uint8 dasd_startcmd(UNIT *uptr, uint16 chan, uint8 cmd) {
|
||||
case 0x2: /* Read command */
|
||||
uptr->u3 &= ~(DK_PARAM);
|
||||
uptr->u3 |= cmd;
|
||||
uptr->u5 = 0;
|
||||
return 0;
|
||||
|
||||
case 0x0: /* Status */
|
||||
@@ -460,7 +461,7 @@ void dasd_adjpos(UNIT * uptr)
|
||||
/* Check for end of track */
|
||||
if ((rec[0] & rec[1] & rec[2] & rec[3]) == 0xff)
|
||||
data->state = DK_POS_END;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DK_POS_CNT: /* In count (c) */
|
||||
if (data->count == 0) {
|
||||
@@ -557,6 +558,8 @@ t_stat dasd_srv(UNIT * uptr)
|
||||
sim_debug(DEBUG_DETAIL, dptr, "adv head unit=%d %02x %d %d %02x\n",
|
||||
unit, state, data->tpos, uptr->u4 & 0xff, data->filemsk);
|
||||
if ((data->filemsk & DK_MSK_SK) == DK_MSK_SKNONE) {
|
||||
sim_debug(DEBUG_DETAIL, dptr, "end cyl skmsk unit=%d %02x %d %02x\n",
|
||||
unit, state, data->tpos, data->filemsk);
|
||||
uptr->u5 = (SNS_WRP << 8);
|
||||
uptr->u3 &= ~0xff;
|
||||
chan_end(addr, SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK);
|
||||
@@ -576,23 +579,12 @@ t_stat dasd_srv(UNIT * uptr)
|
||||
if ((uptr->u3 & 0x7) == 1 && (uptr->u3 & 0x60) != 0)
|
||||
uptr->u3 &= ~DK_INDEX;
|
||||
}
|
||||
if ((uptr->u4 & 0xff) >= disk_type[type].heads) {
|
||||
sim_debug(DEBUG_DETAIL, dptr, "end cyl unit=%d %02x %d\n",
|
||||
unit, state, data->tpos);
|
||||
uptr->u5 = (SNS_ENDCYL << 8);
|
||||
data->tstart = 0;
|
||||
uptr->u4 &= ~0xff;
|
||||
uptr->u3 &= ~0xff;
|
||||
chan_end(addr, SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK);
|
||||
}
|
||||
/* If INDEX set signal no record if read */
|
||||
if ((cmd & 0x03) == 0x01 && uptr->u3 & DK_INDEX) {
|
||||
sim_debug(DEBUG_DETAIL, dptr, "index unit=%d %02x %d\n",
|
||||
unit, state, data->tpos);
|
||||
/* No seeks allowed, error out */
|
||||
if ((data->filemsk & DK_MSK_SK) == DK_MSK_SKNONE)
|
||||
uptr->u5 |= (SNS_WRP << 8);
|
||||
else
|
||||
sim_debug(DEBUG_DETAIL, dptr, "index unit=%d %02x %d %04x\n",
|
||||
unit, state, data->tpos, uptr->u5);
|
||||
/* Unless command is Read Header, return No record found */
|
||||
if (cmd != DK_RD_HA)
|
||||
uptr->u5 |= (SNS_NOREC << 8);
|
||||
uptr->u3 &= ~0xff;
|
||||
chan_end(addr, SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK);
|
||||
@@ -728,41 +720,52 @@ index:
|
||||
case 0x4: /* Sense */
|
||||
ch = uptr->u5 & 0xff;
|
||||
sim_debug(DEBUG_DETAIL, dptr, "sense unit=%d 1 %x\n", unit, ch);
|
||||
chan_write_byte(addr, &ch) ;
|
||||
if (chan_write_byte(addr, &ch))
|
||||
goto sense_end;
|
||||
ch = (uptr->u5 >> 8) & 0xff;
|
||||
sim_debug(DEBUG_DETAIL, dptr, "sense unit=%d 2 %x\n", unit, ch);
|
||||
chan_write_byte(addr, &ch) ;
|
||||
if (chan_write_byte(addr, &ch))
|
||||
goto sense_end;
|
||||
ch = 0;
|
||||
sim_debug(DEBUG_DETAIL, dptr, "sense unit=%d 3 %x\n", unit, ch);
|
||||
chan_write_byte(addr, &ch) ;
|
||||
if (chan_write_byte(addr, &ch))
|
||||
goto sense_end;
|
||||
if (disk_type[type].sen_cnt > 6) {
|
||||
ch = 0;
|
||||
sim_debug(DEBUG_DETAIL, dptr, "sense unit=%d 4 %x\n", unit, ch);
|
||||
chan_write_byte(addr, &ch) ;
|
||||
if (chan_write_byte(addr, &ch))
|
||||
goto sense_end;
|
||||
ch = unit;
|
||||
sim_debug(DEBUG_DETAIL, dptr, "sense unit=%d 5 %x\n", unit, ch);
|
||||
chan_write_byte(addr, &ch) ;
|
||||
if (chan_write_byte(addr, &ch))
|
||||
goto sense_end;
|
||||
ch = (uptr->u4 >> 8) & 0xff;
|
||||
sim_debug(DEBUG_DETAIL, dptr, "sense unit=%d 6 %x\n", unit, ch);
|
||||
chan_write_byte(addr, &ch) ;
|
||||
if (chan_write_byte(addr, &ch))
|
||||
goto sense_end;
|
||||
ch = (uptr->u4 & 0x1f) | ((uptr->u4 & 0x10000) ? 0x40 : 0);
|
||||
sim_debug(DEBUG_DETAIL, dptr, "sense unit=%d 7 %x\n", unit, ch);
|
||||
chan_write_byte(addr, &ch) ;
|
||||
if (chan_write_byte(addr, &ch))
|
||||
goto sense_end;
|
||||
ch = 0; /* Compute message code */
|
||||
sim_debug(DEBUG_DETAIL, dptr, "sense unit=%d 8 %x\n", unit, ch);
|
||||
chan_write_byte(addr, &ch) ;
|
||||
if (chan_write_byte(addr, &ch))
|
||||
goto sense_end;
|
||||
i = 8;
|
||||
} else {
|
||||
ch = unit;
|
||||
sim_debug(DEBUG_DETAIL, dptr, "sense unit=%d 4 %x\n", unit, ch);
|
||||
chan_write_byte(addr, &ch) ;
|
||||
if (chan_write_byte(addr, &ch))
|
||||
goto sense_end;
|
||||
i = 4;
|
||||
}
|
||||
ch = 0;
|
||||
for (; i < disk_type[type].sen_cnt; i++) {
|
||||
sim_debug(DEBUG_DETAIL, dptr, "sense unit=%d %d %x\n", unit, i, ch);
|
||||
chan_write_byte(addr, &ch) ;
|
||||
if (chan_write_byte(addr, &ch))
|
||||
goto sense_end;
|
||||
}
|
||||
sense_end:
|
||||
uptr->u3 &= ~(0xff|DK_INDEX);
|
||||
chan_end(addr, SNS_CHNEND|SNS_DEVEND);
|
||||
break;
|
||||
@@ -1284,7 +1287,7 @@ rd:
|
||||
uptr->u6 = cmd;
|
||||
uptr->u3 &= ~(0xff|DK_PARAM);
|
||||
chan_end(addr, SNS_CHNEND|SNS_DEVEND);
|
||||
for(i = 0; i < 8; i++)
|
||||
for(i = 1; i < 9; i++)
|
||||
da[i] = 0xff;
|
||||
}
|
||||
}
|
||||
@@ -1477,7 +1480,7 @@ wrckd:
|
||||
/* Write end mark */
|
||||
for(i = 0; i < 8; i++)
|
||||
rec[i] = 0xff;
|
||||
|
||||
|
||||
uptr->u6 = cmd;
|
||||
uptr->u3 &= ~(0xff|DK_PARAM|DK_INDEX);
|
||||
uptr->u3 |= DK_CYL_DIRTY;
|
||||
@@ -1599,7 +1602,6 @@ dasd_format(UNIT * uptr, int flag) {
|
||||
return 0;
|
||||
} else
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
t_stat
|
||||
@@ -1681,7 +1683,7 @@ dasd_detach(UNIT * uptr)
|
||||
data->tsize * disk_type[type].heads, uptr->fileref);
|
||||
uptr->u3 &= ~DK_CYL_DIRTY;
|
||||
}
|
||||
if (cmd != 0)
|
||||
if (cmd != 0)
|
||||
chan_end(addr, SNS_CHNEND|SNS_DEVEND);
|
||||
sim_cancel(uptr);
|
||||
free(data->cbuf);
|
||||
|
||||
@@ -102,7 +102,7 @@ MTAB lpr_mod[] = {
|
||||
{0}
|
||||
};
|
||||
|
||||
struct dib lpr_dib = { 0xFF, 1, NULL, lpr_startcmd, NULL, lpr_unit};
|
||||
struct dib lpr_dib = { 0xFF, 1, NULL, lpr_startcmd, NULL, lpr_unit, lpr_ini};
|
||||
|
||||
DEVICE lpr_dev = {
|
||||
"LPR", lpr_unit, NULL, lpr_mod,
|
||||
@@ -273,6 +273,9 @@ lpr_srv(UNIT *uptr) {
|
||||
|
||||
void
|
||||
lpr_ini(UNIT *uptr, t_bool f) {
|
||||
uptr->u3 &= ~(LPR_FULL|LPR_CMDMSK);
|
||||
uptr->u4 = 0;
|
||||
uptr->u5 = 0;
|
||||
}
|
||||
|
||||
t_stat
|
||||
|
||||
@@ -40,9 +40,10 @@
|
||||
#ifdef NUM_DEVS_MT
|
||||
#define BUFFSIZE (64 * 1024)
|
||||
#define MTUF_9TR (1 << MTUF_V_UF)
|
||||
#define UNIT_MT UNIT_ATTABLE | UNIT_DISABLE | UNIT_ROABLE | MTUF_9TR
|
||||
#define DEV_BUF_NUM(x) (((x) & 07) << DEV_V_UF)
|
||||
#define GET_DEV_BUF(x) (((x) >> DEV_V_UF) & 07)
|
||||
#define UNIT_MT(x) UNIT_ATTABLE | UNIT_DISABLE | UNIT_ROABLE | MTUF_9TR | \
|
||||
DEV_BUF_NUM(x)
|
||||
|
||||
|
||||
|
||||
@@ -159,14 +160,14 @@ MTAB mt_mod[] = {
|
||||
};
|
||||
|
||||
UNIT mta_unit[] = {
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x180)}, /* 0 */
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x181)}, /* 1 */
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x182)}, /* 2 */
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x183)}, /* 3 */
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x184)}, /* 4 */
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x185)}, /* 5 */
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x186)}, /* 6 */
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x187)}, /* 7 */
|
||||
{UDATA(&mt_srv, UNIT_MT(0), 0), 0, UNIT_ADDR(0x180)}, /* 0 */
|
||||
{UDATA(&mt_srv, UNIT_MT(0), 0), 0, UNIT_ADDR(0x181)}, /* 1 */
|
||||
{UDATA(&mt_srv, UNIT_MT(0), 0), 0, UNIT_ADDR(0x182)}, /* 2 */
|
||||
{UDATA(&mt_srv, UNIT_MT(0), 0), 0, UNIT_ADDR(0x183)}, /* 3 */
|
||||
{UDATA(&mt_srv, UNIT_MT(0), 0), 0, UNIT_ADDR(0x184)}, /* 4 */
|
||||
{UDATA(&mt_srv, UNIT_MT(0), 0), 0, UNIT_ADDR(0x185)}, /* 5 */
|
||||
{UDATA(&mt_srv, UNIT_MT(0), 0), 0, UNIT_ADDR(0x186)}, /* 6 */
|
||||
{UDATA(&mt_srv, UNIT_MT(0), 0), 0, UNIT_ADDR(0x187)}, /* 7 */
|
||||
};
|
||||
|
||||
struct dib mta_dib = { 0xF8, NUM_UNITS_MT, NULL, mt_startcmd, NULL, mta_unit, mt_ini};
|
||||
@@ -180,14 +181,14 @@ DEVICE mta_dev = {
|
||||
|
||||
#if NUM_DEVS_MT > 1
|
||||
UNIT mtb_unit[] = {
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x280)}, /* 0 */
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x281)}, /* 1 */
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x282)}, /* 2 */
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x283)}, /* 3 */
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x284)}, /* 4 */
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x285)}, /* 5 */
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x286)}, /* 6 */
|
||||
{UDATA(&mt_srv, UNIT_MT, 0), 0, UNIT_ADDR(0x287)}, /* 7 */
|
||||
{UDATA(&mt_srv, UNIT_MT(1), 0), 0, UNIT_ADDR(0x280)}, /* 0 */
|
||||
{UDATA(&mt_srv, UNIT_MT(1), 0), 0, UNIT_ADDR(0x281)}, /* 1 */
|
||||
{UDATA(&mt_srv, UNIT_MT(1), 0), 0, UNIT_ADDR(0x282)}, /* 2 */
|
||||
{UDATA(&mt_srv, UNIT_MT(1), 0), 0, UNIT_ADDR(0x283)}, /* 3 */
|
||||
{UDATA(&mt_srv, UNIT_MT(1), 0), 0, UNIT_ADDR(0x284)}, /* 4 */
|
||||
{UDATA(&mt_srv, UNIT_MT(1), 0), 0, UNIT_ADDR(0x285)}, /* 5 */
|
||||
{UDATA(&mt_srv, UNIT_MT(1), 0), 0, UNIT_ADDR(0x286)}, /* 6 */
|
||||
{UDATA(&mt_srv, UNIT_MT(1), 0), 0, UNIT_ADDR(0x287)}, /* 7 */
|
||||
};
|
||||
|
||||
struct dib mtb_dib = { 0xF8, NUM_UNITS_MT, NULL, mt_startcmd, NULL, mtb_unit, mt_ini};
|
||||
@@ -857,7 +858,7 @@ mt_ini(UNIT * uptr, t_bool f)
|
||||
{
|
||||
DEVICE *dptr = find_dev_from_unit(uptr);
|
||||
|
||||
uptr->u3 &= ~0xffff;
|
||||
uptr->u3 &= UNIT_ADDR_MASK;
|
||||
if ((uptr->flags & MTUF_9TR) == 0)
|
||||
uptr->u3 |= MT_ODD|MT_CONV|MT_MDEN_800;
|
||||
mt_busy[GET_DEV_BUF(dptr->flags)] = 0;
|
||||
@@ -878,7 +879,7 @@ mt_attach(UNIT * uptr, CONST char *file)
|
||||
if ((r = sim_tape_attach_ex(uptr, file, 0, 0)) != SCPE_OK)
|
||||
return r;
|
||||
set_devattn(addr, SNS_DEVEND);
|
||||
uptr->u3 &= ~0xffff;
|
||||
uptr->u3 &= UNIT_ADDR_MASK;
|
||||
uptr->u4 = 0;
|
||||
uptr->u5 = 0;
|
||||
return SCPE_OK;
|
||||
@@ -887,7 +888,7 @@ mt_attach(UNIT * uptr, CONST char *file)
|
||||
t_stat
|
||||
mt_detach(UNIT * uptr)
|
||||
{
|
||||
uptr->u3 = 0;
|
||||
uptr->u3 &= UNIT_ADDR_MASK;
|
||||
return sim_tape_detach(uptr);
|
||||
}
|
||||
|
||||
@@ -900,7 +901,7 @@ mt_boot(int32 unit_num, DEVICE * dptr)
|
||||
if ((uptr->flags & UNIT_ATT) == 0)
|
||||
return SCPE_UNATT; /* attached? */
|
||||
if ((uptr->flags & MTUF_9TR) == 0) {
|
||||
uptr->u3 &= ~0xffff;
|
||||
uptr->u3 &= UNIT_ADDR_MASK;
|
||||
uptr->u3 |= MT_ODD|MT_CONV|MT_MDEN_800;
|
||||
}
|
||||
return chan_boot(GET_UADDR(uptr->u3), dptr);
|
||||
|
||||
Reference in New Issue
Block a user