1
0
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:
Richard Cornwell
2019-01-05 14:23:16 -05:00
parent 215e29c195
commit 3c16f8b3f5
5 changed files with 61 additions and 57 deletions

View File

@@ -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) {

View File

@@ -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');

View File

@@ -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);

View File

@@ -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

View File

@@ -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);