From 5c48229ce4ec603f77492deed064768859e3aa6b Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 29 Aug 2020 08:16:58 -0700 Subject: [PATCH] Qbus & Unibus VAX: Add a SHOW QBA|UBA MAP{=n} command to display the bus map --- PDP11/pdp11_cpu.c | 3 --- PDP11/pdp11_io_lib.c | 57 ++++++++++++++++++++++++++++++++++++++++++++ PDP11/pdp11_io_lib.h | 1 + VAX/vax630_io.c | 13 +++++++--- VAX/vax730_uba.c | 13 +++++++--- VAX/vax750_uba.c | 13 +++++++--- VAX/vax780_uba.c | 13 +++++++--- VAX/vax820_uba.c | 23 +++++++++++------- VAX/vax_io.c | 17 +++++++++---- 9 files changed, 126 insertions(+), 27 deletions(-) diff --git a/PDP11/pdp11_cpu.c b/PDP11/pdp11_cpu.c index 19525e55..42b027d7 100644 --- a/PDP11/pdp11_cpu.c +++ b/PDP11/pdp11_cpu.c @@ -362,9 +362,6 @@ extern void fp11 (int32 IR); extern t_stat cis11 (int32 IR); extern t_stat fis11 (int32 IR); extern t_stat build_dib_tab (void); -extern t_stat show_iospace (FILE *st, UNIT *uptr, int32 val, CONST void *desc); -extern t_stat set_autocon (UNIT *uptr, int32 val, CONST char *cptr, void *desc); -extern t_stat show_autocon (FILE *st, UNIT *uptr, int32 val, CONST void *desc); extern t_stat iopageR (int32 *data, uint32 addr, int32 access); extern t_stat iopageW (int32 data, uint32 addr, int32 access); extern int32 calc_ints (int32 nipl, int32 trq); diff --git a/PDP11/pdp11_io_lib.c b/PDP11/pdp11_io_lib.c index 400c75bf..0ddb4442 100644 --- a/PDP11/pdp11_io_lib.c +++ b/PDP11/pdp11_io_lib.c @@ -572,6 +572,63 @@ for (i = 0, dibp = NULL; i < (IOPAGESIZE >> 1); i++) { /* loop thru entries */ return SCPE_OK; } +static t_bool _map_description (char *buf, size_t buf_size, uint32 val, uint32 index, uint32 valid_mask) +{ +t_bool ind_eq = (index == (val & ~valid_mask)); +const char *desc = ind_eq ? "Value == Index" : ""; +const char *valid = (val & valid_mask) ? "Valid" : ""; + +*buf = '\0'; +if (*desc || *valid) + snprintf (buf, buf_size, " (%s%s%s)", valid, (*valid && *desc) ? ", " : "", desc); +return ind_eq; +} + +/* Display bus map registers */ + +t_stat show_bus_map (FILE *st, const char *cptr, uint32 *busmap, uint32 nmapregs, const char *busname, uint32 mapvalid) +{ +t_stat r; +uint32 mr; +uint32 mstart = 0; +uint32 mend = nmapregs - 1; +uint32 same_val; +uint32 same_start; +t_bool ind_eq; +char same_desc[32]; +char desc[32]; + +if (cptr) { + mstart = mend = (uint32) get_uint (cptr, 16, nmapregs - 1, &r); + if (r != SCPE_OK) + return sim_messagef (SCPE_ARG, "Invalid %s Map Register: %s\n", busname, cptr); + } +_map_description (desc, sizeof (desc), busmap[mstart], mstart, mapvalid); +fprintf (st, "%s-MAP[%04X] = %08X%s\n", busname, mstart, busmap[mstart], desc); +same_start = mstart; +same_val = busmap[mstart]; +strcpy (same_desc, desc); +for (mr = mstart + 1; mr <= mend; mr++) { + ind_eq = _map_description (desc, sizeof (desc), busmap[mr], mr, mapvalid); + if (((same_val == busmap[mr]) && (0 == strcmp (desc, same_desc))) || + (ind_eq && (0 == strcmp (desc, same_desc)))) { + same_val = busmap[mr]; + strcpy (same_desc, desc); + continue; + } + if (same_start != mr - 1) + fprintf (st, "%s-MAP[%04X thru %04X] same as above\n", busname, same_start + 1, mr - 1); + fprintf (st, "%s-MAP[%04X] = %08X%s\n", busname, mr, busmap[mr], desc); + same_start = mr; + same_val = busmap[mr]; + strcpy (same_desc, desc); + } +if ((same_start != mend) || + (0 != strcmp (same_desc, desc))) + fprintf (st, "%s-MAP[%04X thru %04X] same as above\n", busname, same_start + 1, mend); +return SCPE_OK; +} + /* Autoconfiguration The table reflects the MicroVAX 3900 microcode, with one field diff --git a/PDP11/pdp11_io_lib.h b/PDP11/pdp11_io_lib.h index 93518e5f..fda1a4e0 100644 --- a/PDP11/pdp11_io_lib.h +++ b/PDP11/pdp11_io_lib.h @@ -37,6 +37,7 @@ t_stat set_vec (UNIT *uptr, int32 arg, CONST char *cptr, void *desc); t_stat show_vec (FILE *st, UNIT *uptr, int32 arg, CONST void *desc); t_stat show_vec_mux (FILE *st, UNIT *uptr, int32 arg, CONST void *desc); t_stat show_iospace (FILE *st, UNIT *uptr, int32 val, CONST void *desc); +t_stat show_bus_map (FILE *st, const char *cptr, uint32 *busmap, uint32 nmapregs, const char *busname, uint32 mapvalid); t_stat auto_config (const char *name, int32 nctrl); t_stat pdp11_bad_block (UNIT *uptr, int32 sec, int32 wds); void init_ubus_tab (void); diff --git a/VAX/vax630_io.c b/VAX/vax630_io.c index dd7d8d6f..c25dbbf9 100644 --- a/VAX/vax630_io.c +++ b/VAX/vax630_io.c @@ -87,10 +87,8 @@ t_stat qba_ex (t_value *vptr, t_addr exta, UNIT *uptr, int32 sw); t_stat qba_dep (t_value val, t_addr exta, UNIT *uptr, int32 sw); t_bool qba_map_addr (uint32 qa, uint32 *ma); t_bool qba_map_addr_c (uint32 qa, uint32 *ma); -t_stat set_autocon (UNIT *uptr, int32 val, CONST char *cptr, void *desc); -t_stat show_autocon (FILE *st, UNIT *uptr, int32 val, CONST void *desc); -t_stat show_iospace (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat qba_show_virt (FILE *of, UNIT *uptr, int32 val, CONST void *desc); +t_stat qba_show_map (FILE *of, UNIT *uptr, int32 val, CONST void *desc); t_stat qba_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); const char *qba_description (DEVICE *dptr); @@ -132,6 +130,8 @@ MTAB qba_mod[] = { &set_autocon, NULL, NULL, "Disable autoconfiguration" }, { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP, 0, "VIRTUAL", NULL, NULL, &qba_show_virt, NULL, "Display translation for Qbus address arg" }, + { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP, 0, "MAP", NULL, + NULL, &qba_show_map, NULL, "Display Qbus map register(s)" }, { 0 } }; @@ -814,6 +814,13 @@ fprintf (of, "Invalid argument\n"); return SCPE_OK; } +/* Show QBA map register(s) */ + +t_stat qba_show_map (FILE *of, UNIT *uptr, int32 val, CONST void *desc) +{ +return show_bus_map (of, (const char *)desc, (uint32 *)qb_map, QBNMAPR, "Qbus", QBMAP_VLD); +} + t_stat qba_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) { fprintf (st, "Qbus Adapter (QBA)\n\n"); diff --git a/VAX/vax730_uba.c b/VAX/vax730_uba.c index 794e1d59..82b9a182 100644 --- a/VAX/vax730_uba.c +++ b/VAX/vax730_uba.c @@ -103,10 +103,8 @@ int32 uba_get_ubvector (int32 lvl); t_bool uba_eval_int (int32 lvl); void uba_ubpdn (int32 time); t_bool uba_map_addr (uint32 ua, uint32 *ma); -t_stat set_autocon (UNIT *uptr, int32 val, CONST char *cptr, void *desc); -t_stat show_autocon (FILE *st, UNIT *uptr, int32 val, CONST void *desc); -t_stat show_iospace (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat uba_show_virt (FILE *st, UNIT *uptr, int32 val, CONST void *desc); +t_stat uba_show_map (FILE *st, UNIT *uptr, int32 val, CONST void *desc); extern int32 eval_int (void); extern t_stat build_dib_tab (void); @@ -160,6 +158,8 @@ MTAB uba_mod[] = { &set_autocon, NULL, NULL, "Disable autoconfiguration" }, { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP, 0, "VIRTUAL", NULL, NULL, &uba_show_virt, NULL, "Display translation for Unibus address arg" }, + { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP, 0, "MAP", NULL, + NULL, &uba_show_map, NULL, "Display Unibus Map Register(s)" }, { 0 } }; @@ -671,3 +671,10 @@ const char *uba_description (DEVICE *dptr) { return "Unibus adapter"; } + +/* Show UBA map register(s) */ + +t_stat uba_show_map (FILE *of, UNIT *uptr, int32 val, CONST void *desc) +{ +return show_bus_map (of, (const char *)desc, uba_map, UBA_NMAPR, "Unibus", UBAMAP_VLD); +} diff --git a/VAX/vax750_uba.c b/VAX/vax750_uba.c index ffd0a759..390d26de 100644 --- a/VAX/vax750_uba.c +++ b/VAX/vax750_uba.c @@ -92,10 +92,8 @@ int32 uba_get_ubvector (int32 lvl); void uba_eval_int (void); void uba_ioreset (void); t_bool uba_map_addr (uint32 ua, uint32 *ma); -t_stat set_autocon (UNIT *uptr, int32 val, CONST char *cptr, void *desc); -t_stat show_autocon (FILE *st, UNIT *uptr, int32 val, CONST void *desc); -t_stat show_iospace (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat uba_show_virt (FILE *st, UNIT *uptr, int32 val, CONST void *desc); +t_stat uba_show_map (FILE *st, UNIT *uptr, int32 val, CONST void *desc); extern int32 eval_int (void); extern t_stat build_dib_tab (void); @@ -153,6 +151,8 @@ MTAB uba_mod[] = { &set_autocon, NULL, NULL, "Disable autoconfiguration" }, { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP, 0, "VIRTUAL", NULL, NULL, &uba_show_virt, NULL, "Display translation for Unibus address arg" }, + { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP, 0, "MAP", NULL, + NULL, &uba_show_map, NULL, "Display Unibus Map Register(s)" }, { 0 } }; @@ -664,3 +664,10 @@ if (cptr) { fprintf (of, "Invalid argument\n"); return SCPE_OK; } + +/* Show UBA map register(s) */ + +t_stat uba_show_map (FILE *of, UNIT *uptr, int32 val, CONST void *desc) +{ +return show_bus_map (of, (const char *)desc, uba_map, UBA_NMAPR, "Unibus", UBAMAP_VLD); +} diff --git a/VAX/vax780_uba.c b/VAX/vax780_uba.c index 03544e7e..d9bef31f 100644 --- a/VAX/vax780_uba.c +++ b/VAX/vax780_uba.c @@ -197,10 +197,8 @@ void uba_adap_clr_int (); void uba_set_dpr (uint32 ua, t_bool wr); void uba_ubpdn (int32 time); t_bool uba_map_addr (uint32 ua, uint32 *ma); -t_stat set_autocon (UNIT *uptr, int32 val, CONST char *cptr, void *desc); -t_stat show_autocon (FILE *st, UNIT *uptr, int32 val, CONST void *desc); -t_stat show_iospace (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat uba_show_virt (FILE *st, UNIT *uptr, int32 val, CONST void *desc); +t_stat uba_show_map (FILE *st, UNIT *uptr, int32 val, CONST void *desc); extern int32 eval_int (void); extern t_stat build_dib_tab (void); @@ -273,6 +271,8 @@ MTAB uba_mod[] = { { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP, 0, "VIRTUAL", NULL, NULL, &uba_show_virt, NULL, "Show physical address translation for Unibus\n" " address arg" }, + { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP, 0, "MAP", NULL, + NULL, &uba_show_map, NULL, "Display Unibus Map Register(s)" }, { 0 } }; @@ -1003,3 +1003,10 @@ if (cptr) { fprintf (of, "Invalid argument\n"); return SCPE_OK; } + +/* Show UBA map register(s) */ + +t_stat uba_show_map (FILE *of, UNIT *uptr, int32 val, CONST void *desc) +{ +return show_bus_map (of, (const char *)desc, uba_map, UBA_NMAPR, "Unibus", UBAMAP_VLD); +} diff --git a/VAX/vax820_uba.c b/VAX/vax820_uba.c index fd97967c..9ee3516b 100644 --- a/VAX/vax820_uba.c +++ b/VAX/vax820_uba.c @@ -147,10 +147,8 @@ void uba_adap_set_int (); void uba_adap_clr_int (); void uba_ubpdn (int32 time); t_bool uba_map_addr (uint32 ua, uint32 *ma); -t_stat set_autocon (UNIT *uptr, int32 val, CONST char *cptr, void *desc); -t_stat show_autocon (FILE *st, UNIT *uptr, int32 val, CONST void *desc); -t_stat show_iospace (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat uba_show_virt (FILE *st, UNIT *uptr, int32 val, CONST void *desc); +t_stat uba_show_map (FILE *st, UNIT *uptr, int32 val, CONST void *desc); extern int32 eval_int (void); extern t_stat build_dib_tab (void); @@ -206,15 +204,17 @@ REG uba_reg[] = { MTAB uba_mod[] = { { MTAB_XTD|MTAB_VDV, TR_UBA, "NEXUS", NULL, - NULL, &show_nexus }, + NULL, &show_nexus, NULL, "Display nexus" }, { MTAB_XTD|MTAB_VDV|MTAB_NMO, 0, "IOSPACE", NULL, - NULL, &show_iospace }, + NULL, &show_iospace, NULL, "Display I/O space address map" }, { MTAB_XTD|MTAB_VDV, 1, "AUTOCONFIG", "AUTOCONFIG", - &set_autocon, &show_autocon }, + &set_autocon, &show_autocon, NULL, "Enable/Display autoconfiguration" }, { MTAB_XTD|MTAB_VDV, 0, NULL, "NOAUTOCONFIG", - &set_autocon, NULL }, + &set_autocon, NULL, NULL, "Disable autoconfiguration" }, { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP, 0, "VIRTUAL", NULL, - NULL, &uba_show_virt }, + NULL, &uba_show_virt, NULL, "Display translation for Unibus address arg" }, + { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP, 0, "MAP", NULL, + NULL, &uba_show_map, NULL, "Display Unibus Map Register(s)" }, { 0 } }; @@ -990,3 +990,10 @@ if (cptr) { fprintf (of, "Invalid argument\n"); return SCPE_OK; } + +/* Show UBA map register(s) */ + +t_stat uba_show_map (FILE *of, UNIT *uptr, int32 val, CONST void *desc) +{ +return show_bus_map (of, (const char *)desc, uba_map, UBA_NMAPR, "Unibus", UBAMAP_VLD); +} diff --git a/VAX/vax_io.c b/VAX/vax_io.c index 3e7c6535..cf63c1ba 100644 --- a/VAX/vax_io.c +++ b/VAX/vax_io.c @@ -132,10 +132,8 @@ t_stat qba_ex (t_value *vptr, t_addr exta, UNIT *uptr, int32 sw); t_stat qba_dep (t_value val, t_addr exta, UNIT *uptr, int32 sw); t_bool qba_map_addr (uint32 qa, uint32 *ma); t_bool qba_map_addr_c (uint32 qa, uint32 *ma); -t_stat set_autocon (UNIT *uptr, int32 val, CONST char *cptr, void *desc); -t_stat show_autocon (FILE *st, UNIT *uptr, int32 val, CONST void *desc); -t_stat show_iospace (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat qba_show_virt (FILE *of, UNIT *uptr, int32 val, CONST void *desc); +t_stat qba_show_map (FILE *of, UNIT *uptr, int32 val, CONST void *desc); t_stat qba_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); const char *qba_description (DEVICE *dptr); @@ -175,7 +173,9 @@ MTAB qba_mod[] = { { MTAB_XTD|MTAB_VDV, 0, NULL, "NOAUTOCONFIG", &set_autocon, NULL, NULL, "Disable autoconfiguration" }, { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP, 0, "VIRTUAL", NULL, - NULL, &qba_show_virt, NULL, "Display translation for Unibus address arg" }, + NULL, &qba_show_virt, NULL, "Display translation for Qbus address arg" }, + { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP, 0, "MAP", NULL, + NULL, &qba_show_map, NULL, "Display Qbus map register(s)" }, { 0 } }; @@ -959,6 +959,15 @@ fprintf (of, "Invalid argument\n"); return SCPE_OK; } +/* Show QBA map register(s) */ + +t_stat qba_show_map (FILE *of, UNIT *uptr, int32 val, CONST void *desc) +{ +uint32 *qb_map = &M[cq_mbr >> 2]; + +return show_bus_map (of, (const char *)desc, qb_map, (CQMAPSIZE >> 2), "Qbus", CQMAP_VLD); +} + t_stat qba_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) { fprintf (st, "Qbus Adapter (QBA)\n\n");