VAX750: Fixes to Unibus adapter to address #346

Modified the UBA750 simulation, incorporating these comments. Ultrix
appears to access the non-existant datapath registers and given that this
works on the real hardware the most likely option seems to be read 0
and write NOP. I think this will be true for any access to the UBI outside
of the known registers.
This commit is contained in:
Matt Burke 2017-04-26 15:36:28 -07:00 committed by Mark Pizzolato
parent 4b41b3372f
commit 7092c55907

View file

@ -1,6 +1,6 @@
/* vax750_uba.c: VAX 11/750 Unibus adapter /* vax750_uba.c: VAX 11/750 Unibus adapter
Copyright (c) 2010-2011, Matt Burke Copyright (c) 2012-2017, Matt Burke
This module incorporates code from SimH, Copyright (c) 2004-2008, Robert M Supnik This module incorporates code from SimH, Copyright (c) 2004-2008, Robert M Supnik
Permission is hereby granted, free of charge, to any person obtaining a Permission is hereby granted, free of charge, to any person obtaining a
@ -33,14 +33,8 @@
/* Unibus adapter */ /* Unibus adapter */
#define UBA_NDPATH 4 /* number of data paths */
#define UBA_NMAPR 512 /* number of map reg */ #define UBA_NMAPR 512 /* number of map reg */
/* Unibus adapter configuration register */
#define UBACNF_OF 0x00
#define UBACNF_CODE 0x00000028 /* adapter code */
/* Control/Status registers */ /* Control/Status registers */
#define UBACSR1_OF 0x01 #define UBACSR1_OF 0x01
@ -52,17 +46,7 @@
#define UBACSR_ERR 0x80000000 /* Error flag */ #define UBACSR_ERR 0x80000000 /* Error flag */
#define UBACSR_RD (UBACSR_PUR | UBACSR_UCE | UBACSR_NXM | \ #define UBACSR_RD (UBACSR_PUR | UBACSR_UCE | UBACSR_NXM | \
UBACSR_ERR) UBACSR_ERR)
#define UBACSR_WR 0 #define UBACSR_W1C (UBACSR_UCE | UBACSR_NXM)
/* Data path registers */
#define UBADPR_OF 0x010
#define UBADPR_ERR 0x80000000 /* buf not empty - ni */
#define UBADPR_NXM 0x40000000 /* nonexistent memory */
#define UBADPR_UCE 0x20000000 /* uncorrectable error */
#define UBADPR_PUR 0x00000001 /* purge request */
#define UBADPR_RD 0xE0000000
#define UBADPR_W1C 0xC0000000
#define UBA_VEC_MASK 0x1FC /* Vector value mask */ #define UBA_VEC_MASK 0x1FC /* Vector value mask */
@ -70,14 +54,13 @@
#define UBAMAP_OF 0x200 #define UBAMAP_OF 0x200
#define UBAMAP_VLD 0x80000000 /* valid */ #define UBAMAP_VLD 0x80000000 /* valid */
#define UBAMAP_LWAE 0x04000000 /* LW access enb - ni */
#define UBAMAP_ODD 0x02000000 /* odd byte */ #define UBAMAP_ODD 0x02000000 /* odd byte */
#define UBAMAP_V_DP 21 /* data path */ #define UBAMAP_V_DP 21 /* data path */
#define UBAMAP_M_DP 0x3 #define UBAMAP_M_DP 0x3
#define UBAMAP_DP (UBAMAP_M_DP << UBAMAP_V_DP) #define UBAMAP_DP (UBAMAP_M_DP << UBAMAP_V_DP)
#define UBAMAP_GETDP(x) (((x) >> UBAMAP_V_DP) & UBAMAP_M_DP) #define UBAMAP_GETDP(x) (((x) >> UBAMAP_V_DP) & UBAMAP_M_DP)
#define UBAMAP_PAG 0x001FFFFF #define UBAMAP_PAG 0x00007FFF
#define UBAMAP_RD (0x86000000 | UBAMAP_DP | UBAMAP_PAG) #define UBAMAP_RD (0x82000000 | UBAMAP_DP | UBAMAP_PAG)
#define UBAMAP_WR (UBAMAP_RD) #define UBAMAP_WR (UBAMAP_RD)
/* Debug switches */ /* Debug switches */
@ -94,7 +77,6 @@ uint32 uba_csr1 = 0; /* csr reg 1 */
uint32 uba_csr2 = 0; /* csr reg 2 */ uint32 uba_csr2 = 0; /* csr reg 2 */
uint32 uba_csr3 = 0; /* csr reg 3 */ uint32 uba_csr3 = 0; /* csr reg 3 */
uint32 uba_int = 0; /* UBA interrupt */ uint32 uba_int = 0; /* UBA interrupt */
uint32 uba_dpr[UBA_NDPATH] = { 0 }; /* number data paths */
uint32 uba_map[UBA_NMAPR] = { 0 }; /* map registers */ uint32 uba_map[UBA_NMAPR] = { 0 }; /* map registers */
int32 autcon_enb = 1; /* autoconfig enable */ int32 autcon_enb = 1; /* autoconfig enable */
@ -199,11 +181,6 @@ t_stat uba_rdreg (int32 *val, int32 pa, int32 lnt)
{ {
int32 idx, ofs; int32 idx, ofs;
if ((pa & 3) || (lnt < L_WORD)) { /* unaligned or not at least word? */
sim_printf (">>UBA: invalid adapter read mask, pa = %X, lnt = %d\r\n", pa, lnt);
/* FIXME: set appropriate error bits */
return SCPE_OK;
}
ofs = NEXUS_GETOFS (pa); /* get offset */ ofs = NEXUS_GETOFS (pa); /* get offset */
if (ofs >= UBAMAP_OF) { /* map? */ if (ofs >= UBAMAP_OF) { /* map? */
idx = ofs - UBAMAP_OF; idx = ofs - UBAMAP_OF;
@ -217,10 +194,6 @@ if (ofs >= UBAMAP_OF) { /* map? */
switch (ofs) { /* case on offset */ switch (ofs) { /* case on offset */
case UBACNF_OF: /* Config Reg */
*val = UBACNF_CODE;
break;
case UBACSR1_OF: /* CSR1 */ case UBACSR1_OF: /* CSR1 */
*val = (uba_csr1 & UBACSR_RD); *val = (uba_csr1 & UBACSR_RD);
break; break;
@ -233,14 +206,9 @@ switch (ofs) { /* case on offset */
*val = (uba_csr3 & UBACSR_RD); *val = (uba_csr3 & UBACSR_RD);
break; break;
case UBADPR_OF + 1:
case UBADPR_OF + 2: case UBADPR_OF + 3:
idx = ofs - UBADPR_OF;
*val = uba_dpr[idx] & UBADPR_RD;
break;
default: default:
return SCPE_NXM; *val = 0;
break;
} }
if (DEBUG_PRI (uba_dev, UBA_DEB_RRD)) if (DEBUG_PRI (uba_dev, UBA_DEB_RRD))
@ -254,11 +222,6 @@ t_stat uba_wrreg (int32 val, int32 pa, int32 lnt)
{ {
int32 idx, ofs; int32 idx, ofs;
if ((pa & 3) || (lnt != L_LONG)) { /* unaligned or not lw? */
sim_printf (">>UBA: invalid adapter write mask, pa = %X, lnt = %d\r\n", pa, lnt);
/* FIXME: set appropriate error bits */
return SCPE_OK;
}
ofs = NEXUS_GETOFS (pa); /* get offset */ ofs = NEXUS_GETOFS (pa); /* get offset */
if (ofs >= UBAMAP_OF) { /* map? */ if (ofs >= UBAMAP_OF) { /* map? */
idx = ofs - UBAMAP_OF; idx = ofs - UBAMAP_OF;
@ -272,32 +235,19 @@ if (ofs >= UBAMAP_OF) { /* map? */
switch (ofs) { /* case on offset */ switch (ofs) { /* case on offset */
case UBACNF_OF: /* Config Reg */
break;
case UBACSR1_OF: /* CSR1 */ case UBACSR1_OF: /* CSR1 */
uba_csr1 = (val & UBACSR_WR); uba_csr1 = uba_csr1 & ~(val & UBACSR_W1C);
break; break;
case UBACSR2_OF: /* CSR2 */ case UBACSR2_OF: /* CSR2 */
uba_csr2 = (val & UBACSR_WR); uba_csr2 = uba_csr2 & ~(val & UBACSR_W1C);
break; break;
case UBACSR3_OF: /* CSR3 */ case UBACSR3_OF: /* CSR3 */
uba_csr3 = (val & UBACSR_WR); uba_csr3 = uba_csr3 & ~(val & UBACSR_W1C);
break;
case UBADPR_OF + 0: /* DPR */
break; /* direct */
case UBADPR_OF + 1:
case UBADPR_OF + 2: case UBADPR_OF + 3:
idx = ofs - UBADPR_OF;
uba_dpr[idx] = uba_dpr[idx] & ~(val & UBADPR_W1C);
break; break;
default: default:
return SCPE_NXM;
break; break;
} }
@ -362,7 +312,6 @@ if ((lnt == L_BYTE) || /* byte? */
} }
else { else {
sim_printf (">>UBA: invalid read mask, pa = %x, lnt = %d\n", pa, lnt); sim_printf (">>UBA: invalid read mask, pa = %x, lnt = %d\n", pa, lnt);
/* FIXME: set appropriate error bits */
iod = 0; iod = 0;
} }
SET_IRQL; SET_IRQL;
@ -385,10 +334,8 @@ if (lnt == L_BYTE) /* byte? DATOB */
WriteUb (pa, val, WRITEB); WriteUb (pa, val, WRITEB);
else if (((lnt == L_WORD) || (lnt == L_LONG)) && ((pa & 1) == 0))/* aligned word? */ else if (((lnt == L_WORD) || (lnt == L_LONG)) && ((pa & 1) == 0))/* aligned word? */
WriteUb (pa, val, WRITE); /* DATO */ WriteUb (pa, val, WRITE); /* DATO */
else { else
sim_printf (">>UBA: invalid write mask, pa = %x, lnt = %d, val = 0x%x\n", pa, lnt, val); sim_printf (">>UBA: invalid write mask, pa = %x, lnt = %d, val = 0x%x\n", pa, lnt, val);
/* FIXME: set appropriate error bits */
}
SET_IRQL; /* update ints */ SET_IRQL; /* update ints */
return; return;
} }