1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-01-21 02:07:41 +00:00

SEL32: Remove unused debug code.

Remove old interrupt code before using the new FIFO channel status code.
Do general cleanup.
This commit is contained in:
James C. Bevier 2019-07-17 21:39:18 -04:00 committed by Richard Cornwell
parent b35dc09b54
commit 6d9ad153ec

View File

@ -91,24 +91,6 @@ extern uint32 CPUSTATUS; /* CPU status word */
extern uint32 INTS[]; /* Interrupt status flags */
extern int traceme, trstart;
#if 0
#define FIFO_SIZE 256
/* FIFO structure */
uint32 chan_fifo[MAX_CHAN][FIFO_SIZE]; /* interrupt status fifo each channel */
uint32 chan_fifo_in[MAX_CHAN]; /* fifo input index */
uint32 chan_fifo_out[MAX_CHAN]; /* fifo output index */
/* channel values defined in CHANP structure */
uint32 chan_inch_addr[MAX_CHAN]; /* Channel status dw in memory */
uint32 chan_caw[MAX_CHAN]; /* Channel command address word */
uint32 ccw_addr[MAX_CHAN]; /* Channel address */
uint16 ccw_count[MAX_CHAN]; /* Channel count */
uint8 ccw_cmd[MAX_CHAN]; /* Channel command and flags */
uint16 ccw_flags[MAX_CHAN]; /* Channel flags */
uint16 chan_status[MAX_CHAN]; /* Channel status */
uint16 chan_dev[MAX_CHAN]; /* Device on channel */
uint32 chan_buf[MAX_CHAN]; /* Channel data buffer */
uint8 chan_byte[MAX_CHAN]; /* Current byte, dirty/full */
#endif
/* device status */
DIB *dev_unit[MAX_DEV]; /* Pointer to Device info block */
uint16 dev_status[MAX_DEV]; /* last device status flags */
@ -162,7 +144,6 @@ int32 FIFO_Put(uint16 chsa, uint32 entry)
if (dibp->chan_fifo_in == ((dibp->chan_fifo_out-1+FIFO_SIZE) % FIFO_SIZE)) {
return -1; /* FIFO Full */
}
// fprintf(stderr, "FIFO PUT chsa %x entry %x index %x\r\n", chsa, entry, dibp->chan_fifo_in);
dibp->chan_fifo[dibp->chan_fifo_in] = entry; /* add new entry */
dibp->chan_fifo_in += 1; /* next entry */
dibp->chan_fifo_in %= FIFO_SIZE; /* modulo FIFO size */
@ -178,14 +159,13 @@ int FIFO_Get(uint16 chsa, uint32 *old)
return -1; /* FIFO is empty, tell caller */
}
*old = dibp->chan_fifo[dibp->chan_fifo_out]; /* get the next entry */
// fprintf(stderr, "FIFO GET chsa %x entry %x index %x\r\n", chsa, *old, dibp->chan_fifo_out);
dibp->chan_fifo_out += 1; /* next entry */
dibp->chan_fifo_out %= FIFO_SIZE; /* modulo FIFO size */
return 0; /* all OK */
}
/* Find interrupt level for the given device (ch/sa) */
/* return 0 if not found, otherwise leve number */
/* return 0 if not found, otherwise level number */
uint32 find_int_lev(uint16 chsa)
{
uint32 chan, level, val;
@ -267,7 +247,6 @@ UNIT *find_unit_ptr(uint16 chsa)
dibp = dev_unit[chsa]; /* get DIB pointer from device pointers */
if (dibp == 0) { /* if zero, not defined on system */
//fprintf(stderr, "find_unit_ptr NULL DIB PTR chsa %0x\r\n", chsa);
return NULL; /* tell caller */
}
@ -293,7 +272,6 @@ CHANP *find_chanp_ptr(uint16 chsa)
if (dibp == 0) /* if zero, not defined on system */
return NULL; /* tell caller */
if ((chp = (CHANP *)dibp->chan_prg) == NULL) { /* must have channel information for each device */
//fprintf(stderr, "find_chanp_ptr NULL DIB PTR chsa %0x\r\n", chsa);
return NULL; /* tell caller */
}
@ -390,7 +368,6 @@ loop:
/* 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[%x] %x\n", chan, chp->chan_status);
// fprintf(stderr, "load_ccw ERROR chan_status[%x] %x\r\n", chan, chp->chan_status);
return 1;
}
@ -404,14 +381,11 @@ loop:
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[%x] %x\n", chan, chp->chan_status);
// fprintf(stderr, "load_ccw ERROR chan_status[%x] %x\r\n", chan, chp->chan_status);
return 1; /* error return */
}
sim_debug(DEBUG_CMD, &cpu_dev, "load_ccw read ccw chan %02x caw %06x IOCD wd 1 %08x\n",
chan, chp->chan_caw, word);
// fprintf(stderr, "load_ccw read ccw chan %02x caw %06x IOCD wd 1 %08x\r\n",
// chan, chp->chan_caw, word);
/* TIC can't follow TIC or be first in command chain */
if (((word >> 24) & 0xf) == CMD_TIC) {
if (tic_ok) {
@ -421,7 +395,6 @@ loop:
}
chp->chan_status |= STATUS_PCHK; /* program check for invalid tic */
sim_debug(DEBUG_EXP, &cpu_dev, "load_ccw ERROR chan_status[%x] %x\n", chan, chp->chan_status);
// fprintf(stderr, "load_ccw ERROR chan_status[%x] %x\r\n", chan, chp->chan_status);
irq_pend = 1; /* status pending */
return 1; /* error return */
}
@ -432,8 +405,6 @@ loop:
chp->ccw_cmd = (word >> 24) & 0xff; /* not DC, so set command from IOCD wd 1 */
sim_debug(DEBUG_EXP, &cpu_dev, "load_ccw No DC, flags %x cmd %x\n",
chp->ccw_flags, chp->ccw_cmd);
// fprintf(stderr, "load_ccw No DC, flags %x cmd %x\r\n",
// chp->ccw_flags, chp->ccw_cmd);
docmd = 1; /* show we have a command */
}
/* Set up for this command */
@ -442,7 +413,6 @@ loop:
sim_debug(DEBUG_CMD, &cpu_dev, "load_ccw read ccw chan %02x caw %06x IOCD wd 2 %08x\n",
chan, chp->chan_caw, word);
// fprintf(stderr, "load_ccw read ccw chan %02x caw %06x IOCD wd 2 %08x\r\n", chan, chp->chan_caw, word);
chp->chan_caw += 4; /* next IOCD address */
chp->ccw_count = word & 0xffff; /* get 16 bit byte count from IOCD WD 2*/
chp->ccw_flags = (word >> 16) & 0xffff; /* get flags from bits 0-7 of WD 2 of IOCD */
@ -454,8 +424,6 @@ loop:
sim_debug(DEBUG_EXP, &cpu_dev, "load_ccw read docmd %x irq_flag %x count %x chan %x\n",
docmd, irq_pend, chp->ccw_count, chan);
// fprintf(stderr, "load_ccw read docmd %x irq_flag %x count %x chan %x\r\n",
// docmd, irq_pend, chp->ccw_count, chan);
/* Check invalid count */
/* HACK HACK - LPR sends CC cmd only without data addr/count */
if ((chp->ccw_count == 0) && (chp->ccw_addr != 0)) { /* see if byte count is zero */
@ -504,8 +472,6 @@ loop:
/* see if this is an initialize channel cmd */
if ((chp->ccw_cmd & 0xFF) == 0 && (uptr->us9 != 0)) {
chp->chan_inch_addr = uptr->u4; /* save INCH buffer address */
// fprintf(stderr, "load_ccw INCH %x saved for chan %0x\r\n",
// chp->chan_inch_addr, chan);
sim_debug(DEBUG_EXP, &cpu_dev, "load_ccw INCH %x saved chan %0x\n",
chp->chan_inch_addr, chan);
}
@ -515,14 +481,10 @@ loop:
irq_pend = 1; /* int coming */
sim_debug(DEBUG_EXP, &cpu_dev, "load_ccw cmd complete chan %0x status %.8x count %x\n",
chan, chp->chan_status, chp->ccw_count);
// fprintf(stderr, "load_ccw cmd complete chan %0x status %.8x count %x\r\n",
// chan, chp->chan_status, chp->ccw_count);
}
}
// fprintf(stderr, "load_ccw return, chan %0x status %.8x count %x\r\n",
// chan, chp->chan_status, chp->ccw_count);
// sim_debug(DEBUG_EXP, &cpu_dev, "load_ccw return, chan %0x status %.8x count %x\n",
// chan, chp->chan_status, chp->ccw_count);
sim_debug(DEBUG_EXP, &cpu_dev, "load_ccw return, chan %0x status %.8x count %x\n",
chan, chp->chan_status, chp->ccw_count);
return 0; /* good return */
}
@ -694,14 +656,12 @@ void set_devattn(uint16 chsa, uint16 flags)
CHANP *chp = find_chanp_ptr(chsa); /* get channel prog pointer */
sim_debug(DEBUG_EXP, &cpu_dev, "set_devattn chsa %x, flags %x\n", chsa, flags);
// fprintf(stderr, "set_devattn chsa %x, flags %x\r\n", chsa, flags);
if (chp->chan_dev == chsa && (chp->chan_status & STATUS_CEND) != 0 && (flags & SNS_DEVEND) != 0) {
chp->chan_status |= ((uint16)flags);
} else
dev_status[chsa] = flags; /* save device status flags */
sim_debug(DEBUG_CMD, &cpu_dev, "set_devattn(%x, %x) %x\n", chsa, flags, chp->chan_dev);
// fprintf(stderr, "set_devattn2(%x, %x) %x\r\n", chsa, flags, chp->chan_dev);
irq_pend = 1;
}
@ -711,7 +671,6 @@ 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 */
//fprintf(stderr, "chan_end addr %0x flags %x\r\n", chsa, flags);
if (chp->chan_byte & BUFF_DIRTY) {
if (writebuff(chp)) /* write remaining data */
return; /* error */
@ -728,16 +687,13 @@ void chan_end(uint16 chsa, uint16 flags) {
}
/* no flags for attention status */
if (flags & (SNS_ATTN|SNS_UNITCHK|SNS_UNITEXP)) {
// fprintf(stderr, "chan_end attention status chsa %x status flags %x\r\n", chsa, flags);
chp->ccw_flags = 0; /* no flags */
}
/* test for device or controller end */
if (chp->chan_status & (STATUS_DEND|STATUS_CEND)) {
chp->chan_byte = BUFF_NEWCMD; /* clear byte flag */
// fprintf(stderr, "chan_end chsa %x status DEND|CEND\n", chsa);
while ((chp->ccw_flags & FLAG_DC)) { /* handle data chaining */
// fprintf(stderr, "chan_end test for ccw flags %x chsa %x\n", chp->ccw_flags, chsa);
if (load_ccw(chp, 1)) /* continue channel program */
break; /* error */
if ((chp->ccw_flags & FLAG_SLI) == 0) { /* suppress incorrect length? */
@ -747,7 +703,6 @@ void chan_end(uint16 chsa, uint16 flags) {
}
}
irq_pend = 1; /* flag to test for int condition */
// fprintf(stderr, "chan_end END chsa %x status %x\r\n", chsa, chp->chan_status);
}
/* store the device status into the status DW in memory */
@ -793,8 +748,7 @@ void store_csw(CHANP *chp)
/* chan channel number 0-7f */
/* suba unit address within channel 0-ff */
/* Condition codes to return 0-f as specified above */
t_stat startxio(uint16 lchsa, uint32 *status)
{
t_stat startxio(uint16 lchsa, uint32 *status) {
int lchan = get_chan(lchsa); /* get the logical channel number */
DIB *dibp; /* device information pointer */
UNIT *uptr; /* pointer to unit in channel */
@ -812,15 +766,11 @@ t_stat startxio(uint16 lchsa, uint32 *status)
chp = find_chanp_ptr(chsa); /* find the chanp pointer */
uptr = find_unit_ptr(chsa); /* find pointer to unit on channel */
// fprintf(stderr, "SIO chan startxio 1 spad[%x] %x lchsa %x chsa %0x chan %x\r\n",
// lchan, spadent, lchsa, chsa, chan);
sim_debug(DEBUG_CMD, &cpu_dev, "startxio 1 chsa %x chan %x\n", chsa, chan);
if (dibp == 0 || uptr == 0) { /* if no dib or unit ptr, CC3 on return */
*status = CC3BIT; /* not found, so CC3 */
return SCPE_OK; /* not found, CC3 */
}
// fprintf(stderr, "SIO chan startxio 2 spad[%x] %x lchsa %x chsa %0x chan %x\r\n",
// lchan, spadent, lchsa, chsa, chan);
sim_debug(DEBUG_CMD, &cpu_dev, "startxio 2 chsa %x chan %x\n", chsa, chan);
if ((uptr->flags & UNIT_ATT) == 0) { /* is unit attached? */
fprintf(stderr, "startxio chsa %x is not attached, error return\r\n", chsa);
@ -828,7 +778,6 @@ t_stat startxio(uint16 lchsa, uint32 *status)
return SCPE_OK; /* not found, CC3 */
}
/* see if interrupt is setup in SPAD and determine IVL for channel */
// fprintf(stderr, "startxio dev spad %.8x chsa %x chan %x\r\n", spadent, chsa, chan);
sim_debug(DEBUG_CMD, &cpu_dev, "startxio dev spad %.8x chsa %x chan %x\n", spadent, chsa, chan);
inta = ((spadent & 0x007f0000) >> 16); /* 1's complement of chan int level */
@ -842,16 +791,11 @@ t_stat startxio(uint16 lchsa, uint32 *status)
iocla = M[(chan_ivl+16)>>2]; /* iocla is in wd 4 of ICB */
sim_debug(DEBUG_CMD, &cpu_dev, "startxio busy test chsa %0x chan %x cmd %x flags %x IOCD1 %x IOCD2 %x\n",
chsa, chan, chp->ccw_cmd, chp->ccw_flags, M[iocla>>2], M[(iocla+4)>>2]);
// fprintf(stderr, "startxio busy test chsa %0x chan %x cmd %x flags %x iocla %x IOCD1 %x IOCD2 %x\r\n",
// chsa, chan, chp->ccw_cmd, chp->ccw_flags, iocla, M[iocla>>2], M[(iocla+4)>>2]);
sim_debug(DEBUG_CMD, &cpu_dev, "$$$ SIO %x %x cmd %x flags %x\n",
chsa, chan, chp->ccw_cmd, chp->ccw_flags);
// fprintf(stderr, "$$$ SIO %x %x cmd %x flags %x iocla %x\r\n",
// chsa, chan, chp->ccw_cmd, chp->ccw_flags, iocla);
/* check for a Command or data chain operation in progresss */
if (chp->ccw_cmd != 0 || (chp->ccw_flags & (FLAG_DC|FLAG_CC)) != 0) {
// fprintf(stderr, "startxio busy return CC4 cmd %x flags %x\r\n", chp->ccw_cmd, chp->ccw_flags);
sim_debug(DEBUG_CMD, &cpu_dev, "startxio busy return CC4 chsa %x chan %x\n", chsa, chan);
*status = CC4BIT; /* busy, so CC4 */
return SCPE_OK; /* just busy CC4 */
@ -883,46 +827,28 @@ t_stat startxio(uint16 lchsa, uint32 *status)
}
sim_debug(DEBUG_CMD, &cpu_dev, "$$ SIO starting IOCL processing chsa %02x\n", chsa);
// fprintf(stderr, "$$ SIO starting IOCL processsing chsa %0x\r\n", chsa);
/* start processing the IOCL */
if (load_ccw(chp, 0) || (chp->chan_status & STATUS_PCI)) {
/* we have an error or user requested interrupt, return status */
// fprintf(stderr, "chan startxio after load_ccw chsa %0x status %x\r\n", chsa, chp->chan_status);
store_csw(chp); /* store the status in the inch status dw */
sim_debug(DEBUG_CMD, &cpu_dev, "startxio store csw CC1 chan %02x status %08x\n", chan, chp->chan_status);
// fprintf(stderr, "startxio store csw CC1 chan %02x status %08x\n", chan, chp->chan_status);
chp->chan_status &= ~STATUS_PCI; /* remove PCI status bit */
dev_status[chsa] = 0; /* no device status */
*status = CC1BIT; /* status stored, so CC1 */
return SCPE_OK; /* CC1 (0x40) status stored */
}
#if NOT_NEEDED
if (chp->chan_status & STATUS_BUSY) {
fprintf(stderr, "chan startxio busy chan %0x status %x\r\n", chsa, chp->chan_status);
sim_debug(DEBUG_CMD, &cpu_dev, "startxio store busy chan %x status %08x\n", chan, chp->chan_status);
store_csw(chp); /* store the status in the inch status dw */
M[tempa >> 2] = 0; /* zero sa & IOCD address in status WD 1 */
chp->chan_status = 0; /* no channel status */
dev_status[chsa] = 0; /* no unit status */
chp->ccw_cmd = 0; /* no cmd either */
*status = CC4BIT; /* channel busy, so CC4 */
return SCPE_OK; /* CC4 (0x01) channel busy */
}
#endif
if ((chp->ccw_cmd & 0xFF) == 0) /* see if this is an initialize channel cmd */
*status = CC1BIT; /* request accepted, no status, so CC1 TRY THIS */
else
*status = 0; /* CCs = 0, SIO accepted, will echo status */
// fprintf(stderr, "$$$ SIO done chsa %0x status %x\r\n", chsa, chp->chan_status);
sim_debug(DEBUG_CMD, &cpu_dev, "$$$ SIO done chsa %x status %08x\n", chsa, chp->chan_status);
return SCPE_OK; /* No CC's all OK */
}
/* TIO - I/O status */
t_stat testxio(uint16 lchsa, uint32 *status) /* test XIO */
{
t_stat testxio(uint16 lchsa, uint32 *status) { /* test XIO */
uint32 chan = get_chan(lchsa);
DIB *dibp;
UNIT *uptr;
@ -943,8 +869,6 @@ t_stat testxio(uint16 lchsa, uint32 *status) /* test XIO */
uptr = find_unit_ptr(chsa); /* find pointer to unit on channel */
pchp = find_chanp_ptr(chsa & 0x7f00); /* find the channel chanp pointer */
// fprintf(stderr, "TIO chan testxio 1 spad[%x] %x lchsa %x chsa %0x chan %x\r\n",
// lchsa, spadent, lchsa, chsa, chan);
sim_debug(DEBUG_CMD, &cpu_dev, "testxio 1 chsa %x chan %x\n", chsa, chan);
if ((dibp == 0) || (uptr == 0)) { /* if non found, CC3 on return */
*status = CC3BIT; /* not found, so CC3 */
@ -971,11 +895,8 @@ t_stat testxio(uint16 lchsa, uint32 *status) /* test XIO */
sim_debug(DEBUG_CMD, &cpu_dev, "testxio busy test chsa %0x chan %x cmd %x flags %x IOCD1 %x IOCD2 %x\n",
chsa, chan, chp->ccw_cmd, chp->ccw_flags, M[iocla>>2], M[(iocla+4)>>2]);
// fprintf(stderr, "testxio busy test chsa %0x chan %x cmd %x flags %x IOCD1 %x IOCD2 %x\r\n",
// chsa, chan, chp->ccw_cmd, chp->ccw_flags, M[iocla>>2], M[(iocla+4)>>2]);
sim_debug(DEBUG_CMD, &cpu_dev, "$$$ TIO %x %x %x %x\n", chsa, chan, chp->ccw_cmd, chp->ccw_flags);
// fprintf(stderr, "$$$ TIO chsa %x chan %x cmd %x flags %x\r\n", chsa, chan, chp->ccw_cmd, chp->ccw_flags);
/* check for a Command or data chain operation in progresss */
if (chp->ccw_cmd != 0 || (chp->ccw_flags & (FLAG_DC|FLAG_CC)) != 0) {
@ -988,7 +909,6 @@ t_stat testxio(uint16 lchsa, uint32 *status) /* test XIO */
uint32 chan_icb = find_int_icb(chsa); /* get icb address */
sim_debug(DEBUG_CMD, &cpu_dev, "testxio status stored OK, sw1 %x sw2 %x\n", sw1, sw2);
// fprintf(stderr, "testxio status stored OK, sw1 %x sw2 %x\r\n", sw1, sw2);
/* we have status to return, do it now */
tempa = pchp->chan_inch_addr; /* get inch status buffer address */
M[tempa >> 2] = sw1; /* save sa & IOCD address in status WD 1 loc */
@ -1002,14 +922,13 @@ t_stat testxio(uint16 lchsa, uint32 *status) /* test XIO */
/* nothing going on, so say all OK */
*status = CC1BIT; /* request accepted, no status, so CC1 TRY THIS */
tioret:
// fprintf(stderr, "$$$ TIO END chsa %x chan %x cmd %x flags %x chan_stat %x CCs %x\r\n",
// chsa, chan, chp->ccw_cmd, chp->ccw_flags, chp->chan_status, *status);
sim_debug(DEBUG_CMD, &cpu_dev, "$$$ TIO END chsa %x chan %x cmd %x flags %x chan_stat %x CCs %x\n",
chsa, chan, chp->ccw_cmd, chp->ccw_flags, chp->chan_status, *status);
return SCPE_OK; /* No CC's all OK */
}
/* Stop XIO */
t_stat stopxio(uint16 lchsa, uint32 *status) /* stop XIO */
{
t_stat stopxio(uint16 lchsa, uint32 *status) { /* stop XIO */
int chan = get_chan(lchsa);
DIB *dibp;
UNIT *uptr;
@ -1053,13 +972,11 @@ t_stat stopxio(uint16 lchsa, uint32 *status) /* stop XIO */
sim_debug(DEBUG_CMD, &cpu_dev, "stopxio busy test chsa %0x chan %x cmd %x flags %x IOCD1 %x IOCD2 %x\n",
chsa, chan, chp->ccw_cmd, chp->ccw_flags, M[iocla>>2], M[(iocla+4)>>2]);
// sim_debug(DEBUG_CMD, &cpu_dev, "$$$ STOPIO %x %x %x %x\n", chsa, chan, chp->ccw_cmd, chp->ccw_flags);
// fprintf(stderr, "$$$ STOPIO %x %x %x %x\r\n", chsa, chan, chp->ccw_cmd, chp->ccw_flags);
sim_debug(DEBUG_CMD, &cpu_dev, "$$$ STOPIO %x %x %x %x\n", chsa, chan, chp->ccw_cmd, chp->ccw_flags);
/* 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_CMD, &cpu_dev, "stopxio busy return CC4 chsa %x chan %x\n", chsa, chan);
// fprintf(stderr, "stopxio busy return CC4 chsa %x chan %x\r\n", chsa, chan);
/* reset the DC or CC bits to force completion after current IOCD */
chp->ccw_flags &= ~(FLAG_DC|FLAG_CC); /* reset chaining bits */
dev_status[chsa] |= STATUS_ECHO; /* show we stopped the cmd */
@ -1068,14 +985,13 @@ t_stat stopxio(uint16 lchsa, uint32 *status) /* stop XIO */
}
/* the channel is not busy, so return OK */
*status = 0; /* CCs = 0, accepted */
// fprintf(stderr, "$$$ STOPIO good return chsa %x chan %x cmd %x flags %x status %x\r\n",
// chsa, chan, chp->ccw_cmd, chp->ccw_flags, *status);
sim_debug(DEBUG_CMD, &cpu_dev, "$$$ STOPIO good return chsa %x chan %x cmd %x flags %x status %x\n",
chsa, chan, chp->ccw_cmd, chp->ccw_flags, *status);
return SCPE_OK; /* No CC's all OK */
}
/* Reset Channel XIO */
t_stat rschnlxio(uint16 lchsa, uint32 *status) /* reset channel XIO */
{
t_stat rschnlxio(uint16 lchsa, uint32 *status) { /* reset channel XIO */
DIB *dibp;
UNIT *uptr;
uint32 spadent;
@ -1093,13 +1009,11 @@ t_stat rschnlxio(uint16 lchsa, uint32 *status) /* reset channel XIO */
uptr = find_unit_ptr(chsa); /* find pointer to unit on channel */
sim_debug(DEBUG_CMD, &cpu_dev, "rschnlxio 1 chan %x SPAD %x\n", chsa, spadent);
// fprintf(stderr, "rschnlxio 1 chan %x spad %x\r\n", chsa, spadent);
if (dibp == 0 || uptr == 0) { /* if no dib or unit ptr, CC3 on return */
*status = CC3BIT; /* not found, so CC3 */
return SCPE_OK; /* not found, CC3 */
}
sim_debug(DEBUG_CMD, &cpu_dev, "rschnlxio 2 chan %x, spad %x\r\n", chsa, spadent);
// fprintf(stderr, "rschnlxio 2 chan %x, spad %x\n", chsa, spadent);
if ((uptr->flags & UNIT_ATT) == 0) { /* is unit already attached? */
*status = CC3BIT; /* not attached, so error CC3 */
return SCPE_OK; /* not found, CC3 */
@ -1124,10 +1038,8 @@ t_stat rschnlxio(uint16 lchsa, uint32 *status) /* reset channel XIO */
}
chp = find_chanp_ptr(chsa); /* find the chanp pointer */
if (chp == 0) {
// fprintf(stderr, "rschnl found dib without valid chp for chsa %x, ignoring\r\n", chsa);
continue; /* not used */
}
// fprintf(stderr, "rschnl found dib and chp for chsa %x, resetting\r\n", chsa);
dev_status[chsa] = 0; /* clear device status */
chp->chan_status = 0; /* clear the channel status */
chp->chan_byte = BUFF_EMPTY; /* no data yet */
@ -1138,14 +1050,12 @@ t_stat rschnlxio(uint16 lchsa, uint32 *status) /* reset channel XIO */
chp->ccw_cmd = 0; /* read command */
}
sim_debug(DEBUG_CMD, &cpu_dev, "rschnlxio return CC1 chan %x lev %x\n", chan, lev);
// fprintf(stderr, "RSCHNL rschnlxio return CC1 chan %x lev %x\r\n", chan, lev);
*status = CC1BIT; /* request accepted, no status, so CC1 TRY THIS */
return SCPE_OK; /* All OK */
}
/* HIO - Halt I/O */
t_stat haltxio(uint16 lchsa, uint32 *status) /* halt XIO */
{
t_stat haltxio(uint16 lchsa, uint32 *status) { /* halt XIO */
int chan = get_chan(lchsa);
DIB *dibp;
UNIT *uptr;
@ -1190,7 +1100,6 @@ t_stat haltxio(uint16 lchsa, uint32 *status) /* halt XIO */
chsa, chan, chp->ccw_cmd, chp->ccw_flags, M[iocla>>2], M[(iocla+4)>>2]);
sim_debug(DEBUG_CMD, &cpu_dev, "$$$ HIO %x %x %x %x\n", chsa, chan, chp->ccw_cmd, chp->ccw_flags);
// fprintf(stderr, "$$$ HIO %x %x %x %x\r\n", chsa, chan, chp->ccw_cmd, chp->ccw_flags);
/* check for a Command or data chain operation in progresss */
if (chp->ccw_cmd != 0 || (chp->ccw_flags & (FLAG_DC|FLAG_CC)) != 0) {
@ -1205,15 +1114,14 @@ t_stat haltxio(uint16 lchsa, uint32 *status) /* halt XIO */
/* the channel is not busy, so return OK */
*status = CC2BIT; /* INCH status stored, so CC2 TRY */
hioret:
// fprintf(stderr, "$$$ HIO END chsa %x chan %x cmd %x flags %x status %x\r\n",
// chsa, chan, chp->ccw_cmd, chp->ccw_flags, *status);
sim_debug(DEBUG_CMD, &cpu_dev, "$$$ HIO END chsa %x chan %x cmd %x flags %x status %x\n",
chsa, chan, chp->ccw_cmd, chp->ccw_flags, *status);
return SCPE_OK; /* No CC's all OK */
}
/* grab controller n/u */
/* TODO return unimplemented function error, not busy */
t_stat grabxio(uint16 lchsa, uint32 *status) /* grab controller XIO n/u */
{
t_stat grabxio(uint16 lchsa, uint32 *status) { /* grab controller XIO n/u */
int chan = get_chan(lchsa);
uint32 spadent;
uint16 chsa;
@ -1232,14 +1140,12 @@ t_stat grabxio(uint16 lchsa, uint32 *status) /* grab controller XIO n/u *
return SCPE_OK; /* CC4 all OK */
}
*status = 0; /* not busy, no CC */
// fprintf(stderr, "chan grabxio chsa %0x chan %x\r\n", chsa, chan);
sim_debug(DEBUG_CMD, &cpu_dev, "grabxio chsa %x chan %08x\n", chsa, chan);
return 0;
}
/* reset controller XIO */
t_stat rsctlxio(uint16 lchsa, uint32 *status) /* reset controller XIO */
{
t_stat rsctlxio(uint16 lchsa, uint32 *status) { /* reset controller XIO */
int chan = get_chan(lchsa);
uint32 spadent;
uint16 chsa;
@ -1252,22 +1158,19 @@ t_stat rsctlxio(uint16 lchsa, uint32 *status) /* reset controller XIO */
chp = find_chanp_ptr(chsa); /* find the chanp pointer */
*status = 0; /* not busy, no CC */
// fprintf(stderr, "chan rsctlxio chsa %0x chan %x\r\n", chsa, chan);
sim_debug(DEBUG_CMD, &cpu_dev, "rsctlxio chsa %x chan %08x\n", chsa, chan);
return 0;
}
/* boot from the device (ch/sa) the caller specified */
/* on CPU reset, the cpu has set the IOCD data at location 0-4 */
t_stat chan_boot(uint16 chsa, DEVICE *dptr)
{
t_stat chan_boot(uint16 chsa, DEVICE *dptr) {
int chan = get_chan(chsa);
DIB *dibp = dev_unit[chsa];
CHANP *chp = dibp->chan_prg;
int i,j;
sim_debug(DEBUG_EXP, &cpu_dev, "Channel Boot chan/device addr %x\n", chsa);
// fprintf(stderr, "chan_boot chsa %0x\r\n", chsa);
if (dibp == 0) /* if no channel or device, error */
return SCPE_IOERR; /* error */
if (dibp->chan_prg == NULL) /* must have channel information for each device */
@ -1287,21 +1190,17 @@ t_stat chan_boot(uint16 chsa, DEVICE *dptr)
sim_debug(DEBUG_CMD, &cpu_dev, "Channel Boot calling load_ccw chan %02x status %08x\n",
chan, chp->chan_status);
// fprintf(stderr, "Channel Boot calling load_ccw chan %02x status %08x\r\n",
// chan, chp->chan_status);
/* start processing the boot IOCL at loc 0 */
if (load_ccw(chp, 0)) { /* load IOCL starting from location 0 */
sim_debug(DEBUG_CMD, &cpu_dev, "Channel Boot Error return from load_ccw chan %02x status %08x\n",
chan, chp->chan_status);
// fprintf(stderr, "Channel Boot Error return from load_ccw chan %02x status %08x\r\n",
// chan, chp->chan_status);
dev_status[chsa] = 0; /* no device status */
chp->ccw_flags = 0; /* clear the command flags */
return SCPE_IOERR; /* return error */
}
// fprintf(stderr, "Channel Boot OK return from load_ccw chsa %02x status %08x\r\n",
// chsa, chp->chan_status);
sim_debug(DEBUG_CMD, &dev_cpu, "Channel Boot OK return from load_ccw chsa %02x status %08x\n",
chsa, chp->chan_status);
loading = chsa; /* show we are loading from the boot device */
return SCPE_OK; /* all OK */
}
@ -1309,8 +1208,7 @@ t_stat chan_boot(uint16 chsa, DEVICE *dptr)
/* Scan all channels and see if one is ready to start or has
interrupt pending.
*/
uint32 scan_chan(void)
{
uint32 scan_chan(void) {
int i,j;
uint32 chsa = 0; /* No device */
uint32 chan; /* channel num 0-7f */
@ -1350,11 +1248,9 @@ uint32 scan_chan(void)
chan_ivl = SPAD[0xf1] + (i<<2); /* contents of spad f1 points to chan ivl in mem */
chan_icba = M[chan_ivl >> 2]; /* get the interrupt context block addr in memory */
tempa = chp->chan_inch_addr; /* get inch status buffer address */
// fprintf(stderr, "FOUND INT %x SPAD %x chan %x icb %x inch %x\r\n", i, SPAD[i+0x80], chan, chan_icba, tempa);
M[tempa >> 2] = sw1; /* save sa & IOCD address in status WD 1 loc */
/* save the status to memory */
M[(tempa+4) >> 2] = sw2; /* save status and residual count in status WD 2 loc */
//FIXME - TEST for IOP device here
/* now store the status dw address into word 5 of the ICB for the channel */
M[(chan_icba + 20) >> 2] = tempa | BIT1; /* post sw addr in ICB+5w & set CC2 in SW */
INTS[i] |= INTS_REQ; /* turn on channel interrupt request */
@ -1407,16 +1303,12 @@ uint32 scan_chan(void)
if (chp->ccw_flags & FLAG_CC) { /* command chain flag */
/* we have channel end and CC flag, continue channel prog */
if (chp->chan_status & STATUS_DEND) { /* device end? */
// fprintf(stderr, "scan_chan found channel end w/CC @ chsa %x flags %x do load_ccw\r\n",
// chp->chan_dev, chp->ccw_flags);
(void)load_ccw(chp, 1); /* go load the next IOCB */
} else
irq_pend = 1; /* still pending int */
} else {
/* we have channel end and no CC flag, end command */
chsa = chp->chan_dev; /* get the chan/sa */
// fprintf(stderr, "scan_chan found channel end wo/CC @ chsa %x do load_ccw loading %x\r\n",
// chp->chan_dev, loading);
dev_status[chsa] = 0; /* no device status anymore */
/* handle case where we are loading the O/S on boot */
if (loading) {
@ -1442,43 +1334,12 @@ uint32 scan_chan(void)
chp++; /* next CHANP pointer */
}
}
#if NOT_SURE_NEEDED
/* process any pending channel */
for (chsa = 0; chsa < MAX_DEV; chsa++) { /* loop through all the channels/units */
if (dev_status[chsa] != 0) { /* any pending status */
chp = find_chanp_ptr(chsa); /* find the chanp pointer */
// chan = get_chan(chsa); /* get channel from device number */
if (chp->ccw_cmd == 0) {
CHANP *pchp = find_chanp_ptr(chsa&0x7f00); /* find the chanp pointer for channel */
fprintf(stderr, "scan_chan Found dev_status %x for chsa %x\r\n", dev_status[chsa], chsa);
if (pchp->chan_inch_addr != 0) {
tempa = pchp->chan_inch_addr; /* get inch status buffer address */
M[tempa >> 2] = 0; /* zero sa & IOCD address in status WD 1 */
/* save the status to memory */
M[(tempa+4) >> 2] = (((uint32)dev_status[chsa]) << 24);
}
irq_pend = 1; /* int still pending */
dev_status[chsa] = 0; /* no status anymore */
lev = find_int_lev(chsa); /* get interrupt level */
if (lev == 0) {
fprintf(stderr, "scan_chan SCAN END ERROR LEV=0 chsa %x place 2\r\n", chsa);
return 0; /* just return */
}
chan_icba = find_int_icb(chsa); /* get icb address */
INTS[lev] |= INTS_REQ; /* turn on channel interrupt request */
return 0; /* just return */
}
}
}
#endif
return 0;
return 0; /* done */
}
/* set up the devices configured into the simulator */
/* only devices with a DIB will be processed */
t_stat chan_set_devs()
{
t_stat chan_set_devs() {
int i, j;
for(i = 0; i < MAX_DEV; i++) {
@ -1495,7 +1356,6 @@ t_stat chan_set_devs()
if (dibp == NULL) /* If no DIB, not channel device */
continue;
if (dptr->flags & DEV_DIS) { /* Skip disabled devices */
// fprintf(stderr, "chan_set_devs DISABLED check %s u3 %x\r\n", dptr->name, GET_UADDR(uptr->u3));
continue;
}
if ((chp = (CHANP *)dibp->chan_prg) == NULL)/* must have channel information for each device */
@ -1528,8 +1388,7 @@ 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)
{
t_stat set_dev_addr(UNIT *uptr, int32 val, CONST char *cptr, void *desc) {
DEVICE *dptr;
DIB *dibp;
t_value newdev;
@ -1537,7 +1396,6 @@ t_stat set_dev_addr(UNIT *uptr, int32 val, CONST char *cptr, void *desc)
int i;
int devaddr;
fprintf(stderr, "set_dev_addr val %x cptr %s desc %s\r\n", val, cptr, (char *)desc);
if (cptr == NULL) /* is there a UNIT name specified */
return SCPE_ARG; /* no, arg error */
if (uptr == NULL) /* is there a UNIT pointer */
@ -1606,12 +1464,10 @@ fprintf(stderr, "set_dev_addr val %x cptr %s desc %s\r\n", val, cptr, (char *)de
return r;
}
t_stat show_dev_addr(FILE *st, UNIT *uptr, int32 v, CONST void *desc)
{
t_stat show_dev_addr(FILE *st, UNIT *uptr, int32 v, CONST void *desc) {
DEVICE *dptr;
int chsa;
// fprintf(stderr, "show_dev_addr val %x desc %s\r\n", v, (char *)desc);
if (uptr == NULL)
return SCPE_IERR;
dptr = find_dev_from_unit(uptr);
@ -1621,4 +1477,3 @@ t_stat show_dev_addr(FILE *st, UNIT *uptr, int32 v, CONST void *desc)
fprintf(st, "%04x", chsa);
return SCPE_OK;
}