1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-01-21 10:12:30 +00:00

SEL32: Correct mapping code to fix sysgen error.

Fix BU *1,1 condition code error Fix EXM to correct l/r h/w detection code
This commit is contained in:
James C. Bevier 2019-07-17 21:39:18 -04:00 committed by Richard Cornwell
parent 869f56dcf3
commit d5899f1dd5

View File

@ -161,7 +161,7 @@
/* CPU registers, map cache, spad, and other variables */
int traceme = 0; /* dynamic trace function */
int trstart = 9981910; /* count of when to start tracing */
int trstart = 8000000; /* count of when to start tracing */
//int trstart = 37; /* count of when to start tracing */
int cpu_index; /* Current CPU running */
uint32 PSD[2]; /* the PC for the instruction */
@ -722,16 +722,19 @@ t_stat load_maps(uint32 thepsd[2])
}
/* num should be even at this point, so zero 32 bit word for remaining maps */
if ((num/2) > HIWM) /* largerst number of maps loaded so far* */
HIWM = num/2; /* yes, set new high watter mark */
HIWM = num/2; /* yes, set new high water mark */
// for (i = num/2; i < 32/2; i++) /* zero any remaining entries */
for (i = num/2; i < HIWM; i++) /* zero any remaining entries */
MAPC[i] = 0; /* clear the map entry to make not valid */
HIWM = num/2; /* set new high water mark */
return ALLOK; /* all cache is loaded, return OK */
}
else
{
#if 0 /* set to 1 for traceme to work */
char n[9];
uint32 dqe;
#endif
/* 32/27, 32/67, 32/87, 32/97 2KW maps */
/* Concept/32 machine, 2KW maps */
if ((modes & MAPMODE) == 0) { /* mapped mode? */
@ -744,7 +747,11 @@ t_stat load_maps(uint32 thepsd[2])
/* master process list is in 0xf3 of spad for concept */
mpl = SPAD[0xf3] >> 2; /* get mpl from spad address */
midl = M[mpl+cpix]; /* get mpl entry wd 0 for given cpix */
msdl = M[mpl+cpix+1]; /* get mpl entry wd 0 for given cpix */
msdl = M[mpl+cpix+1]; /* get mpl entry wd 1 for given cpix */
#if 0 /* set to 1 for traceme to work */
//traceme = trstart;
if (traceme >= trstart) {
dqe = M[0x8e8>>2];
for (j=0; j<8; j++) {
n[j] = (M[((dqe+0x18)>>2)+(j/4)] >> ((3-(j&7))*8)) & 0xff;
@ -752,16 +759,27 @@ t_stat load_maps(uint32 thepsd[2])
n[j] = 0x20;
}
n[8] = 0;
// fprintf(stderr, "mapping SPAD PSD2 %.8x PSD2 %x mpl %x osmidl %x umidl %x C.CURR %x LMN %s\r\n",
// SPAD[0xf5], PSD2, mpl, M[mpl], midl, dqe, n);
/* if bit zero of mpl entry is set, use msd entry 0 first to load maps */
if (midl & BIT0)
{
/* TODO do not load O/S if already loaded. Bit zero of O/S midl will be set by swapper */
fprintf(stderr, "\r\nmapping SPAD[0xf3] %x mpl %x mpl0 %x mpl1 %x midl %x msdl %x cpix %x\r\n",
SPAD[0xf3], mpl<<2, M[mpl], M[mpl+1], midl, msdl, cpix<<2);
fprintf(stderr, "mapping SPAD PSD2 %.8x PSD2 %x mpl %x osmidl %x osmidl2 %x umidl %x C.CURR %x LMN %s\r\n",
SPAD[0xf5], PSD2, mpl<<2, M[mpl], M[mpl+1], midl, dqe, n);
}
#endif
/* load msd 0 maps first (O/S) */
osmidl = M[mpl]; /* get midl 0 word address */
/* if bit zero of cpix mpl entry is set, use msd entry 0 first to load maps */
// if (((osmidl & BIT0) == 0) || (midl & BIT0)) {
/* This test must be made (cpix == bpix) to allow sysgen to run without using a valid cpix */
/* the cpix is zero indicating only load MSD 0 for the target system */
/* bit 0 of msd 0 will be zero saying load the maps */
if ((osmidl == midl) || (midl & BIT0)) {
/* Do not load O/S if already loaded. Bit zero of O/S midl will be set by swapper on startup */
/* load msd 0 maps first (O/S) */
osmidl = M[mpl]; /* get midl 0 word address */
spc = osmidl & MASK16; /* get 16 bit segment description count */
if (osmidl & BIT0) { /* see f O/S already loaded */
#if 0 /* set to 1 for traceme to work */
fprintf(stderr, "mapping osmidl %x spc %x osmsdl %x usermidl %x\r\n", osmidl, spc, M[mpl+1], midl);
#endif
if (osmidl & BIT0) { /* see if O/S already loaded */
num = spc; /* set the number of o/s maps loaded */
goto skipos; /* skip load */
}
@ -781,8 +799,12 @@ t_stat load_maps(uint32 thepsd[2])
if (num & 1) {
/* entry going to rt hw, clean it first */
map = (MAPC[num/2] & LMASK) | map; /* map is in rt hw */
// fprintf(stderr, "mapping 0x%x O/S num 0x%x midl %x MAPC[%d] %x\r\n",
// spc, num-1, (midl+(j/2))<<2, num/2, map);
#if 0 /* set to 1 for traceme to work */
if (traceme >= trstart) {
fprintf(stderr, "mapping 0x%x O/S num 0x%x midl %x MAPC[%d] %x\r\n",
spc, num-1, (midl+(j/2))<<2, num/2, map);
}
#endif
}
else {
/* entry going to left hw, clean it first */
@ -792,17 +814,28 @@ t_stat load_maps(uint32 thepsd[2])
if (++num >= 2048)
return MAPFLT; /* map loading overflow, map fault error */
}
#if 0
#if 0 /* set to 1 for traceme to work */
if (traceme >= trstart) {
if (num & 1)
fprintf(stderr, "mapping 0x%x O/S num 0x%x midl %x MAPC[%d] %x\r\n",
spc, num-1, (midl+((spc-1)/2))<<2, num/2, map);
}
#endif
}
skipos:
/* sysgen in mpx does not have a valid cpix MPL entry, only a bpix entry */
/* that entry uses 64 map entries to map between target/host systems */
/* When cpix in instruction is zero, just load the O/S specified by MSD 0 */
if (cpix == 0)
goto skipcpix; /* only load maps specified by msd 0 */
/* now load cpix maps */
midl = M[mpl+cpix]; /* get cpix midl word address */
msdl = M[mpl+cpix+1]; /* get 24 bit real word address of midl */
spc = midl & RMASK; /* get segment page count from msdl */
#if 0 /* set to 1 for traceme to work */
fprintf(stderr, "mapping usmidl %x spc %x msdl %x\r\n", midl, spc, msdl);
#endif
midl = M[mpl+cpix+1] & MASK24; /* get 24 bit real word address of midl */
midl = midl>>2; /* get word address of midl */
for (j = 0; j < spc; j++)
@ -819,8 +852,12 @@ skipos:
if (num & 1) {
/* entry going to rt hw, clean it first */
map = (MAPC[num/2] & LMASK) | map; /* map is in rt hw */
// fprintf(stderr, "mapping 0x%x USER num 0x%x midl %x MAPC[%d] %x\r\n",
// spc, num-1, (midl+(j/2))<<2, num/2, map);
#if 0 /* set to 1 for traceme to work */
if (traceme >= trstart) {
fprintf(stderr, "mapping 0x%x USER num 0x%x midl %x MAPC[%d] %x\r\n",
spc, num-1, (midl+(j/2))<<2, num/2, map);
}
#endif
}
else {
/* entry going to left hw, clean it first */
@ -834,20 +871,26 @@ skipos:
/* we got here without map block found, return map fault error */
if (num == 0)
return MAPFLT; /* map fault error */
skipcpix:
if (num & 1) {
/* left hw of map is good, zero right */
map = (MAPC[num/2] & LMASK); /* clean rt hw */
// if (spc != 0)
// fprintf(stderr, "mapping 0x%x USER num 0x%x midl %x MAPC[%d] %x\r\n",
// spc, num-1, (midl+((spc-1)/2))<<2, num/2, map);
#if 0 /* set to 1 for traceme to work */
if (traceme >= trstart) {
if (spc != 0)
fprintf(stderr, "mapping 0x%x USER num 0x%x midl %x MAPC[%d] %x\r\n",
spc, num-1, (midl+((spc-1)/2))<<2, num/2, map);
}
#endif
MAPC[num++/2] = map; /* store the map reg contents into cache */
}
/* num should be even at this point, so zero 32 bit words for remaining maps */
if ((num/2) > HIWM) /* largerst number of maps loaded so far* */
HIWM = num/2; /* yes, set new high watter mark */
if ((num/2) > HIWM) /* largest number of maps loaded so far* */
HIWM = num/2; /* yes, set new high water mark */
// for (i = num/2; i < 2048/2; i++) /* zero any remaining entries */
for (i = num/2; i < HIWM; i++) /* zero any remaining entries */
MAPC[i] = 0; /* clear the map entry to make not valid */
HIWM = num/2; /* set new high water mark */
return ALLOK; /* all cache is loaded, retun OK */
}
}
@ -1331,7 +1374,7 @@ exec:
t &= ~IND; /* turn off IND bit to stop while loop */
} else {
/* non-extended mode, process new X, I, ADDR fields */
// fprintf(stderr, "Indirect NE before addr %x contents %x\n", addr, temp);
// fprintf(stderr, "Indirect NE before addr %x contents %x\n", addr, temp);
addr = temp & MASK19; /* get just the addr */
ix = (temp >> 21) & 3; /* get the index reg from indirect word */
if (ix != 0)
@ -1339,7 +1382,7 @@ exec:
/* if no F or C bits set, use original, else new */
if ((temp & F_BIT) || (addr & 3))
FC = ((temp & F_BIT) ? 0x4 : 0) | (addr & 3);
// fprintf(stderr, "Indirect NE after addr %x temp %x\n", addr, temp);
// fprintf(stderr, "Indirect NE after addr %x temp %x\n", addr, temp);
t = temp; /* go process next indirect location */
}
}
@ -1465,7 +1508,9 @@ exec:
TRAPME = PRIVHALT_TRAP; /* set the trap to take */
goto newpsd; /* Privlege mode halt trap */
}
/*FIXME*/ reason = STOP_HALT; /* do halt for now */
/*FIXME*/
reason = STOP_HALT; /* do halt for now */
return STOP_HALT; /* exit to simh for halt */
break;
case 0x1: /* WAIT */
if (modes & PRIVBIT == 0) { /* must be privileged to wait */
@ -2629,7 +2674,8 @@ src:
goto newpsd; /* memory read error or map fault */
IR = temp; /* get instruction from memory */
if (FC == 2) /* see if right halfword specified */
// if (FC == 2) /* see if right halfword specified */
if (FC == 3) /* see if right halfword specified */
IR <<= 16; /* move over the HW instruction */
if ((IR & 0xFC7F0000) == 0xC8070000 ||
(IR & 0xFF800000) == 0xA8000000 ||
@ -2865,8 +2911,8 @@ doovr2:
/* |-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------| */
/* */
case 0x6: /* SVC none - none */ /* Supervisor Call Trap */
{
#if 0
{
#if 0 /* set to 1 for traceme to work */
int j;
char n[9];
uint32 dqe = M[0x8e8>>2];
@ -2904,7 +2950,7 @@ doovr2:
PSD1 = M[(t>>2)+2]; /* get new PSD 1 */
PSD2 = (M[(t>>2)+3] & ~0x3ffc) | bc; /* get new PSD 2 w/old cpix */
M[(t>>2)+4] = IR&0xFFF; /* store call number */
#if 0
#if 0 /* set to 1 for traceme to work */
fprintf(stderr, "SVC @ %.8x SVC %x,%x PSD1 %.8x PSD2 %.8x SPAD PSD@ %x C.CURR %x LMN %s\r\n", OPSD1, temp2>>2, IR&0xFFF, PSD1, PSD2, SPAD[0xf5], dqe, n);
fprintf(stderr, " R0=%x R1=%x R2=%x R3=%x", GPR[0], GPR[1], GPR[2], GPR[3]);
fprintf(stderr, " R4=%x R5=%x R6=%x R7=%x", GPR[4], GPR[5], GPR[6], GPR[7]);
@ -2937,7 +2983,7 @@ fprintf(stderr, "SVC %x,%x GPR[6] %x GPR[6] %x\r\n", temp2>>2, IR&0xfff, GPR[6],
PSD2 &= ~RETMBIT; /* turn off retain bit in PSD2 */
SPAD[0xf5] = PSD2; /* save the current PSD2 */
goto newpsd; /* new psd loaded */
}
}
break;
case 0x7: /* EXR */
@ -3082,6 +3128,7 @@ fprintf(stderr, "SVC %x,%x GPR[6] %x GPR[6] %x\r\n", temp2>>2, IR&0xfff, GPR[6],
TRAPME = ADDRSPEC_TRAP; /* bad address, error */
goto newpsd; /* go execute the trap now */
}
temp2 = CC; /* save the old CC's */
CC = PSD1 & 0x78000000; /* get CC's if any */
switch(reg) {
case 0: t = 1; break;
@ -3097,7 +3144,8 @@ fprintf(stderr, "SVC %x,%x GPR[6] %x GPR[6] %x\r\n", temp2>>2, IR&0xfff, GPR[6],
if (t) { /* see if we are going to branch */
/* we are taking the branch, set CC's if indirect, else leave'm */
if (IR & IND) /* see if CCs from last indirect location are wanted */
PSD1 = (PSD1 & 0x87fffffe) | CC; /* insert last CCs */
// PSD1 = (PSD1 & 0x87fffffe) | CC; /* insert last CCs */
PSD1 = (PSD1 & 0x87fffffe) | temp2; /* insert last CCs */
/* update the PSD with new address */
PSD1 = (PSD1 & 0xff000000) | (addr & 0xfffffe); /* set new PC */
i_flags |= BT; /* we branched, so no PC update */
@ -3114,6 +3162,7 @@ fprintf(stderr, "SVC %x,%x GPR[6] %x GPR[6] %x\r\n", temp2>>2, IR&0xfff, GPR[6],
TRAPME = ADDRSPEC_TRAP; /* bad address, error */
goto newpsd; /* go execute the trap now */
}
temp2 = CC; /* save the old CC's */
CC = PSD1 & 0x78000000; /* get CC's if any */
switch(reg) {
case 0: t = (GPR[4] & (0x8000 >> ((CC >> 27) & 0xf))) != 0; break;
@ -3132,7 +3181,8 @@ fprintf(stderr, "SVC %x,%x GPR[6] %x GPR[6] %x\r\n", temp2>>2, IR&0xfff, GPR[6],
PSD1 = (PSD1 & 0xff000000) | (addr & 0xfffffe); /* set new PC */
i_flags |= BT; /* we branched, so no PC update */
if (IR & IND) /* see if CCs from last indirect location are wanted */
PSD1 = (PSD1 & 0x87fffffe) | CC; /* insert last CCs */
// PSD1 = (PSD1 & 0x87fffffe) | CC; /* insert last CCs */
PSD1 = (PSD1 & 0x87fffffe) | temp2; /* insert last CCs */
//fprintf(stderr, "BR t %.8x addr %.8x PSD1 %.8x\r\n", t, addr, PSD1);
}
break;
@ -3142,7 +3192,7 @@ fprintf(stderr, "SVC %x,%x GPR[6] %x GPR[6] %x\r\n", temp2>>2, IR&0xfff, GPR[6],
if (dest != 0) { /* if reg is not 0, take the branch */
/* we are taking the branch, set CC's if indirect, else leave'm */
/* update the PSD with new address */
#if 1
#if 1 /* set to 1 to stop branch to self, for now */
/* FIXME */ if (PC == (addr & 0x7FFFC)) { /* BIB to current PC, bump branch addr */
addr += 4;
// fprintf(stderr, "BI? stopping BIB $ addr %x PC %x\r\n", addr, PC);
@ -3164,8 +3214,8 @@ fprintf(stderr, "SVC %x,%x GPR[6] %x GPR[6] %x\r\n", temp2>>2, IR&0xfff, GPR[6],
case 0x1: /* BL F880 */
/* copy CC's from instruction and PC incremented by 4 */
GPR[0] = ((PSD1 & 0x78000000) | (PSD1 & 0x7fffe)) + 4;
if (IR & IND) /* see if CC from last indirect loacation are wanted */
GPR[0] = (CC | (PSD1 & 0x7fffe)) + 4; /* set CC's and incremented PC */
if (IR & IND) /* see if CC from last indirect loacation are wanted */
GPR[0] = (GPR[0] & 0x87fffffe) | CC; /* insert last CCs */
/* update the PSD with new address */
PSD1 = (PSD1 & 0xff000000) | (addr & 0xfffffe);
i_flags |= BT; /* we branched, so no PC update */
@ -3174,11 +3224,12 @@ fprintf(stderr, "SVC %x,%x GPR[6] %x GPR[6] %x\r\n", temp2>>2, IR&0xfff, GPR[6],
case 0x3: /* LPSD F980 */
/* fall through */;
case 0x5: /* LPSDCM FA80 */
{
#if 0
{
#if 0 /* set to 1 for traceme to work */
int j;
char n[9];
uint32 dqe = M[0x8e8>>2];
/* get task name blank filled */
for (j=0; j<8; j++) {
n[j] = (M[((dqe+0x18)>>2)+(j/4)] >> ((3-(j&7))*8)) & 0xff;
if (n[j] == 0)
@ -3217,16 +3268,14 @@ n[8] = 0;
if (CPUSTATUS & 0x80) /* see if old mode is blocked */
PSD2 |= 0x00004000; /* set to blocked state */
/* TRY if cpix is zero, copy cpix from PSD2 in SPAD[0xf5] */
if ((PSD2 & 0x3fff) == 0)
PSD2 |= (SPAD[0xf5] & 0x3fff); /* use new cpix */
if (opr & 0x0200) { /* Was it LPSDCM? */
/* map bit must be on to load maps */
if (PSD2 & MAPBIT) {
#if 0
#if 0 /* set to 1 for traceme to work */
// FIXME DEBUG EDIT
// if (n[0] == 'E' && n[1] == 'D' && n[2] == 'I' && n[3] == 'T')
// FIXME DEBUG SYSGEN
//if (n[0] == 'S' && n[1] == 'Y' && n[2] == 'S' && n[3] == 'G')
// traceme = trstart; /* start tracing */
traceme++; /* start trace */
//if (traceme >= trstart) {
@ -3250,17 +3299,23 @@ fprintf(stderr, "\r\n");
PSD2 &= ~RETMBIT; /* turn off retain bit in PSD2 */
} else {
/* LPSD */
//traceme++; /* start trace */
#if 0
/* if cpix is zero, copy cpix from PSD2 in SPAD[0xf5] */
if ((PSD2 & 0x3fff) == 0) {
// fprintf(stderr, "LPSD using SPAD PSD2 %x instead of user PSD2 %x\r\n", SPAD[0xf5], PSD2);
PSD2 |= (SPAD[0xf5] & 0x3fff); /* use new cpix */
}
#if 0 /* set to 1 for traceme to work */
sim_debug(DEBUG_EXP, &cpu_dev, "LPSD PSD1 %x PSD2 %x CPUSTATUS %x\n", PSD1, PSD2, CPUSTATUS);
if (traceme >= trstart) {
fprintf(stderr, "LPSD PSD1 %x PSD2 %x SPAD PSD2 %x CPUSTATUS %x C.CURR %x LMN %s\r\n",
PSD1, PSD2, SPAD[0xf5], CPUSTATUS, dqe, n);
fprintf(stderr, " R0=%x R1=%x R2=%x R3=%x", GPR[0], GPR[1], GPR[2], GPR[3]);
fprintf(stderr, " R4=%x R5=%x R6=%x R7=%x", GPR[4], GPR[5], GPR[6], GPR[7]);
fprintf(stderr, "\r\n");
}
#endif
}
}
}
/* TRAPME can be error from LPSDCM or OK here */
skipinstr = 1; /* skip next interrupt test only once */
goto newpsd; /* load the new psd */
@ -3753,11 +3808,8 @@ sim_debug(DEBUG_EXP, &cpu_dev, "XIO DACI chan %x sa %x spad %.8x\n", chan, suba,
TRAPME = AEXPCEPT_TRAP; /* trap the system now */
goto newpsd; /* process the trap */
}
#if 0
#if 0 /* set to 1 for traceme to work */
/* no trap, so continue with next instruction */
//PC = PSD1 & 0xfffffe; /* get 24 bit addr from PSD1 */
// Get CCs from PSD1 and PC from original instruction */
//if (traceme >= 4) {
if (traceme >= trstart) {
OPSD1 &= 0x87FFFFFE; /* clear the old CC's */
OPSD1 |= PSD1 & 0x78000000; /* update the CC's in the PSD */
@ -3856,8 +3908,9 @@ fprintf(stderr, "[][][][][][][][][][][] HALT TRAP [][][][][][][][][][][][]\r\n")
PSD2 &= ~RETMBIT; /* turn off retain bit in PSD2 */
SPAD[0xf5] = PSD2; /* save the current PSD2 */
#if 0
if (TRAPME == UNDEFINSTR_TRAP) {
#if 0 /* set to 1 for traceme to work */
//if (TRAPME == UNDEFINSTR_TRAP || TRAPME == MAPFAULT_TRAP) {
if (TRAPME == MAPFAULT_TRAP) {
sim_debug(DEBUG_EXP, &cpu_dev, "TRAP PSD1 %x PSD2 %x CPUSTATUS %x\n", PSD1, PSD2, CPUSTATUS);
fprintf(stderr, "TRAPS %x LOAD MAPS PSD1 %x PSD2 %x CPUSTATUS %x\r\n", TRAPME, PSD1, PSD2, CPUSTATUS);
goto dumpi;
@ -3872,7 +3925,7 @@ goto dumpi;
/* we have a new PSD loaded via a LPSD or LPSDCM */
/* TODO finish instruction history, then continue */
/* update cpu status word too */
#if 0
#if 0 /* set to 1 for traceme to work */
if (traceme >= trstart) {
dumpi:
OPSD1 &= 0x87FFFFFE; /* clear the old CC's */
@ -3885,6 +3938,14 @@ fprint_inst(stderr, OIR, 0); /* display instruction */
fprintf(stderr, " R0=%x R1=%x R2=%x R3=%x", GPR[0], GPR[1], GPR[2], GPR[3]);
fprintf(stderr, " R4=%x R5=%x R6=%x R7=%x", GPR[4], GPR[5], GPR[6], GPR[7]);
fprintf(stderr, "\r\n");
fprintf(stderr, "Current MAPC\r\n");
for (ix=0; ix<16; ix++) {
fprintf(stderr, "MAP %x MPC %x\r\n", ix/2, MAPC[ix]);
}
fflush(stderr);
//if (TRAPME == UNDEFINSTR_TRAP || TRAPME == MAPFAULT_TRAP)
if (TRAPME == MAPFAULT_TRAP)
return STOP_HALT; /* exit to simh for halt */
}
#endif
sim_debug(DEBUG_DATA, &cpu_dev, "R0=%08x R1=%08x R2=%08x R3=%08x\n", GPR[0], GPR[1], GPR[2], GPR[3]);