1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-01-13 15:27:04 +00:00

SEL32: Allow channel address reconfiguration.

SEL32: Add disk definitions for UTX and MPX.
SEL32: Add disk initialization for UTX and MPX HSDP & DISK controllers.
SEL32: Add read/write track/sector label simulation for UTX & MPX.
SEL32: Create revised initialization test files for SIMH.
This commit is contained in:
AZBevier 2020-02-04 18:16:35 -07:00
parent cde7ef8bb5
commit 18215f0e73
10 changed files with 2544 additions and 1194 deletions

View File

@ -123,6 +123,7 @@ t_stat chan_boot(uint16 chsa, DEVICE *dptr);
t_stat chan_set_devs();
t_stat set_dev_addr(UNIT *uptr, int32 val, CONST char *cptr, void *desc);
t_stat show_dev_addr(FILE *st, UNIT *uptr, int32 v, CONST void *desc);
DEVICE *get_dev(UNIT *uptr);
/* FIFO support */
/* These are FIFO queues which return an error when full.
@ -303,7 +304,7 @@ int readfull(CHANP *chp, uint32 maddr, uint32 *word)
}
maddr >>= 2; /* get 32 bit word index */
*word = M[maddr]; /* get the contents */
sim_debug(DEBUG_EXP, &cpu_dev, "readfull read %08x from addr %08x\n", *word, maddr<<2);
sim_debug(DEBUG_EXP, &cpu_dev, "READFULL read %08x from addr %08x\n", *word, maddr<<2);
return 0; /* return OK */
}
@ -327,7 +328,7 @@ int readbuff(CHANP *chp)
addr >>= 2; /* byte to word address */
chp->chan_buf = M[addr]; /* get 4 bytes */
sim_debug(DEBUG_DETAIL, &cpu_dev, "readbuff read memory bytes into buffer %02x %06x %08x %08x [",
sim_debug(DEBUG_DETAIL, &cpu_dev, "readbuff read memory bytes into buffer %02x %06x %06x %04x [",
chan, chp->ccw_addr & 0xFFFFFC, chp->chan_buf, chp->ccw_count);
for(k = 24; k >= 0; k -= 8) {
char ch = (chp->chan_buf >> k) & 0xFF;
@ -349,13 +350,17 @@ int writebuff(CHANP *chp)
if ((addr & MASK24) > (MEMSIZE*4)) {
chp->chan_status |= STATUS_PCHK;
sim_debug(DEBUG_DETAIL, &cpu_dev, "writebuff PCHK addr %08x to big mem %08x status %04x\n", addr, MEMSIZE, chp->chan_status);
sim_debug(DEBUG_DETAIL, &cpu_dev,
"writebuff PCHK addr %08x to big mem %08x status %04x\n",
addr, MEMSIZE, chp->chan_status);
chp->chan_byte = BUFF_CHNEND;
irq_pend = 1;
return 1;
}
addr &= MASK24;
sim_debug(DEBUG_DETAIL, &cpu_dev, "writebuff WRITE addr %08x MEMSIZE %08x status %04x\n", addr, MEMSIZE, chp->chan_status);
sim_debug(DEBUG_DETAIL, &cpu_dev,
"writebuff WRITE addr %06x DATA %08x status %04x\n",
addr, chp->chan_buf, chp->chan_status);
M[addr>>2] = chp->chan_buf;
return 0;
}
@ -372,10 +377,12 @@ int load_ccw(CHANP *chp, int tic_ok)
CHANP *pchp;
loop:
sim_debug(DEBUG_XIO, &cpu_dev, "load_ccw entry chan_status[%04x] %04x\n", chan, chp->chan_status);
sim_debug(DEBUG_XIO, &cpu_dev,
"load_ccw entry chan_status[%04x] %04x\n", chan, chp->chan_status);
/* Abort if we have any errors */
if (chp->chan_status & 0x3f03) { /* check channel status */
sim_debug(DEBUG_EXP, &cpu_dev, "load_ccw ERROR chan_status[%04x] %04x\n", chan, chp->chan_status);
if (chp->chan_status & 0x3f03) { /* check channel status */
sim_debug(DEBUG_EXP, &cpu_dev,
"load_ccw ERROR chan_status[%04x] %04x\n", chan, chp->chan_status);
return 1;
}
@ -388,13 +395,16 @@ loop:
/* Read in first or next CCW */
if (readfull(chp, chp->chan_caw, &word) != 0) { /* read word from memory */
chp->chan_status |= STATUS_PCHK; /* memory read error, program check */
sim_debug(DEBUG_EXP, &cpu_dev, "load_ccw ERROR chan_status[%04x] %04x\n", chan, chp->chan_status);
sim_debug(DEBUG_EXP, &cpu_dev,
"load_ccw ERROR chan_status[%04x] %04x\n", chan, chp->chan_status);
return 1; /* error return */
}
sim_debug(DEBUG_XIO, &cpu_dev, "load_ccw read ccw chan %02x caw %06x IOCD wd 1 %08x\n",
sim_debug(DEBUG_XIO, &cpu_dev,
"load_ccw read ccw chan %02x caw %06x IOCD wd 1 %08x\n",
chan, chp->chan_caw, word);
sim_debug(DEBUG_XIO, &cpu_dev, "load_ccw read data @ IOCD wd 1 %08x data wd 1 %08x\n",
sim_debug(DEBUG_XIO, &cpu_dev,
"load_ccw read data @ IOCD wd 1 %08x data wd 1 %08x\n",
word, M[(word & 0xffffff)>>2]);
#ifdef DO_DYNAMIC_DEBUG
@ -641,8 +651,8 @@ int chan_write_byte(uint16 chsa, uint8 *data)
return 1; /* return error */
}
if (chp->ccw_count == 0) {
sim_debug(DEBUG_DATA, &cpu_dev, "chan_write_byte ccw_count is zero ccw_count[%04x] %04x\n",
chan, chp->ccw_count);
sim_debug(DEBUG_DETAIL, &cpu_dev, "chan_write_byte ccw_count is zero ccw_count[%04x] %04x\n",
chan, chp->ccw_count);
if (chp->chan_byte & BUFF_DIRTY) {
sim_debug(DEBUG_DATA, &cpu_dev, "chan_write_byte 2 BUF DIRTY ret\n");
if (writebuff(chp)) /* write it */
@ -660,7 +670,8 @@ int chan_write_byte(uint16 chsa, uint8 *data)
return 1; /* return error */
}
}
sim_debug(DEBUG_DATA, &cpu_dev, "chan_write_byte non zero ccw_count[%04x]=%04x\n", chan, chp->ccw_count);
sim_debug(DEBUG_DETAIL, &cpu_dev, "chan_write_byte non zero ccw_count[%04x]=%04x\n",
chan, chp->ccw_count);
if (chp->ccw_flags & FLAG_SKIP) {
chp->ccw_count--;
chp->chan_byte = BUFF_EMPTY;
@ -735,8 +746,9 @@ void chan_end(uint16 chsa, uint16 flags) {
uint32 chan_icb = find_int_icb(chsa); /* get icb address */
CHANP *chp = find_chanp_ptr(chsa); /* get channel prog pointer */
sim_debug(DEBUG_EXP, &cpu_dev, "chan_end entry chsa %04x flags %04x chan_icb %06x status %04x\n",
chsa, flags, chan_icb, chp->chan_status);
sim_debug(DEBUG_EXP, &cpu_dev,
"chan_end entry chsa %04x flags %04x chan_icb %06x status %04x\n",
chsa, flags, chan_icb, chp->chan_status);
if (chp->chan_byte & BUFF_DIRTY) {
if (writebuff(chp)) /* write remaining data */
return; /* error */
@ -746,8 +758,9 @@ void chan_end(uint16 chsa, uint16 flags) {
chp->chan_status |= ((uint16)flags); /* add in the callers flags */
// chp->ccw_cmd = 0; /* reset the completed channel command */
sim_debug(DEBUG_EXP, &cpu_dev, "chan_end SLI test chsa %04x ccw_flags %04x count %04x status %04x\n",
chsa, chp->ccw_flags, chp->ccw_count, chp->chan_status);
sim_debug(DEBUG_EXP, &cpu_dev,
"chan_end SLI test chsa %04x ccw_flags %04x count %04x status %04x\n",
chsa, chp->ccw_flags, chp->ccw_count, chp->chan_status);
#ifdef HACK_HACK
/* hack - rewind had byte count of 1, so triggered this error when it is not */
/* remove until I figure out what is required */
@ -876,13 +889,15 @@ t_stat checkxio(uint16 lchsa, uint32 *status) {
chan_ivl = SPAD[0xf1] + (inta<<2); /* contents of spad f1 points to chan ivl in mem */
chan_ivl = M[chan_ivl >> 2]; /* get the interrupt context block addr in memory */
iocla = M[(chan_ivl+16)>>2]; /* iocla is in wd 4 of ICB */
tempa = M[(chan_ivl+20)>>2]; /* status is in wd 5 of ICB */
sim_debug(DEBUG_CMD, &cpu_dev,
"checkxio busy test chsa %04x cmd %02x iocla %08x flags %04x IOCD1 %08x IOCD2 %08x\n",
chsa, chp->ccw_cmd, iocla, chp->ccw_flags, M[iocla>>2], M[(iocla+4)>>2]);
"checkxio busy ck chsa %04x cmd %02x iocla %08x flags %04x IOCD1 %08x IOCD2 %08x status %08x\n",
chsa, chp->ccw_cmd, iocla, chp->ccw_flags, M[iocla>>2], M[(iocla+4)>>2], tempa);
/* check for a Command or data chain operation in progresss */
if (chp->ccw_cmd != 0 || (chp->ccw_flags & (FLAG_DC|FLAG_CC)) != 0) {
sim_debug(DEBUG_XIO, &cpu_dev, "checkxio busy return CC4 chsa %04x chan %04x\n", chsa, chan);
sim_debug(DEBUG_XIO, &cpu_dev,
"checkxio busy return CC4 chsa %04x chan %04x\n", chsa, chan);
*status = CC4BIT; /* busy, so CC4 */
return SCPE_OK; /* just busy CC4 */
}
@ -1640,6 +1655,32 @@ uint32 scan_chan(int *ilev) {
return 0; /* done */
}
/* Find_dev pointer for a unit
Input: uptr = pointer to unit
Output: dptr = pointer to device
*/
DEVICE *get_dev(UNIT *uptr)
{
DEVICE *dptr;
uint32 i, j;
if (uptr == NULL) /* must be valid unit */
return NULL;
if (uptr->dptr) /* get device pointer from unit */
return uptr->dptr; /* return valid pointer */
/* the device pointer in the unit is not set up, do it now */
/* This should never happed as the pointer is setup in first reset call */
for (i = 0; (dptr = sim_devices[i]) != NULL; i++) { /* do all devices */
for (j = 0; j < dptr->numunits; j++) { /* do all units for device */
if (uptr == (dptr->units + j)) { /* match found? */
uptr->dptr = dptr; /* set the pointer in unit */
return dptr; /* return valid pointer */
}
}
}
return NULL;
}
/* set up the devices configured into the simulator */
/* only devices with a DIB will be processed */
t_stat chan_set_devs() {
@ -1652,20 +1693,29 @@ t_stat chan_set_devs() {
for (i = 0; sim_devices[i] != NULL; i++) {
DEVICE *dptr = sim_devices[i]; /* get pointer to next configured device */
UNIT *uptr = dptr->units; /* get pointer to units defined for this device */
DIB *dibp = (DIB *)dptr->ctxt; /* get pointer to Device Information Block for this device */
DIB *dibp = (DIB *)dptr->ctxt; /* get pointer to DIB for this device */
CHANP *chp; /* channel program pointer */
int chsa; /* addr of device chan & subaddress */
/* set the device back pointer in the unit structure */
for (j = 0; j < dptr->numunits; j++) { /* loop through unit entries */
uptr->dptr = dptr; /* set the device pointer in unit structure */
uptr++; /* next UNIT pointer */
}
uptr = dptr->units; /* get pointer to units again */
if (dibp == NULL) /* If no DIB, not channel device */
continue;
if (dptr->flags & DEV_DIS) { /* Skip disabled devices */
if (dptr->flags & DEV_DIS) /* Skip disabled devices */
continue;
}
if ((chp = (CHANP *)dibp->chan_prg) == NULL)/* must have channel information for each device */
continue;
/* Check if address is in unit or dev entry */
for (j = 0; j < dptr->numunits; j++) { /* loop through unit entries */
chsa = GET_UADDR(uptr->u3); /* ch/sa value */
//printf("Setup device %s%d chsa %04x type %03d dptr %x\n",
// dptr->name, j, chsa, GET_TYPE(uptr->flags), uptr->dptr);
/* zero some channel data loc's for device */
dev_status[chsa] = 0; /* zero device status flags */
dev_status[chsa&0x7f00] = 0; /* clear the channel status location */
@ -1678,8 +1728,11 @@ t_stat chan_set_devs() {
chp->ccw_flags = 0; /* Command chain and supress incorrect length */
chp->ccw_cmd = 0; /* read command */
chp->chan_inch_addr = 0; /* clear address of stat dw in memory */
if ((uptr->flags & UNIT_DIS) == 0) /* is unit marked disabled? */
if ((uptr->flags & UNIT_DIS) == 0) { /* is unit marked disabled? */
if (dev_unit[chsa] != 0)
printf("Channel/SubAddress %04x multiple defined\n", chsa);
dev_unit[chsa] = dibp; /* no, save the dib address */
}
if (dibp->dev_ini != NULL) /* if there is an init routine, call it now */
dibp->dev_ini(uptr, 1); /* init the channel */
uptr++; /* next UNIT pointer */
@ -1691,91 +1744,67 @@ t_stat chan_set_devs() {
/* Validate and set the device onto a given channel */
t_stat set_dev_addr(UNIT *uptr, int32 val, CONST char *cptr, void *desc) {
DEVICE *dptr;
DIB *dibp;
t_value newdev;
t_stat r;
int i;
int devaddr;
DEVICE *dptr; /* device pointer */
DIB *dibp; /* dib pointer */
UNIT *tuptr; /* temp unit pointer */
t_value chan; /* new channel addr */
t_stat r; /* return status */
int i; /* temp */
int chsa; /* dev addr */
// dptr = uptr->dptr /* get device pointer from unit */
if (cptr == NULL) /* is there a UNIT name specified */
return SCPE_ARG; /* no, arg error */
if (uptr == NULL) /* is there a UNIT pointer */
return SCPE_IERR; /* no, arg error */
dptr = find_dev_from_unit(uptr); /* find the device from unit pointer */
dptr = get_dev(uptr); /* find the device from unit pointer */
if (dptr == NULL) /* device not found, so error */
return SCPE_IERR; /* error */
dibp = (DIB *)dptr->ctxt;
if (dibp == NULL)
return SCPE_IERR;
dibp = (DIB *)dptr->ctxt; /* get dib pointer from device struct */
if (dibp == NULL) /* we need a DIB */
return SCPE_IERR; /* no DIB, so error */
newdev = get_uint(cptr, 16, 0xffff, &r);
chan = get_uint(cptr, 16, 0xffff, &r); /* get new device address */
if (r != SCPE_OK) /* need good number */
return r; /* number error, return error */
//printf("finding chan %s (%x) with unit address %04x dptr %x\n",
// cptr, chan, GET_UADDR(uptr->u3), uptr->dptr);
if (r != SCPE_OK)
return r;
// if ((chan == 0) || ((chan & 0x7f00) != chan)) /* is chan 1-7f */
// return SCPE_ARG; /* no, bad channel # */
chan &= 0x7f00; /* clean channel address */
dibp->chan_addr = chan; /* set new parent channel addr */
if ((newdev >> 8) > channels)
return SCPE_ARG;
if (newdev >= MAX_DEV)
return SCPE_ARG;
devaddr = GET_UADDR(uptr->u3);
/* Clear out existing entry */
if (dptr->flags & DEV_UADDR) {
dev_unit[devaddr] = NULL;
} else {
devaddr &= (dibp->mask | 0x7f00);
for (i = 0; i < dibp->numunits; i++)
dev_unit[devaddr + i] = NULL;
/* change all the unit addresses with the new channel, but keep sub address */
/* Clear out existing entries for all units on this device */
tuptr = dptr->units; /* get pointer to units defined for this device */
/* loop through all units for this device */
for (i = 0; i < dibp->numunits; i++) {
chsa = GET_UADDR(tuptr->u3); /* get old chsa for this unit */
dev_unit[chsa] = NULL; /* clear sa dib pointer */
dev_unit[chsa&0x7f00] = NULL; /* clear the channel dib address */
chsa = chan | (chsa & 0xff); /* merge new channel with new sa */
tuptr->u3 &= ~UNIT_ADDR_MASK; /* clear old chsa for this unit */
tuptr->u3 |= UNIT_ADDR(chsa); /* clear old chsa for this unit */
dev_unit[chan&0x7f00] = dibp; /* set the channel dib address */
dev_unit[chsa] = dibp; /* save the dib address for new chsa */
fprintf(stderr, "Set dev %04x to %04x\r\n", GET_UADDR(tuptr->u3), chsa);
tuptr++; /* next unit pointer */
}
/* Check if device already at newdev */
if (dptr->flags & DEV_UADDR) {
if (dev_unit[newdev] != NULL)
r = SCPE_ARG;
} else {
newdev &= (dibp->mask | 0x7f00);
for (i = 0; i < dibp->numunits; i++) {
if (dev_unit[newdev + i] != NULL)
r = SCPE_ARG;
}
}
/* If not, point to new dev, else restore old */
if (r == SCPE_OK)
devaddr = newdev;
/* Update device entry */
if (dptr->flags & DEV_UADDR) {
dev_unit[devaddr] = dibp;
uptr->u3 &= ~UNIT_ADDR(0x7fff);
uptr->u3 |= UNIT_ADDR(devaddr);
fprintf(stderr, "Set dev %04x\r\n", GET_UADDR(uptr->u3));
} else {
for (i = 0; i < dibp->numunits; i++) {
dev_unit[devaddr + i] = dibp;
uptr = &((dibp->units)[i]);
uptr->u3 &= ~UNIT_ADDR(0x7fff);
uptr->u3 |= UNIT_ADDR(devaddr + i);
fprintf(stderr, "Set dev %04x\r\n", GET_UADDR(uptr->u3));
}
}
return r;
return SCPE_OK;
}
t_stat show_dev_addr(FILE *st, UNIT *uptr, int32 v, CONST void *desc) {
DEVICE *dptr;
int chsa;
if (uptr == NULL)
return SCPE_IERR;
dptr = find_dev_from_unit(uptr);
if (dptr == NULL)
return SCPE_IERR;
chsa = GET_UADDR(uptr->u3);
fprintf(st, "CHAN/SA %04x", chsa);
return SCPE_OK;
if (uptr == NULL) /* valid unit? */
return SCPE_IERR; /* no, error return */
dptr = get_dev(uptr); /* get the device pointer from unit */
if (dptr == NULL) /* valid pointer? */
return SCPE_IERR; /* retunr error */
chsa = GET_UADDR(uptr->u3); /* get the unit address */
fprintf(st, "CHAN/SA %04x", chsa); /* display channel/subaddress */
return SCPE_OK; /* we done */
}

View File

@ -35,6 +35,7 @@ extern void chan_end(uint16 chan, uint8 flags);
extern int chan_read_byte(uint16 chan, uint8 *data);
extern int chan_write_byte(uint16 chan, uint8 *data);
extern void set_devwake(uint16 addr, uint8 flags);
extern DEVICE *get_dev(UNIT *uptr);
/* Constants */
#define COM_LINES 8 /* max lines */
@ -377,7 +378,7 @@ void coml_ini(UNIT *uptr, t_bool f)
/* 8-line serial routines */
void com_ini(UNIT *uptr, t_bool f)
{
DEVICE *dptr = find_dev_from_unit(uptr);
DEVICE *dptr = get_dev(uptr);
sim_debug(DEBUG_CMD, &com_dev, "COM init device %s controller 0x7e00\n", dptr->name);
sim_activate(uptr, 1000); /* time increment */
@ -386,7 +387,7 @@ void com_ini(UNIT *uptr, t_bool f)
/* called from sel32_chan to start an I/O operation */
uint8 com_startcmd(UNIT *uptr, uint16 chan, uint8 cmd)
{
DEVICE *dptr = find_dev_from_unit(uptr);
DEVICE *dptr = get_dev(uptr);
int unit = (uptr - dptr->units);
uint8 ch;

View File

@ -48,6 +48,7 @@ extern void set_devattn(uint16 addr, uint8 flags);
extern void post_extirq(void);
extern uint32 attention_trap; /* set when trap is requested */
extern void set_devwake(uint16 addr, uint8 flags);
extern DEVICE *get_dev(UNIT *uptr);
#define CMD u3
/* Held in u3 is the device command and status */
@ -157,7 +158,7 @@ DEVICE con_dev = {
/* initialize the console chan/unit */
void con_ini(UNIT *uptr, t_bool f) {
// int unit = (uptr - con_unit); /* unit 0 */
// DEVICE *dptr = find_dev_from_unit(uptr);
// DEVICE *dptr = get_dev(uptr);
// con_data[unit].incnt = 0; /* no input data */
con_data[0].incnt = 0; /* no input data */
@ -169,7 +170,7 @@ void con_ini(UNIT *uptr, t_bool f) {
/* start a console operation */
uint8 con_preio(UNIT *uptr, uint16 chan)
{
DEVICE *dptr = find_dev_from_unit(uptr);
DEVICE *dptr = get_dev(uptr);
int unit = (uptr - dptr->units);
if ((uptr->CMD & 0xff00) != 0) { /* just return if busy */
@ -301,7 +302,6 @@ t_stat con_srvo(UNIT *uptr) {
int unit = (uptr - con_unit); /* unit 0 is read, unit 1 is write */
int cmd = uptr->CMD & CON_MSK;
uint8 ch, cp;
static uint32 lastch = 0;
sim_debug(DEBUG_DETAIL, &con_dev, "con_srvo enter chsa %04x cmd = %02x\n", chsa, cmd);
if (cmd == 0x0C) { /* unknown has to do nothing */
@ -322,6 +322,7 @@ t_stat con_srvo(UNIT *uptr) {
return SCPE_OK;
}
// static uint32 lastch = 0;
if ((cmd == CON_WR) || (cmd == CON_RWD)) {
/* Write to device */
if (chan_read_byte(chsa, &ch)) { /* get byte from memory */
@ -339,8 +340,8 @@ t_stat con_srvo(UNIT *uptr) {
else
cp = '^';
sim_debug(DEBUG_CMD, &con_dev, "con_srvo write %01x: putch 0x%02x %c\n", unit, ch, cp);
lastch = (lastch << 8) | cp;
#ifdef DO_DYNAMIC_DEBUG
lastch = (lastch << 8) | cp;
if ((lastch & 0xffff) == 0x6e29) /* check for ion) */
cpu_dev.dctrl |= (DEBUG_INST | DEBUG_CMD | DEBUG_EXP | DEBUG_IRQ);
#endif

View File

@ -1983,9 +1983,11 @@ wait_loop:
}
redo:
if (skipinstr) { /* need to skip interrupt test? */
#ifdef NOTNOW
sim_debug(DEBUG_TRAP, &cpu_dev,
"Skipinstr set to zero PSD1 %08x PSD2 %08x CPUSTATUS %08x\n",
PSD1, PSD2, CPUSTATUS);
#endif
skipinstr = 0; /* skip only once */
goto skipi; /* skip int test */
}
@ -2662,9 +2664,11 @@ exec:
PSD2 |= 0x00004000; /* set bit 49 only */
SPAD[0xf5] = PSD2; /* save the current PSD2 */
SPAD[0xf9] = CPUSTATUS; /* save the cpu status in SPAD */
#ifdef NOTNOW
sim_debug(DEBUG_IRQ, &cpu_dev,
"BEI skipinstr %x irq_pend %x PSD1 %08x PSD2 %08x CPUSTATUS %08x\n",
skipinstr, irq_pend, PSD1, PSD2, CPUSTATUS);
#endif
break;
case 0x7: /* UEI */
if ((modes & PRIVBIT) == 0) { /* must be privileged to UEI */
@ -2681,9 +2685,11 @@ exec:
PSD2 &= ~0x0000c000; /* clear bit 48 & 49 to be unblocked */
SPAD[0xf5] = PSD2; /* save the current PSD2 */
SPAD[0xf9] = CPUSTATUS; /* save the cpu status in SPAD */
#ifdef NOTNOW
sim_debug(DEBUG_IRQ, &cpu_dev,
"UEI skipinstr %x irq_pend %x PSD1 %08x PSD2 %08x CPUSTATUS %08x\n",
skipinstr, irq_pend, PSD1, PSD2, CPUSTATUS);
#endif
break;
case 0x8: /* EAE */
PSD1 |= AEXPBIT; /* set the enable AEXP flag in PSD */
@ -5950,16 +5956,16 @@ doovr2:
if (PSD2 & MAPBIT) {
/* set mapped mode in cpu status */
CPUSTATUS |= 0x00800000; /* set bit 8 of cpu status */
sim_debug(DEBUG_EXP, &cpu_dev,
sim_debug(DEBUG_DETAIL, &cpu_dev,
"B4 LPSDCM temp %06x TPSD %08x %08x PSD %08x %08x\n",
temp, TPSD[0], TPSD[1], PSD1, PSD2);
sim_debug(DEBUG_EXP, &cpu_dev,
sim_debug(DEBUG_DETAIL, &cpu_dev,
"B4 LPSDCM BPIX %04x CPIX %04x CPIXPL %04x\n",
BPIX, CPIX, CPIXPL);
sim_debug(DEBUG_EXP, &cpu_dev,
sim_debug(DEBUG_DETAIL, &cpu_dev,
"B4 LPSDCM OS MAPC[0-5] %08x %08x %08x %08x %08x %08x\n",
MAPC[0], MAPC[1], MAPC[2], MAPC[3], MAPC[4], MAPC[5]);
sim_debug(DEBUG_EXP, &cpu_dev,
sim_debug(DEBUG_DETAIL, &cpu_dev,
"B4 LPSDCM US MAPC[%x-%x] %08x %08x %08x %08x %08x %08x\n",
BPIX, BPIX+5, MAPC[BPIX], MAPC[BPIX+1], MAPC[BPIX+2],
MAPC[BPIX+3], MAPC[BPIX+4], MAPC[BPIX+5]);
@ -5974,23 +5980,18 @@ doovr2:
}
#endif
if ((PSD2 & RETMBIT) == 0) { /* don't load maps if retain bit set */
#ifdef DO_DYNAMIC_DEBUG
/* start debugging */
if ((PSD1&0xffffff) == 0x11314)
cpu_dev.dctrl |= (DEBUG_INST | DEBUG_CMD | DEBUG_EXP | DEBUG_IRQ);
#endif
/* we need to load the new maps */
TRAPME = load_maps(PSD, 0); /* load maps for new PSD */
sim_debug(DEBUG_EXP, &cpu_dev,
sim_debug(DEBUG_DETAIL, &cpu_dev,
"AF LPSDCM TPSD %08x %08x PSD %08x %08x TRAPME %02x\n",
TPSD[0], TPSD[1], PSD1, PSD2, TRAPME);
sim_debug(DEBUG_EXP, &cpu_dev,
sim_debug(DEBUG_DETAIL, &cpu_dev,
"AF LPSDCM BPIX %04x CPIX %04x CPIXPL %04x\n",
BPIX, CPIX, CPIXPL);
sim_debug(DEBUG_EXP, &cpu_dev,
sim_debug(DEBUG_DETAIL, &cpu_dev,
"AF LPSDCM OS MAPC[0-5] %08x %08x %08x %08x %08x %08x\n",
MAPC[0], MAPC[1], MAPC[2], MAPC[3], MAPC[4], MAPC[5]);
sim_debug(DEBUG_EXP, &cpu_dev,
sim_debug(DEBUG_DETAIL, &cpu_dev,
"AF LPSDCM US MAPC[%x-%x] %08x %08x %08x %08x %08x %08x\n",
BPIX, BPIX+5, MAPC[BPIX], MAPC[BPIX+1], MAPC[BPIX+2],
MAPC[BPIX+3], MAPC[BPIX+4], MAPC[BPIX+5]);
@ -5998,7 +5999,7 @@ doovr2:
PSD2 &= ~RETMBIT; /* turn off retain bit in PSD2 */
SPAD[0xf5] = PSD2; /* save the current PSD2 */
SPAD[0xf9] = CPUSTATUS; /* save the cpu status in SPAD */
sim_debug(DEBUG_EXP, &cpu_dev,
sim_debug(DEBUG_CMD, &cpu_dev,
"LPSDCM MAPS LOADED TRAPME = %02x PSD1 %08x PSD2 %08x CPUSTATUS %08x\n",
TRAPME, PSD1, PSD2, CPUSTATUS);
}

View File

@ -108,11 +108,11 @@
#define NUM_UNITS_CON 2 /* 2 console input & output */
#define NUM_DEVS_MT 1 /* 1 mag tape controllers */
#define NUM_UNITS_MT 4 /* 4 of 8 devices */
//#define FOR_UTX
#define FOR_UTX
#ifdef FOR_UTX
#define NUM_DEVS_HSDP 1 /* 1 HSPD disk drive controller */
#define NUM_UNITS_HSDP 2 /* 2 disk drive devices */
#else
//#else
#define NUM_DEVS_DISK 1 /* 1 DP02 disk drive controller */
#define NUM_UNITS_DISK 2 /* 2 disk drive devices */
//#define NUM_UNITS_DISK 4 /* 4 disk drive devices */
@ -181,12 +181,12 @@ typedef struct chp {
uint32 chan_inch_addr; /* Channel status dw in memory */
uint32 chan_caw; /* Channel command address word */
uint32 ccw_addr; /* Channel address */
uint32 chan_buf; /* Channel data buffer */
uint16 ccw_count; /* Channel count */
uint8 ccw_cmd; /* Channel command and flags */
uint16 ccw_flags; /* Channel flags */
uint16 chan_status; /* Channel status */
uint16 chan_dev; /* Device on channel */
uint32 chan_buf; /* Channel data buffer */
uint8 ccw_cmd; /* Channel command and flags */
uint8 chan_byte; /* Current byte, dirty/full */
} CHANP;
@ -224,6 +224,13 @@ typedef struct dib {
#define GET_DADDR(x) (0x7f & ((x) >> DEV_V_ADDR))
#define DEV_ADDR(x) ((x) << DEV_V_ADDR)
/* allow 255 type disks */
#define UNIT_V_TYPE (UNIT_V_UF + 0)
#define UNIT_TYPE (0xff << UNIT_V_TYPE)
/* get & set disk types */
#define GET_TYPE(x) ((UNIT_TYPE & (x)) >> UNIT_V_TYPE)
#define SET_TYPE(x) (UNIT_TYPE & ((x) << UNIT_V_TYPE))
#define UNIT_V_ADDR 16
#define UNIT_ADDR_MASK (0x7fff << UNIT_V_ADDR)
#define GET_UADDR(x) ((UNIT_ADDR_MASK & x) >> UNIT_V_ADDR)
@ -344,34 +351,34 @@ extern DEBTAB dev_debug[];
#define BIT1 0x40000000 /* general use for bit 1 testing */
#define BIT2 0x20000000 /* general use for bit 2 testing */
#define BIT3 0x10000000 /* general use for bit 3 testing */
#define BIT4 0x80000000 /* general use for bit 4 testing */
#define BIT5 0x40000000 /* general use for bit 5 testing */
#define BIT6 0x20000000 /* general use for bit 6 testing */
#define BIT7 0x10000000 /* general use for bit 7 testing */
#define BIT8 0x80000000 /* general use for bit 8 testing */
#define BIT9 0x40000000 /* general use for bit 9 testing */
#define BIT10 0x20000000 /* general use for bit 10 testing */
#define BIT11 0x10000000 /* general use for bit 11 testing */
#define BIT12 0x80000000 /* general use for bit 12 testing */
#define BIT13 0x40000000 /* general use for bit 13 testing */
#define BIT14 0x20000000 /* general use for bit 14 testing */
#define BIT15 0x10000000 /* general use for bit 15 testing */
#define BIT16 0x80000000 /* general use for bit 16 testing */
#define BIT17 0x40000000 /* general use for bit 17 testing */
#define BIT18 0x20000000 /* general use for bit 18 testing */
#define BIT19 0x10000000 /* general use for bit 19 testing */
#define BIT20 0x80000000 /* general use for bit 20 testing */
#define BIT21 0x40000000 /* general use for bit 21 testing */
#define BIT22 0x20000000 /* general use for bit 22 testing */
#define BIT23 0x10000000 /* general use for bit 23 testing */
#define BIT24 0x80000000 /* general use for bit 24 testing */
#define BIT25 0x40000000 /* general use for bit 25 testing */
#define BIT26 0x20000000 /* general use for bit 26 testing */
#define BIT27 0x10000000 /* general use for bit 27 testing */
#define BIT28 0x80000000 /* general use for bit 28 testing */
#define BIT29 0x40000000 /* general use for bit 29 testing */
#define BIT30 0x20000000 /* general use for bit 30 testing */
#define BIT31 0x10000000 /* general use for bit 31 testing */
#define BIT4 0x08000000 /* general use for bit 4 testing */
#define BIT5 0x04000000 /* general use for bit 5 testing */
#define BIT6 0x02000000 /* general use for bit 6 testing */
#define BIT7 0x01000000 /* general use for bit 7 testing */
#define BIT8 0x00800000 /* general use for bit 8 testing */
#define BIT9 0x00400000 /* general use for bit 9 testing */
#define BIT10 0x00200000 /* general use for bit 10 testing */
#define BIT11 0x00100000 /* general use for bit 11 testing */
#define BIT12 0x00080000 /* general use for bit 12 testing */
#define BIT13 0x00040000 /* general use for bit 13 testing */
#define BIT14 0x00020000 /* general use for bit 14 testing */
#define BIT15 0x00010000 /* general use for bit 15 testing */
#define BIT16 0x00008000 /* general use for bit 16 testing */
#define BIT17 0x00004000 /* general use for bit 17 testing */
#define BIT18 0x00002000 /* general use for bit 18 testing */
#define BIT19 0x00001000 /* general use for bit 19 testing */
#define BIT20 0x00000800 /* general use for bit 20 testing */
#define BIT21 0x00000400 /* general use for bit 21 testing */
#define BIT22 0x00000200 /* general use for bit 22 testing */
#define BIT23 0x00000100 /* general use for bit 23 testing */
#define BIT24 0x00000080 /* general use for bit 24 testing */
#define BIT25 0x00000040 /* general use for bit 25 testing */
#define BIT26 0x00000020 /* general use for bit 26 testing */
#define BIT27 0x00000010 /* general use for bit 27 testing */
#define BIT28 0x00000008 /* general use for bit 28 testing */
#define BIT29 0x00000004 /* general use for bit 29 testing */
#define BIT30 0x00000002 /* general use for bit 30 testing */
#define BIT31 0x00000001 /* general use for bit 31 testing */
#define MASK16 0x0000FFFF /* 16 bit address mask */
#define MASK19 0x0007FFFF /* 19 bit address mask */
#define MASK20 0x000FFFFF /* 20 bit address mask */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -39,14 +39,16 @@
#include "sel32_defs.h"
#include "sim_tape.h"
extern t_stat set_dev_addr(UNIT *uptr, int32 val, CONST char *cptr, void *desc);
extern t_stat show_dev_addr(FILE *st, UNIT *uptr, int32 v, CONST void *desc);
extern void chan_end(uint16 chan, uint8 flags);
extern int chan_read_byte(uint16 chan, uint8 *data);
extern int chan_write_byte(uint16 chan, uint8 *data);
extern void set_devattn(uint16 addr, uint8 flags);
extern t_stat chan_boot(uint16 addr, DEVICE *dptr);
extern uint32 SPAD[]; /* cpu SPAD */
extern t_stat set_dev_addr(UNIT *uptr, int32 val, CONST char *cptr, void *desc);
extern t_stat show_dev_addr(FILE *st, UNIT *uptr, int32 v, CONST void *desc);
extern void chan_end(uint16 chan, uint8 flags);
extern int chan_read_byte(uint16 chan, uint8 *data);
extern int chan_write_byte(uint16 chan, uint8 *data);
extern void set_devattn(uint16 addr, uint8 flags);
extern t_stat chan_boot(uint16 addr, DEVICE *dptr);
extern DEVICE *get_dev(UNIT *uptr);
extern uint32 SPAD[]; /* cpu SPAD */
#ifdef NUM_DEVS_MT
#define BUFFSIZE (64 * 1024)
@ -383,6 +385,7 @@ DEVICE mta_dev = {
"MTA", mta_unit, NULL, mt_mod,
NUM_UNITS_MT, 16, 24, 4, 16, 32,
NULL, NULL, &mt_reset, &mt_boot, &mt_attach, &mt_detach,
/* ctxt is the DIB pointer */
&mta_dib, DEV_BUF_NUM(0) | DEV_DISABLE | DEV_DEBUG | DEV_TAPE, 0, dev_debug,
NULL, NULL, &mt_help, NULL, NULL, &mt_description
@ -433,7 +436,7 @@ DEVICE mtb_dev = {
/* start an I/O operation */
uint8 mt_startcmd(UNIT *uptr, uint16 chan, uint8 cmd)
{
DEVICE *dptr = find_dev_from_unit(uptr);
DEVICE *dptr = get_dev(uptr);
int unit = (uptr - dptr->units);
sim_debug(DEBUG_EXP, &mta_dev, "mt_startcmd entry chan %04x cmd %02x\n", chan, cmd);
@ -565,7 +568,7 @@ t_stat mt_error(UNIT *uptr, uint16 addr, t_stat r, DEVICE *dptr)
t_stat mt_srv(UNIT *uptr)
{
uint16 addr = GET_UADDR(uptr->CMD);
DEVICE *dptr = find_dev_from_unit(uptr);
DEVICE *dptr = get_dev(uptr);
int unit = (uptr - dptr->units);
int cmd = uptr->CMD & MT_CMDMSK;
int bufnum = GET_DEV_BUF(dptr->flags);
@ -1083,7 +1086,7 @@ t_stat mt_srv(UNIT *uptr)
/* initialize the tape chan/unit */
void mt_ini(UNIT *uptr, t_bool f)
{
DEVICE *dptr = find_dev_from_unit(uptr);
DEVICE *dptr = get_dev(uptr);
if (MT_DENS(uptr->dynflags) == 0)
uptr->dynflags |= MT_DENS_6250 << UNIT_S_DF_TAPE;
@ -1091,8 +1094,8 @@ void mt_ini(UNIT *uptr, t_bool f)
uptr->SNS = 0; /* clear sense data */
uptr->SNS |= (SNS_RDY|SNS_ONLN|SNS_LOAD); /* set initial status */
mt_busy[GET_DEV_BUF(dptr->flags)] = 0; /* set not busy */
sim_debug(DEBUG_EXP, dptr, "MT init device %s unit %02x\n", dptr->name,
GET_UADDR(uptr->CMD));
sim_debug(DEBUG_EXP, dptr, "MT init device %s unit %02x\n",
dptr->name, GET_UADDR(uptr->CMD));
}
/* reset the mag tape */
@ -1106,8 +1109,8 @@ t_stat mt_reset(DEVICE *dptr)
/* attach the specified file to the tape device */
t_stat mt_attach(UNIT *uptr, CONST char *file)
{
uint16 addr = GET_UADDR(uptr->CMD); /* get address of mt device */
t_stat r;
uint16 addr = GET_UADDR(uptr->CMD); /* get address of mt device */
t_stat r;
/* mount the specified file to the MT */
if ((r = sim_tape_attach(uptr, file)) != SCPE_OK) {
@ -1123,7 +1126,7 @@ t_stat mt_attach(UNIT *uptr, CONST char *file)
t_stat mt_detach(UNIT *uptr)
{
sim_debug(DEBUG_EXP, &mta_dev, "mt_detach\n");
uptr->CMD = 0;
uptr->CMD &= ~0xffff; /* clear out the flags but leave ch/sa */
return sim_tape_detach(uptr);
}

File diff suppressed because it is too large Load Diff

View File

@ -1,33 +1,45 @@
; Set debug output
set debug -n sel.log
;set RTC 50
set RTC 60
;set RTC debug=cmd
;set ITM debug=cmd
;set debug stderr
;
; CPU type and memory
; Bad on UTX
;set CPU 32/27 2M
;set CPU 32/27 4M
;set CPU 32/87 4M
;set CPU 32/67 4M
;End of Bad
;set CPU 32/97 4M
set CPU V6 4M
;set CPU V6 8M
;set CPU V9 4M
;set debug stderr
;set mta debug=cmd;detail;exp;data
;set mta debug=inst;cmd;detail;exp
;set inq debug=cmd;detail
;set cpu debug=cmd;exp
;set cpu debug=exp;irq
;set cpu debug=irq
;set cpu debug=inst;cmd;exp;irq
;set cpu debug=cmd;exp;inst;detail;data
;set cpu debug=cmd;exp;inst;detail
;set cpu debug=cmd;exp;irq
;set con debug=exp
;set con debug=cmd;exp
;set con debug=cmd;exp;data
;set mta debug=cmd;exp;inst;data;detail
;set mta debug=cmd;exp
;set dma debug=cmd;exp;detail;data
;set dma debug=cmd;exp;detail;data
;set CPU V9 8M
;
; CPU debug options
;set cpu debug=cmd;exp;inst;detail;trap;xio;irq
; Set instruction trace history size
;set cpu history=10000
; useful options
;set cpu debug=cmd;exp
;set cpu debug=cmd;exp;irq;trap;xio
;set cpu debug=cmd;irq;trap;exp
;set cpu debug=irq;trap;exp;xio
;set cpu debug=irq;xio
;
; RTC realtime clock
set RTC 50
;set RTC 60
; RTC debug options
;set RTC debug=cmd
;
; ITM interval timer
;set ITM debug=cmd
;
; IOP
;set iop debug=cmd
;
; COM 8-Line
;set com debug=cmd;
;set coml0 enable
;set coml1 enable
;set coml2 enable
@ -37,30 +49,119 @@ set CPU V6 4M
;set coml6 enable
;set coml7 enable
;
; Enable telnet sessions on port 4747
;set comc enable
;at comc 4747
;
;set con debug=CMD
; LPR
;set lpr debug=cmd;detail
set lpr enable
; LPR output file
at lpr lprout
;
;set lpr enable
;at lpr lprout
; CON Console
;set con debug=cmd;exp;detail
; useful options
;set con debug=cmd;exp;
;
;at mta0 mpxsdt4.tap
;at mta0 mpxsdt5.tap
;at sda0 diskfile4
;at sda1 diskfile5
; MTA Buffered tape processor
;set mta debug=cmd;exp;detail;data
; useful options
;set mta debug=cmd;detail;exp
;
; enable MTA to change channel
set mta enable
; set mta channel
set mta0 dev=1000
; Attach in/out tape files
;at mta0 mpxsdt.tap
;at mta0 nbctape.tap
;at mta0 utx21a1.tap
;at mta0 sim32sdt.tap
at mta0 diag.tap
;at mta1 temptape.tap
;at mta2 output.tap
;
; DMA disk processor II/UDP
; enable DMA to change channel
;set dma enable
; set disk chan to 0800
;set dma0 dev=800
; set disk type to MPX MH300
;set dma0 type=MH300
; set disk type to UTX 9346
;set dma0 type=9346
;set dma0 type=8155
;set dma0 type=8887
;set dma0 type=8148
;
; Attach diskfile
;at dma0 utx0disk
;at dma0 utx1disk
;at dma0 sim32disk
;at dma debug=cmd;exp;detail;data
;at dma0 diagdisk
;bo dma0
;set history=10000
; useful options
;set dma debug=cmd;exp
;set dma debug=exp;cmd;detail
;
; SDA SCFI disk processor
;set sda debug=cmd;exp;data;detail
; Attach diskfiles
;at sda0 diskfile4
;at sda1 diskfile5
;
; DPA high speed disk processor
; enable the HSDP to change channel
;set dpa enable
; set channel addr
;set dpa dev=800
; set disk type to UTX 8887
;set dpa0 type=8887
;
; Attach diskfiles
;at utxdsk.dsk
;at dpa0 utx0hsdp
;at dpa1 utx1hsdp
;
;set dpa debug=cmd;detail;exp
; useful options
;set dpa debug=cmd;exp
;
; set console switches
deposit CSW 0
;
;UTX boot tape options
;set GPR 7 to 0x00 to boot in multi-user mode
;set GPR 7 to 0x01 to prompt for unix filename
;set GPR 7 to 0x02 to boot in single user mode
;set GPR 7 to 0x10 to disable swapping and paging
;set GPR 7 to 0x20 to boot from device specified in GPR6
;set GPR 7 to 0x40 to allow progress messages on boot
;deposit BOOTR[7] 40
;deposit BOOTR[7] 52
;deposit BOOTR[7] 42
;deposit BOOTR[7] 2
;deposit BOOTR[6] 800
;deposit BOOTR[0] ffffffff
; Set register content at boot for SEL diagnostics
; uncomment next line to get diag loader prompt
;deposit bootr[0] ffffffff
deposit bootr[1] 0
deposit bootr[2] 0
;
; allow cpu idle
set cpu idle
; Set expect script for auto time entry on MPX at OPCOM prompt
;expect haltafter=20000
; wait for expected output from simulator, then enter this text
;expect "??" send " %DATE_MM%/%DATE_DD%/%DATE_YY%,%TIME_HH%:%TIME_MM%:%TIME_SS%\r"; GO
;
; Boot from disk
;bo dpa0
;bo dma0
;
; Boot from mag tape
bo mta0