diff --git a/IBM360/ibm360_dasd.c b/IBM360/ibm360_dasd.c index a9b2056..51e1b82 100644 --- a/IBM360/ibm360_dasd.c +++ b/IBM360/ibm360_dasd.c @@ -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); diff --git a/IBM360/ibm360_defs.h b/IBM360/ibm360_defs.h index 21fc7d7..b13304d 100644 --- a/IBM360/ibm360_defs.h +++ b/IBM360/ibm360_defs.h @@ -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 diff --git a/IBM360/ibm360_mt.c b/IBM360/ibm360_mt.c index 2e017c5..7e8feca 100644 --- a/IBM360/ibm360_mt.c +++ b/IBM360/ibm360_mt.c @@ -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; } diff --git a/IBM360/ibm360_sys.c b/IBM360/ibm360_sys.c index b43bc43..707f83e 100644 --- a/IBM360/ibm360_sys.c +++ b/IBM360/ibm360_sys.c @@ -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