1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-02-17 04:57:52 +00:00

IBM360: Adding in 2 more DASD controllers.

This commit is contained in:
Richard Cornwell
2018-11-07 18:37:49 -05:00
parent 3d23322e3d
commit c984c6b187
4 changed files with 70 additions and 27 deletions

View File

@@ -301,6 +301,55 @@ DEVICE ddb_dev = {
&ddb_dib, DEV_DISABLE | DEV_DEBUG, 0, dev_debug,
NULL, NULL, &dasd_help, NULL, NULL, &dasd_description
};
#if NUM_DEVS_DASD > 2
UNIT ddc_unit[] = {
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x150)}, /* 0 */
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x151)}, /* 1 */
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x152)}, /* 2 */
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x153)}, /* 3 */
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x154)}, /* 4 */
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x155)}, /* 5 */
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x156)}, /* 6 */
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x157)}, /* 7 */
};
struct dib ddc_dib = { 0xF8, NUM_UNITS_MT, dasd_startio, dasd_startcmd, NULL,
ddc_unit, dasd_ini};
DEVICE ddc_dev = {
"DC", ddc_unit, NULL, dasd_mod,
NUM_UNITS_DASD, 8, 15, 1, 8, 8,
NULL, NULL, &dasd_reset, &dasd_boot, &dasd_attach, &dasd_detach,
&ddc_dib, DEV_DISABLE | DEV_DEBUG, 0, dev_debug,
NULL, NULL, &dasd_help, NULL, NULL, &dasd_description
};
#if NUM_DEVS_DASD > 3
UNIT ddd_unit[] = {
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x250)}, /* 0 */
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x251)}, /* 1 */
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x252)}, /* 2 */
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x253)}, /* 3 */
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x254)}, /* 4 */
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x255)}, /* 5 */
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x256)}, /* 6 */
{UDATA(&dasd_srv, UNIT_DASD, 0), 0, UNIT_ADDR(0x257)}, /* 7 */
};
struct dib ddd_dib = { 0xF8, NUM_UNITS_MT, dasd_startio, dasd_startcmd, NULL,
ddd_unit, dasd_ini};
DEVICE ddd_dev = {
"DD", ddd_unit, NULL, dasd_mod,
NUM_UNITS_DASD, 8, 15, 1, 8, 8,
NULL, NULL, &dasd_reset, &dasd_boot, &dasd_attach, &dasd_detach,
&ddd_dib, DEV_DISABLE | DEV_DEBUG, 0, dev_debug,
NULL, NULL, &dasd_help, NULL, NULL, &dasd_description
};
#endif
#endif
#endif
uint8 dasd_startio(UNIT *uptr, uint16 chan) {
@@ -753,7 +802,7 @@ index:
if ((uptr->u4 >> 8) == data->cyl) {
uptr->u6 = cmd;
uptr->u3 &= ~(0xff);
set_devattn(addr, SNS_DEVEND);
set_devattn(addr, SNS_CHNEND | SNS_DEVEND);
sim_debug(DEBUG_DETAIL, dptr, "seek end unit=%d %d %d %x\n", unit,
uptr->u4 >> 8, data->cyl, data->state);
}
@@ -1623,6 +1672,8 @@ dasd_detach(UNIT * uptr)
{
struct dasd_t *data = (struct dasd_t *)uptr->up7;
int type = GET_TYPE(uptr->flags);
uint16 addr = GET_UADDR(uptr->u3);
int cmd = uptr->u3 & 0x7f;
if (uptr->u3 & DK_CYL_DIRTY) {
(void)sim_fseek(uptr->fileref, data->cpos, SEEK_SET);
@@ -1630,10 +1681,11 @@ dasd_detach(UNIT * uptr)
data->tsize * disk_type[type].heads, uptr->fileref);
uptr->u3 &= ~DK_CYL_DIRTY;
}
if (data != 0) {
free(data->cbuf);
free(data);
}
if (cmd != 0)
chan_end(addr, SNS_CHNEND|SNS_DEVEND);
sim_cancel(uptr);
free(data->cbuf);
free(data);
uptr->up7 = 0;
uptr->u3 &= ~0xffff;
return detach_unit(uptr);

View File

@@ -356,6 +356,8 @@ extern DEVICE mta_dev;
extern DEVICE mtb_dev;
extern DEVICE dda_dev;
extern DEVICE ddb_dev;
extern DEVICE ddc_dev;
extern DEVICE ddd_dev;
extern DEVICE com_dev;
extern UNIT cpu_unit;
@@ -365,7 +367,7 @@ extern UNIT cpu_unit;
#define NUM_DEVS_LPR 1
#define NUM_DEVS_MT 1
#define NUM_UNITS_MT 8
#define NUM_DEVS_DASD 2
#define NUM_DEVS_DASD 4
#define NUM_UNITS_DASD 8
#define NUM_DEVS_COM 1
#define NUM_UNITS_COM 16

View File

@@ -232,7 +232,6 @@ uint8 mt_startcmd(UNIT *uptr, uint16 chan, uint8 cmd) {
if (mt_busy[GET_DEV_BUF(dptr->flags)] != 0 || (uptr->u3 & MT_CMDMSK) != 0) {
sim_debug(DEBUG_CMD, dptr, "CMD busy unit=%d %x\n", unit, cmd);
uptr->flags |= MT_BUSY; /* Flag we need to send CUE */
// mt_busy[GET_DEV_BUF(dptr->flags)] |= 2;
return SNS_BSY;
}
@@ -262,12 +261,8 @@ uint8 mt_startcmd(UNIT *uptr, uint16 chan, uint8 cmd) {
uptr->u4 = 0;
uptr->u6 = 0;
mt_busy[GET_DEV_BUF(dptr->flags)] = 1;
if ((cmd & 0x7) == 0x7) { /* Quick end channel on control */
// if ((cmd & 0x30) == 0) {
// mt_busy[GET_DEV_BUF(dptr->flags)] = 0;
// }
if ((cmd & 0x7) == 0x7) /* Quick end channel on control */
return SNS_CHNEND;
}
return 0;
case 0x3: /* Control */
@@ -305,9 +300,6 @@ uint8 mt_startcmd(UNIT *uptr, uint16 chan, uint8 cmd) {
break;
}
} else {
// if ((cmd & 0xf0) != 0xc0) {
// uptr->u5 |= SNS_CMDREJ;
// }
uptr->u3 &= ~MT_MDEN_MSK;
if (cmd & 0x8)
uptr->u3 |= MT_MDEN_800;
@@ -639,12 +631,10 @@ t_stat mt_srv(UNIT * uptr)
uptr->u3 &= ~MT_CMDMSK;
mt_busy[GET_DEV_BUF(dptr->flags)] &= ~1;
set_devattn(addr, SNS_DEVEND|SNS_UNITCHK);
// chan_end(addr, SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK);
return SCPE_OK;
}
uptr->u4 ++;
sim_activate(uptr, 500);
// chan_end(addr, SNS_CHNEND);
} else {
sim_debug(DEBUG_DETAIL, dptr, "Write Mark unit=%d\n", unit);
uptr->u3 &= ~(MT_CMDMSK);
@@ -661,12 +651,10 @@ t_stat mt_srv(UNIT * uptr)
uptr->u3 &= ~MT_CMDMSK;
mt_busy[GET_DEV_BUF(dptr->flags)] &= ~1;
set_devattn(addr, SNS_DEVEND|SNS_UNITCHK);
// chan_end(addr, SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK);
return SCPE_OK;
}
uptr->u4 ++;
sim_activate(uptr, 500);
// chan_end(addr, SNS_CHNEND);
break;
case 1:
uptr->u4++;
@@ -702,10 +690,8 @@ t_stat mt_srv(UNIT * uptr)
uptr->u3 &= ~MT_CMDMSK;
mt_busy[bufnum] &= ~1;
set_devattn(addr, SNS_DEVEND|SNS_UNITCHK);
// chan_end(addr, SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK);
break;
}
// chan_end(addr, SNS_CHNEND);
uptr->u4 ++;
sim_activate(uptr, 500);
break;
@@ -741,7 +727,6 @@ t_stat mt_srv(UNIT * uptr)
case 0:
uptr->u4 ++;
sim_activate(uptr, 500);
// chan_end(addr, SNS_CHNEND);
break;
case 1:
uptr->u4++;
@@ -782,7 +767,6 @@ t_stat mt_srv(UNIT * uptr)
case 0:
uptr->u4 ++;
sim_activate(uptr, 500);
// chan_end(addr, SNS_CHNEND);
break;
case 1:
sim_debug(DEBUG_DETAIL, dptr, "Skip rec unit=%d ", unit);
@@ -821,12 +805,10 @@ t_stat mt_srv(UNIT * uptr)
uptr->u5 |= SNS_CMDREJ;
uptr->u3 &= ~MT_CMDMSK;
mt_busy[bufnum] &= ~1;
// chan_end(addr, SNS_CHNEND|SNS_DEVEND|SNS_UNITCHK);
set_devattn(addr, SNS_DEVEND|SNS_UNITCHK);
} else {
uptr->u4 ++;
sim_activate(uptr, 500);
// chan_end(addr, SNS_CHNEND);
}
break;
case 1:
@@ -846,7 +828,6 @@ t_stat mt_srv(UNIT * uptr)
if (uptr->u4 == 0) {
uptr->u4 ++;
sim_activate(uptr, 30000);
// chan_end(addr, SNS_CHNEND);
mt_busy[bufnum] &= ~1;
} else {
sim_debug(DEBUG_DETAIL, dptr, "Rewind unit=%d\n", unit);
@@ -861,7 +842,6 @@ t_stat mt_srv(UNIT * uptr)
uptr->u4 ++;
mt_busy[bufnum] &= ~1;
sim_activate(uptr, 30000);
// chan_end(addr, SNS_CHNEND);
} else {
sim_debug(DEBUG_DETAIL, dptr, "Unload unit=%d\n", unit);
uptr->u3 &= ~(MT_CMDMSK);
@@ -898,6 +878,9 @@ 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->u4 = 0;
uptr->u5 = 0;
return SCPE_OK;
}

View File

@@ -70,6 +70,12 @@ DEVICE *sim_devices[] = {
&dda_dev,
#if NUM_DEVS_DASD > 1
&ddb_dev,
#if NUM_DEVS_DASD > 2
&ddc_dev,
#if NUM_DEVS_DASD > 3
&ddd_dev,
#endif
#endif
#endif
#endif
#ifdef NUM_DEVS_COM