diff --git a/PDP11/pdp11_cpu.c b/PDP11/pdp11_cpu.c index 2657d86c..a927271e 100644 --- a/PDP11/pdp11_cpu.c +++ b/PDP11/pdp11_cpu.c @@ -331,6 +331,8 @@ t_bool cpu_is_pc_a_subroutine_call (t_addr **ret_addrs); t_stat cpu_set_hist (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat cpu_show_hist (FILE *st, UNIT *uptr, int32 val, CONST void *desc); t_stat cpu_show_virt (FILE *st, UNIT *uptr, int32 val, CONST void *desc); +t_stat cpu_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); +const char *cpu_description (DEVICE *dptr); int32 GeteaB (int32 spec); int32 GeteaW (int32 spec); int32 relocR (int32 addr); @@ -452,8 +454,8 @@ REG cpu_reg[] = { { FLDATAD (Z, PSW, PSW_V_Z, "Condition Code: Zero") }, { FLDATAD (V, PSW, PSW_V_V, "Condition Code: Overflow") }, { FLDATAD (C, PSW, PSW_V_C, "Condition Code: Carry") }, - { ORDATAD (PIRQ, PIRQ, 16, "Programmed Interrupt Request") }, - { ORDATAD (STKLIM, STKLIM, 16, "Stack Limit") }, + { ORDATAD (PIRQ, PIRQ, 16, "programmed interrupt requests") }, + { ORDATAD (STKLIM, STKLIM, 16, "stack limit") }, { ORDATAD (FAC0H, FR[0].h, 32, "Floating Point: R0 High") }, { ORDATAD (FAC0L, FR[0].l, 32, "Floating Point: R0 Low") }, { ORDATAD (FAC1H, FR[1].h, 32, "Floating Point: R1 High") }, @@ -466,9 +468,9 @@ REG cpu_reg[] = { { ORDATAD (FAC4L, FR[4].l, 32, "Floating Point: R4 Low") }, { ORDATAD (FAC5H, FR[5].h, 32, "Floating Point: R5 High") }, { ORDATAD (FAC5L, FR[5].l, 32, "Floating Point: R5 Low") }, - { ORDATAD (FPS, FPS, 16, "FP Status") }, - { ORDATAD (FEA, FEA, 16, "FP Exception Code") }, - { ORDATAD (FEC, FEC, 4, "FP Exception Address") }, + { ORDATAD (FPS, FPS, 16, "floating point status") }, + { ORDATAD (FEA, FEA, 16, "floating exception address") }, + { ORDATAD (FEC, FEC, 4, "floating exception code") }, { ORDATAD (MMR0, MMR0, 16, "MMR0 - Status") }, { ORDATAD (MMR1, MMR1, 16, "MMR1 - R+/-R") }, { ORDATAD (MMR2, MMR2, 16, "MMR2 - saved PC") }, @@ -569,17 +571,17 @@ REG cpu_reg[] = { { GRDATA (UDPDR6, APRFILE[076], 8, 16, 0) }, { GRDATA (UDPAR7, APRFILE[077], 8, 16, 16) }, { GRDATA (UDPDR7, APRFILE[077], 8, 16, 0) }, - { BRDATAD (IREQ, int_req, 8, 32, IPL_HLVL, "Interrupt Requests"), REG_RO }, - { ORDATAD (TRAPS, trap_req, TRAP_V_MAX, "Trap Requests") }, - { FLDATAD (WAIT, wait_state, 0, "Wait State") }, + { BRDATAD (IREQ, int_req, 8, 32, IPL_HLVL, "interrupt pending flags, IPL 0 to 7"), REG_RO }, + { ORDATAD (TRAPS, trap_req, TRAP_V_MAX, "trap pending flags") }, + { FLDATAD (WAIT, wait_state, 0, "wait state enable flag") }, { FLDATA (WAIT_ENABLE, wait_enable, 0), REG_HIDDEN }, - { ORDATAD (STOP_TRAPS, stop_trap, TRAP_V_MAX, "Stop on Trap") }, - { FLDATAD (STOP_VECA, stop_vecabort, 0, "Stop on Vec Abort") }, - { FLDATAD (STOP_SPA, stop_spabort, 0, "Stop on SP Abort") }, + { ORDATAD (STOP_TRAPS, stop_trap, TRAP_V_MAX, "stop on trap flags") }, + { FLDATAD (STOP_VECA, stop_vecabort, 0, "stop on read abort in trap or interrupt") }, + { FLDATAD (STOP_SPA, stop_spabort, 0, "stop on stack abort in trap or interrupt") }, { FLDATA (AUTOCON, autcon_enb, 0), REG_HRO }, - { BRDATA (PCQ, pcq, 8, 16, PCQ_SIZE), REG_RO+REG_CIRC }, + { BRDATAD (PCQ, pcq, 8, 16, PCQ_SIZE, "PC prior to last jump, branch, or interrupt; Most recent PC change first"), REG_RO+REG_CIRC }, { ORDATA (PCQP, pcq_p, 6), REG_HRO }, - { ORDATA (WRU, sim_int_char, 8) }, + { ORDATAD (WRU, sim_int_char, 8, "interrupt character") }, { ORDATA (MODEL, cpu_model, 16), REG_HRO }, { ORDATA (OPTIONS, cpu_opt, 32), REG_HRO }, { NULL} @@ -589,82 +591,80 @@ MTAB cpu_mod[] = { { MTAB_XTD|MTAB_VDV, 0, "TYPE", NULL, NULL, &cpu_show_model }, #if !defined (UC15) - { MTAB_XTD|MTAB_VDV, MOD_1103, NULL, "11/03", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1104, NULL, "11/04", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1105, NULL, "11/05", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1120, NULL, "11/20", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1123, NULL, "11/23", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1123P, NULL, "11/23+", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1124, NULL, "11/24", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1134, NULL, "11/34", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1140, NULL, "11/40", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1144, NULL, "11/44", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1145, NULL, "11/45", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1153, NULL, "11/53", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1160, NULL, "11/60", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1170, NULL, "11/70", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1173, NULL, "11/73", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1173B, NULL, "11/73B", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1183, NULL, "11/83", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1184, NULL, "11/84", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1193, NULL, "11/93", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1194, NULL, "11/94", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1173, NULL, "Q22", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1184, NULL, "URH11", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1170, NULL, "URH70", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, MOD_1145, NULL, "U18", &cpu_set_model }, - { MTAB_XTD|MTAB_VDV, OPT_EIS, NULL, "EIS", &cpu_set_opt }, - { MTAB_XTD|MTAB_VDV, OPT_EIS, NULL, "NOEIS", &cpu_clr_opt }, - { MTAB_XTD|MTAB_VDV, OPT_FIS, NULL, "FIS", &cpu_set_opt }, - { MTAB_XTD|MTAB_VDV, OPT_FIS, NULL, "NOFIS", &cpu_clr_opt }, - { MTAB_XTD|MTAB_VDV, OPT_FPP, NULL, "FPP", &cpu_set_opt }, - { MTAB_XTD|MTAB_VDV, OPT_FPP, NULL, "NOFPP", &cpu_clr_opt }, - { MTAB_XTD|MTAB_VDV, OPT_CIS, NULL, "CIS", &cpu_set_opt }, - { MTAB_XTD|MTAB_VDV, OPT_CIS, NULL, "NOCIS", &cpu_clr_opt }, - { MTAB_XTD|MTAB_VDV, OPT_MMU, NULL, "MMU", &cpu_set_opt }, - { MTAB_XTD|MTAB_VDV, OPT_MMU, NULL, "NOMMU", &cpu_clr_opt }, + { MTAB_XTD|MTAB_VDV, MOD_1103, NULL, "11/03", &cpu_set_model, NULL, NULL, "Set CPU type to 11/03" }, + { MTAB_XTD|MTAB_VDV, MOD_1104, NULL, "11/04", &cpu_set_model, NULL, NULL, "Set CPU type to 11/04" }, + { MTAB_XTD|MTAB_VDV, MOD_1105, NULL, "11/05", &cpu_set_model, NULL, NULL, "Set CPU type to 11/05" }, + { MTAB_XTD|MTAB_VDV, MOD_1120, NULL, "11/20", &cpu_set_model, NULL, NULL, "Set CPU type to 11/20" }, + { MTAB_XTD|MTAB_VDV, MOD_1123, NULL, "11/23", &cpu_set_model, NULL, NULL, "Set CPU type to 11/23" }, + { MTAB_XTD|MTAB_VDV, MOD_1123P, NULL, "11/23+", &cpu_set_model, NULL, NULL, "Set CPU type to 11/23+" }, + { MTAB_XTD|MTAB_VDV, MOD_1124, NULL, "11/24", &cpu_set_model, NULL, NULL, "Set CPU type to 11/24" }, + { MTAB_XTD|MTAB_VDV, MOD_1134, NULL, "11/34", &cpu_set_model, NULL, NULL, "Set CPU type to 11/34" }, + { MTAB_XTD|MTAB_VDV, MOD_1140, NULL, "11/40", &cpu_set_model, NULL, NULL, "Set CPU type to 11/40" }, + { MTAB_XTD|MTAB_VDV, MOD_1144, NULL, "11/44", &cpu_set_model, NULL, NULL, "Set CPU type to 11/44" }, + { MTAB_XTD|MTAB_VDV, MOD_1145, NULL, "11/45", &cpu_set_model, NULL, NULL, "Set CPU type to 11/45" }, + { MTAB_XTD|MTAB_VDV, MOD_1153, NULL, "11/53", &cpu_set_model, NULL, NULL, "Set CPU type to 11/53" }, + { MTAB_XTD|MTAB_VDV, MOD_1160, NULL, "11/60", &cpu_set_model, NULL, NULL, "Set CPU type to 11/60" }, + { MTAB_XTD|MTAB_VDV, MOD_1170, NULL, "11/70", &cpu_set_model, NULL, NULL, "Set CPU type to 11/70" }, + { MTAB_XTD|MTAB_VDV, MOD_1173, NULL, "11/73", &cpu_set_model, NULL, NULL, "Set CPU type to 11/73" }, + { MTAB_XTD|MTAB_VDV, MOD_1173B, NULL, "11/73B", &cpu_set_model, NULL, NULL, "Set CPU type to 11/73B" }, + { MTAB_XTD|MTAB_VDV, MOD_1183, NULL, "11/83", &cpu_set_model, NULL, NULL, "Set CPU type to 11/83" }, + { MTAB_XTD|MTAB_VDV, MOD_1184, NULL, "11/84", &cpu_set_model, NULL, NULL, "Set CPU type to 11/84" }, + { MTAB_XTD|MTAB_VDV, MOD_1193, NULL, "11/93", &cpu_set_model, NULL, NULL, "Set CPU type to 11/93" }, + { MTAB_XTD|MTAB_VDV, MOD_1194, NULL, "11/94", &cpu_set_model, NULL, NULL, "Set CPU type to 11/94" }, + { MTAB_XTD|MTAB_VDV, MOD_1173, NULL, "Q22", &cpu_set_model, NULL, NULL, "deprecated: same as 11/73" }, + { MTAB_XTD|MTAB_VDV, MOD_1184, NULL, "URH11", &cpu_set_model, NULL, NULL, "deprecated: same as 11/84" }, + { MTAB_XTD|MTAB_VDV, MOD_1170, NULL, "URH70", &cpu_set_model, NULL, NULL, "deprecated: same as 11/70" }, + { MTAB_XTD|MTAB_VDV, MOD_1145, NULL, "U18", &cpu_set_model, NULL, NULL, "deprecated: same as 11/45" }, + { MTAB_XTD|MTAB_VDV, OPT_EIS, NULL, "EIS", &cpu_set_opt, NULL, NULL, "enable EIS instructions" }, + { MTAB_XTD|MTAB_VDV, OPT_EIS, NULL, "NOEIS", &cpu_clr_opt, NULL, NULL, "disable EIS instructions" }, + { MTAB_XTD|MTAB_VDV, OPT_FIS, NULL, "FIS", &cpu_set_opt, NULL, NULL, "enable FIS instructions" }, + { MTAB_XTD|MTAB_VDV, OPT_FIS, NULL, "NOFIS", &cpu_clr_opt, NULL, NULL, "disable FIS instructions" }, + { MTAB_XTD|MTAB_VDV, OPT_FPP, NULL, "FPP", &cpu_set_opt, NULL, NULL, "enable FPP instructions" }, + { MTAB_XTD|MTAB_VDV, OPT_FPP, NULL, "NOFPP", &cpu_clr_opt, NULL, NULL, "disable FPP instructions" }, + { MTAB_XTD|MTAB_VDV, OPT_CIS, NULL, "CIS", &cpu_set_opt, NULL, NULL, "enable CIS instructions" }, + { MTAB_XTD|MTAB_VDV, OPT_CIS, NULL, "NOCIS", &cpu_clr_opt, NULL, NULL, "disable CIS instructions" }, { MTAB_XTD|MTAB_VDV, OPT_BVT, NULL, "BEVENT", &cpu_set_opt, NULL, NULL, "Enable BEVENT line (11/03, 11/23 only)" }, { MTAB_XTD|MTAB_VDV, OPT_BVT, NULL, "NOBEVENT", &cpu_clr_opt, NULL, NULL, "Disable BEVENT line (11/03, 11/23 only)" }, - { UNIT_MSIZE, 8192, NULL, "8K", &cpu_set_size}, - { UNIT_MSIZE, 16384, NULL, "16K", &cpu_set_size}, - { UNIT_MSIZE, 24576, NULL, "24K", &cpu_set_size}, - { UNIT_MSIZE, 32768, NULL, "32K", &cpu_set_size}, - { UNIT_MSIZE, 40960, NULL, "40K", &cpu_set_size}, - { UNIT_MSIZE, 49152, NULL, "48K", &cpu_set_size}, - { UNIT_MSIZE, 57344, NULL, "56K", &cpu_set_size}, - { UNIT_MSIZE, 65536, NULL, "64K", &cpu_set_size}, - { UNIT_MSIZE, 98304, NULL, "96K", &cpu_set_size}, - { UNIT_MSIZE, 131072, NULL, "128K", &cpu_set_size}, - { UNIT_MSIZE, 196608, NULL, "192K", &cpu_set_size}, - { UNIT_MSIZE, 262144, NULL, "256K", &cpu_set_size}, - { UNIT_MSIZE, 393216, NULL, "384K", &cpu_set_size}, - { UNIT_MSIZE, 524288, NULL, "512K", &cpu_set_size}, - { UNIT_MSIZE, 786432, NULL, "768K", &cpu_set_size}, - { UNIT_MSIZE, 1048576, NULL, "1024K", &cpu_set_size}, - { UNIT_MSIZE, 1572864, NULL, "1536K", &cpu_set_size}, - { UNIT_MSIZE, 2097152, NULL, "2048K", &cpu_set_size}, - { UNIT_MSIZE, 3145728, NULL, "3072K", &cpu_set_size}, - { UNIT_MSIZE, 4186112, NULL, "4096K", &cpu_set_size}, - { UNIT_MSIZE, 1048576, NULL, "1M", &cpu_set_size}, - { UNIT_MSIZE, 2097152, NULL, "2M", &cpu_set_size}, - { UNIT_MSIZE, 3145728, NULL, "3M", &cpu_set_size}, - { UNIT_MSIZE, 4186112, NULL, "4M", &cpu_set_size}, + { UNIT_MSIZE, 8192, NULL, "8K", &cpu_set_size, NULL, NULL, "Set memory size to 8Kb"}, + { UNIT_MSIZE, 16384, NULL, "16K", &cpu_set_size, NULL, NULL, "Set memory size to 16Kb"}, + { UNIT_MSIZE, 24576, NULL, "24K", &cpu_set_size, NULL, NULL, "Set memory size to 24Kb"}, + { UNIT_MSIZE, 32768, NULL, "32K", &cpu_set_size, NULL, NULL, "Set memory size to 32Kb"}, + { UNIT_MSIZE, 40960, NULL, "40K", &cpu_set_size, NULL, NULL, "Set memory size to 40Kb"}, + { UNIT_MSIZE, 49152, NULL, "48K", &cpu_set_size, NULL, NULL, "Set memory size to 48Kb"}, + { UNIT_MSIZE, 57344, NULL, "56K", &cpu_set_size, NULL, NULL, "Set memory size to 56Kb"}, + { UNIT_MSIZE, 65536, NULL, "64K", &cpu_set_size, NULL, NULL, "Set memory size to 64Kb"}, + { UNIT_MSIZE, 98304, NULL, "96K", &cpu_set_size, NULL, NULL, "Set memory size to 96Kb"}, + { UNIT_MSIZE, 131072, NULL, "128K", &cpu_set_size, NULL, NULL, "Set memory size to 128Kb"}, + { UNIT_MSIZE, 196608, NULL, "192K", &cpu_set_size, NULL, NULL, "Set memory size to 192Kb"}, + { UNIT_MSIZE, 262144, NULL, "256K", &cpu_set_size, NULL, NULL, "Set memory size to 256Kb"}, + { UNIT_MSIZE, 393216, NULL, "384K", &cpu_set_size, NULL, NULL, "Set memory size to 384Kb"}, + { UNIT_MSIZE, 524288, NULL, "512K", &cpu_set_size, NULL, NULL, "Set memory size to 512Kb"}, + { UNIT_MSIZE, 786432, NULL, "768K", &cpu_set_size, NULL, NULL, "Set memory size to 768Kb"}, + { UNIT_MSIZE, 1048576, NULL, "1024K", &cpu_set_size, NULL, NULL, "Set memory size to 1Mb"}, + { UNIT_MSIZE, 1572864, NULL, "1536K", &cpu_set_size, NULL, NULL, "Set memory size to 1536Kb"}, + { UNIT_MSIZE, 2097152, NULL, "2048K", &cpu_set_size, NULL, NULL, "Set memory size to 2Mb"}, + { UNIT_MSIZE, 3145728, NULL, "3072K", &cpu_set_size, NULL, NULL, "Set memory size to 3Mb"}, + { UNIT_MSIZE, 4186112, NULL, "4096K", &cpu_set_size, NULL, NULL, "Set memory size to 4Mb"}, + { UNIT_MSIZE, 1048576, NULL, "1M", &cpu_set_size, NULL, NULL, "Set memory size to 1Mb"}, + { UNIT_MSIZE, 2097152, NULL, "2M", &cpu_set_size, NULL, NULL, "Set memory size to 2Mb"}, + { UNIT_MSIZE, 3145728, NULL, "3M", &cpu_set_size, NULL, NULL, "Set memory size to 3Mb"}, + { UNIT_MSIZE, 4186112, NULL, "4M", &cpu_set_size, NULL, NULL, "Set memory size to 4Mb"}, { MTAB_XTD|MTAB_VDV, 1, "AUTOCONFIG", "AUTOCONFIG", - &set_autocon, &show_autocon }, + &set_autocon, &show_autocon, NULL, "Enable/Display Auto Configuration" }, { MTAB_XTD|MTAB_VDV, 0, NULL, "NOAUTOCONFIG", - &set_autocon, NULL }, + &set_autocon, NULL, NULL, "Disable Auto Configuration" }, #else - { UNIT_MSIZE, 16384, NULL, "16K", &cpu_set_size}, - { UNIT_MSIZE, 24576, NULL, "24K", &cpu_set_size}, + { UNIT_MSIZE, 16384, NULL, "16K", &cpu_set_size, NULL, NULL, "Set memory size to 16Kb"}, + { UNIT_MSIZE, 24576, NULL, "24K", &cpu_set_size, NULL, NULL, "Set memory size to 24Kb"}, #endif { MTAB_XTD|MTAB_VDV|MTAB_NMO, 0, "IOSPACE", NULL, - NULL, &show_iospace }, - { MTAB_XTD|MTAB_VDV, 0, "IDLE", "IDLE", &sim_set_idle, &sim_show_idle }, - { MTAB_XTD|MTAB_VDV, 0, NULL, "NOIDLE", &sim_clr_idle, NULL }, - { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP, 0, "HISTORY", "HISTORY", - &cpu_set_hist, &cpu_show_hist }, + NULL, &show_iospace, NULL, "Show I/O space address assignments" }, + { MTAB_XTD|MTAB_VDV, 0, "IDLE", "IDLE", &sim_set_idle, &sim_show_idle, NULL, "Enable/Display idle detection" }, + { MTAB_XTD|MTAB_VDV, 0, NULL, "NOIDLE", &sim_clr_idle, NULL, NULL, "Disable idle detection" }, + { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP|MTAB_NC, 0, "HISTORY", "HISTORY=n", + &cpu_set_hist, &cpu_show_hist, NULL, "Enable/Display instruction history" }, { MTAB_XTD|MTAB_VDV|MTAB_NMO|MTAB_SHP, 0, "VIRTUAL", NULL, - NULL, &cpu_show_virt }, + NULL, &cpu_show_virt, NULL, "Display address translation" }, { 0 } }; @@ -685,7 +685,7 @@ DEVICE cpu_dev = { &cpu_boot, NULL, NULL, NULL, DEV_DYNM, 0, NULL, &cpu_set_size, NULL, - NULL, NULL, NULL, NULL, + &cpu_help, NULL, NULL, &cpu_description, cpu_breakpoints }; @@ -3650,3 +3650,144 @@ if (cptr) { fprintf (of, "Invalid argument\n"); return SCPE_OK; } + +const char *cpu_description (DEVICE *dptr) +{ +return "PDP-11 CPU"; +} + +t_stat cpu_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) +{ +int i; + +fprintf (st, "The %s (%s) device help\n\n", dptr->description (dptr), dptr->name); +fprintf (st, "The CPU options include CPU type, CPU instruction set options for the\n"); +fprintf (st, "specified type, and the size of main memory.\n\n"); +fprint_set_help (st, dptr); +fprintf (st, "\n"); +fprintf (st, "The CPU types and their capabilities are shown in the following table:\n\n"); +fprintf (st, " cpu max Unibus\n"); +fprintf (st, " type bus mem MMU? map? EIS? FIS? FPP? CIS? BEVENT?\n"); +fprintf (st, " ================================================================\n"); +#define _OPT(OPT) ((cpu->std & OPT) ? ((cpu->opt & OPT) ? "opt" : "std") : ((cpu->opt & OPT) ? "opt" : "no")) +for (i = 0; i < MOD_MAX; i++) { + CPUTAB *cpu = &cpu_tab[i]; + + fprintf (st, " %-6s %s %-7s %-3s %-3s %-3s %-3s %-3s %-3s %-3s\n", + cpu->name, + (cpu->std & BUS_Q) ? "Q" : "U", + (cpu->maxm == MEMSIZE64K) ? "64K" : ((cpu->maxm == MAXMEMSIZE) ? "4M" : ((cpu->maxm == UNIMEMSIZE) ? "256K" : "UNK")), + _OPT(OPT_MMU), _OPT(OPT_UBM), _OPT(OPT_EIS), _OPT(OPT_FIS), + _OPT(OPT_FPP), _OPT(OPT_CIS), _OPT(OPT_BVT)); + } +fprintf (st, "\n"); +fprintf (st, "If a capability is standard, it cannot be disabled; if a capability\n"); +fprintf (st, "is not included, it cannot be enabled.\n\n"); +fprint_show_help (st, dptr); +fprintf (st, "\n"); +fprintf (st, "If memory size is being reduced, and the memory being truncated contains\n"); +fprintf (st, "non-zero data, the simulator asks for confirmation. Data in the truncated\n"); +fprintf (st, "portion of memory is lost. Initial memory size is 256KB. If memory size\n"); +fprintf (st, "is increased to more than 256KB, or the bus structure is changed, the\n"); +fprintf (st, "simulator disables peripherals that can't run in the current bus structure.\n\n"); +fprintf (st, "These switches are recognized when examining or depositing in CPU memory:\n\n"); +fprintf (st, " -v interpret address as virtual\n"); +fprintf (st, " -t if mem mgt enabled, force data space\n"); +fprintf (st, " -k if mem mgt enabled, force kernel mode\n"); +fprintf (st, " -s if mem mgt enabled, force supervisor mode\n"); +fprintf (st, " -u if mem mgt enabled, force user mode\n"); +fprintf (st, " -p if mem mgt enabled, force previous mode\n\n"); +fprintf (st, "CPU registers include the architectural state of the PDP-11 processor as\n"); +fprintf (st, "well as the control registers for the interrupt system.\n\n"); +fprint_reg_help (st, dptr); +fprintf (st, "\n"); +fprintf (st, "The CPU attempts to detect when the simulator is idle. When idle, the\n"); +fprintf (st, "simulator does not use any resources on the host system. Idle detection\n"); +fprintf (st, "is controlled by the SET IDLE and SET NOIDLE commands:\n\n"); +fprintf (st, " SET CPU IDLE enable idle detection\n"); +fprintf (st, " SET CPU NOIDLE disable idle detection\n\n"); +fprintf (st, "Idle detection is disabled by default. The CPU is considered idle if a\n"); +fprintf (st, "WAIT instruction is executed. This will work for RSTS/E and RSX-11M+, but\n"); +fprintf (st, "not for RT-11 or UNIX.\n\n"); +fprintf (st, "The CPU can maintain a history of the most recently executed instructions.\n"); +fprintf (st, "This is controlled by the SET CPU HISTORY and SHOW CPU HISTORY commands:\n\n"); +fprintf (st, " SET CPU HISTORY clear history buffer\n"); +fprintf (st, " SET CPU HISTORY=0 disable history\n"); +fprintf (st, " SET CPU HISTORY=n enable history, length = n\n"); +fprintf (st, " SHOW CPU HISTORY print CPU history\n"); +fprintf (st, " SHOW CPU HISTORY=n print first n entries of CPU history\n\n"); +fprintf (st, "The maximum length for the history is 262144 entries.\n\n"); + +fprintf (st, "Unibus and Qbus DMA Devices\n\n"); +fprintf (st, "DMA peripherals function differently, depending on whether the CPU type\n"); +fprintf (st, "supports the Unibus or the Qbus, and whether the Unibus supports 22b direct\n"); +fprintf (st, "memory access (11/70 with RH70 controllers):\n\n"); +fprintf (st, " peripheral 11/70 all Qbus\n"); +fprintf (st, " +RH70 other\n"); +fprintf (st, " Unibus\n"); +fprintf (st, " ==========================================================\n"); +fprintf (st, " CD 18b 18b disabled\n"); +fprintf (st, " RC 18b 18b disabled\n"); +fprintf (st, " RF 18b 18b disabled\n"); +fprintf (st, " RK 18b 18b disabled if mem > 256K\n"); +fprintf (st, " HK 18b 18b disabled if mem > 256K\n"); +fprintf (st, " RL 18b 18b 22b RLV12\n"); +fprintf (st, " RP 22b 18b 22b third party\n"); +fprintf (st, " RQ 18b 18b 22b RQDX3\n"); +fprintf (st, " RY 18b 18b disabled if mem > 256K\n"); +fprintf (st, " TC 18b 18b disabled\n"); +fprintf (st, " TM 18b 18b disabled if mem > 256K\n"); +fprintf (st, " TS 18b 18b 22b TSV05\n"); +fprintf (st, " TQ 18b 18b 22b TQK50\n"); +fprintf (st, " TU 22b 18b 22b third party\n"); +fprintf (st, " VH 18b 18b 22b DHQ11\n"); +fprintf (st, " XQ disabled disabled 22b DELQA\n"); +fprintf (st, " XU 18b 18b disabled\n\n"); +fprintf (st, "Non-DMA peripherals work the same in all configurations. Unibus-only\n"); +fprintf (st, "peripherals are disabled in a Qbus configuration, and Qbus-only peripherals\n"); +fprintf (st, "are disabled in a Unibus configuration. In addition, Qbus DMA peripherals\n"); +fprintf (st, "with only 18b addressing capability are disabled in a Qbus configuration\n"); +fprintf (st, "with more than 256KB memory.\n\n"); +fprintf (st, "I/O Device Addressing\n\n"); +fprintf (st, "PDP-11 I/O space and vector space are not large enough to allow all\n"); +fprintf (st, "theoretically possible devices to be configured simultaneously at\n"); +fprintf (st, "fixed addresses. Instead, many devices have floating addresses and\n"); +fprintf (st, "vectors; that is, the assigned device address and vector depend on the\n"); +fprintf (st, "presence of other devices in the configuration:\n\n"); +fprintf (st, " DZ11 all instances have floating addresses\n"); +fprintf (st, " DHU11/DHQ11 all instances have floating addresses\n"); +fprintf (st, " RL11 first instance has fixed address, rest floating\n"); +fprintf (st, " RX11/RX211 first instance has fixed address, rest floating\n"); +fprintf (st, " DEUNA/DELUA first instance has fixed address, rest floating\n"); +fprintf (st, " MSCP disk first instance has fixed address, rest floating\n"); +fprintf (st, " TMSCP tape first instance has fixed address, rest floating\n\n"); +fprintf (st, "In addition, some devices with fixed I/O space addresses have floating\n"); +fprintf (st, "vector addresses. DCI/DCO and DLI/DLO have floating vector addresses.\n\n"); +fprintf (st, "To maintain addressing consistency as the configuration changes, the\n"); +fprintf (st, "simulator implements DEC's standard I/O address and vector autoconfiguration.\n"); +fprintf (st, "This allows the user to enable or disable devices without needing to\n"); +fprintf (st, "manage I/O addresses and vectors. For example, if RY is enabled while\n"); +fprintf (st, "RX is present, RY is assigned an I/O address in the floating I/O space\n"); +fprintf (st, "range; but if RX is disabled and then RY is enabled, RY is assigned the\n"); +fprintf (st, "fixed \"first instance\" I/O address for floppy disks.\n\n"); +fprintf (st, "Autoconfiguration cannot solve address conflicts between devices with\n"); +fprintf (st, "overlapping fixed addresses. For example, with default I/O page addressing,\n"); +fprintf (st, "the PDP-11 can support either a TM11 or a TS11, but not both, since they\n"); +fprintf (st, "use the same I/O addresses.\n\n"); +fprintf (st, "In addition to autoconfiguration, most devices support the SET \n"); +fprintf (st, "ADDRESS command, which allows the I/O page address of the device to be\n"); +fprintf (st, "changed, and the SET VECTOR command, which allows the vector of\n"); +fprintf (st, "the device to be changed. Explicitly setting the I/O address of any device\n"); +fprintf (st, "DISABLES autoconfiguration for that device and for the entire system. As\n"); +fprintf (st, "a consequence, the user may have to manually configure all other\n"); +fprintf (st, "autoconfigured devices, because the autoconfiguration algorithm no longer\n"); +fprintf (st, "recognizes the explicitly configured device. A device can be reset to\n"); +fprintf (st, "autoconfigure with the SET AUTOCONFIGURE command.\n"); +fprintf (st, "autoconfiguration can be restored for the entire system with the SET\n"); +fprintf (st, "CPU AUTOCONFIGURE command.\n\n"); +fprintf (st, "The current I/O map can be displayed with the SHOW CPU IOSPACE command.\n"); +fprintf (st, "Addresses that have set by autoconfiguration are marked with an asterisk (*).\n"); +fprintf (st, "All devices support the SHOW ADDRESS and SHOW VECTOR\n"); +fprintf (st, "commands, which display the device address and vector, respectively.\n\n"); +return SCPE_OK; +} diff --git a/PDP11/pdp11_cpumod.c b/PDP11/pdp11_cpumod.c index 15e804cf..08972422 100644 --- a/PDP11/pdp11_cpumod.c +++ b/PDP11/pdp11_cpumod.c @@ -123,6 +123,9 @@ void toy_write (int32 bit); uint8 toy_set (int32 val); t_stat sys_set_jclk_dflt (UNIT *uptr, int32 val, CONST char *cptr, void *desc); t_stat sys_show_jclk_dflt (FILE *st, UNIT *uptr, int32 val, CONST void *desc); +static t_stat sys_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr); +static const char *sys_description (DEVICE *dptr); + extern t_stat PSW_rd (int32 *data, int32 addr, int32 access); extern t_stat PSW_wr (int32 data, int32 addr, int32 access); @@ -190,14 +193,14 @@ CPUTAB cpu_tab[MOD_MAX] = { MFPT_44, PAR_1144, PDR_1144, MM0_1144, MM3_1144 }, { "11/45", SOP_1145, OPT_1145, UNIMEMSIZE, PSW_1145, 0, PAR_1145, PDR_1145, MM0_1145, MM3_1145 }, + { "11/53", SOP_1153, OPT_1153, MAXMEMSIZE, PSW_J, + MFPT_J, PAR_J, PDR_J, MM0_J, MM3_J }, { "11/60", SOP_1160, OPT_1160, UNIMEMSIZE, PSW_1160, 0, PAR_1160, PDR_1160, MM0_1160, 0 }, { "11/70", SOP_1170, OPT_1170, MAXMEMSIZE, PSW_1170, 0, PAR_1170, PDR_1170, MM0_1170, MM3_1170 }, { "11/73", SOP_1173, OPT_1173, MAXMEMSIZE, PSW_J, MFPT_J, PAR_J, PDR_J, MM0_J, MM3_J }, - { "11/53", SOP_1153, OPT_1153, MAXMEMSIZE, PSW_J, - MFPT_J, PAR_J, PDR_J, MM0_J, MM3_J }, { "11/73B", SOP_1173B, OPT_1173B, MAXMEMSIZE, PSW_J, MFPT_J, PAR_J, PDR_J, MM0_J, MM3_J }, { "11/83", SOP_1183, OPT_1183, MAXMEMSIZE, PSW_J, @@ -263,33 +266,73 @@ static const char *jcsr_val[4] = { UNIT sys_unit = { UDATA (NULL, 0, 0) }; REG sys_reg[] = { - { ORDATA (SR, SR, 16) }, - { ORDATA (DR, DR, 16) }, - { ORDATA (MEMERR, MEMERR, 16) }, - { ORDATA (CCR, CCR, 16) }, - { ORDATA (MAINT, MAINT, 16) }, - { ORDATA (HITMISS, HITMISS, 16) }, - { ORDATA (CPUERR, CPUERR, 16) }, - { ORDATA (MBRK, MBRK, 16) }, - { ORDATA (WCS, WCS, 16) }, - { ORDATA (SYSID, SYSID, 16) }, - { ORDATA (JCSR, JCSR, 16) }, + { ORDATAD (SR, SR, 16, "switch or configuration register (" + "11/04, 11/05, 11/20, " + "11/23+, 11/34, 11/40, " + "11/44, 11/45, 11/60, " + "11/70, 11/73B, 11/83, " + "11/84, 11/93, 11/94)") }, + { ORDATAD (DR, DR, 16, "display register or board LEDs (" + "11/04, 11/05, 11/20, " + "1123+, 11/24, 11/34, " + "11/70, 11/73B, 11/83, " + "11/84, 11/93, 11/94)") }, + { ORDATAD (MEMERR, MEMERR, 16, "memory error register (" + "11/44, 11/60, 11/70, " + "11/53, 11/73, 11/73B, " + "11/83, 11/84, 11/93, " + "11/94)") }, + { ORDATAD (CCR, CCR, 16, "cache control register (" + "11/44, 11/60, 11/70, " + "11/53, 11/73, 11/73B, " + "11/83, 11/84, 11/93, " + "11/94)") }, + { ORDATAD (MAINT, MAINT, 16, "maintenance register (" + "11/23+, 11/44, 11/70, " + "11/53, 11/73, 11/73B, " + "11/83, 11/84, 11/93, " + "11/94)") }, + { ORDATAD (HITMISS, HITMISS, 16, "hit/miss register (" + "11/44, 11/60, 11/70, " + "11/53, 11/73, 11/73B, " + "11/83, 11/84, 11/93, " + "11/94)") }, + { ORDATAD (CPUERR, CPUERR, 16, "CPU error register (" + "11/24, 11/44, 11/70, " + "11/53, 11/73, 11/73B, " + "11/83, 11/84, 11/93, " + "11/94)") }, + { ORDATAD (MBRK, MBRK, 16, "microbreak register (" + "11/45, 11/70)") }, + { ORDATAD (WCS, WCS, 16, "WCS control (11/60)") }, + { ORDATAD (SYSID, SYSID, 16, "system ID (11/70 - default = 1234 hex)") }, + { ORDATAD (JCSR, JCSR, 16, "board control/status (" + "11/53, 11/73B, 11/83, " + "11/84, 11/93, 11/94)") }, { ORDATA (JCSR_DFLT, JCSR_dflt, 16), REG_HRO }, - { ORDATA (JPCR, JPCR, 16) }, - { ORDATA (JASR, JASR, 16) }, - { ORDATA (UDCR, UDCR, 16) }, - { ORDATA (UDDR, UDDR, 16) }, - { ORDATA (UCSR, UCSR, 16) }, - { ORDATA (ULAST, uba_last, 23) }, - { BRDATA (UBMAP, ub_map, 8, 22, UBM_LNT_LW) }, + { ORDATAD (JPCR, JPCR, 16, "page control register (" + "11/23+, 11/53, 11/73B, " + "11/83, 11/84, 11/93, " + "11/94)") }, + { ORDATAD (JASR, JASR, 16, "additional status (" + "11/93, 11/94)") }, + { ORDATAD (UDCR, UDCR, 16, "Unibus map diag control (" + "11/84, 11/94)") }, + { ORDATAD (UDDR, UDDR, 16, "Unibus map diag data (" + "11/84, 11/94)") }, + { ORDATAD (UCSR, UCSR, 16, "Unibus map control/status (" + "11/84, 11/94)") }, + { ORDATAD (ULAST, uba_last, 23, "last Unibus map result (" + "11/24)") }, + { BRDATAD (UBMAP, ub_map, 8, 22, UBM_LNT_LW, "UBA map array") }, { DRDATA (TOY_STATE, toy_state, 6), REG_HRO }, { BRDATA (TOY_DATA, toy_data, 8, 8, TOY_LNT), REG_HRO }, { NULL} }; MTAB sys_mod[] = { - { MTAB_XTD|MTAB_VDV|MTAB_NMO, 0, "JCLK_DFLT", "JCLK_DFLT", - &sys_set_jclk_dflt, &sys_show_jclk_dflt }, + { MTAB_XTD|MTAB_VDV|MTAB_NMO, 0, "JCLK_DFLT", "JCLK_DFLT={LINE|50HZ|60HZ|800HZ}", + &sys_set_jclk_dflt, &sys_show_jclk_dflt, NULL, "J11 default clock frequency" }, { 0 } }; @@ -299,7 +342,8 @@ DEVICE sys_dev = { NULL, NULL, &sys_reset, NULL, NULL, NULL, NULL, 0, 0, - NULL, NULL, NULL + NULL, NULL, NULL, + &sys_help, NULL, NULL, &sys_description }; /* Switch and display registers - many */ @@ -1126,8 +1170,17 @@ t_stat cpu_set_opt (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { if (cptr) return SCPE_ARG; -if ((val & cpu_tab[cpu_model].opt) == 0) - return SCPE_ARG; +if ((val & cpu_tab[cpu_model].opt) == 0) { + uint32 i; + + for (i = 0; opt_name[2 * i] != NULL; i++) { + if ((val >> i) & 1) + break; + } + return sim_messagef (SCPE_ARG, "The %s option can't be enabled on a %s CPU\n", + ((val >> i) & 1)? opt_name[2 * i] : "unknown", + cpu_tab[cpu_model].name); + } cpu_opt = cpu_opt | val; return SCPE_OK; } @@ -1136,8 +1189,17 @@ t_stat cpu_clr_opt (UNIT *uptr, int32 val, CONST char *cptr, void *desc) { if (cptr) return SCPE_ARG; -if ((val & cpu_tab[cpu_model].opt) == 0) - return SCPE_ARG; +if ((val & cpu_tab[cpu_model].opt) == 0) { + uint32 i; + + for (i = 0; opt_name[2 * i] != NULL; i++) { + if ((val >> i) & 1) + break; + } + return sim_messagef (SCPE_ARG, "The %s option can't be disabled on a %s CPU\n", + ((val >> i) & 1)? opt_name[2 * i] : "unknown", + cpu_tab[cpu_model].name); + } cpu_opt = cpu_opt & ~val; return SCPE_OK; } @@ -1253,3 +1315,23 @@ if (CPUT (CPUT_JB|CPUT_JE)) else fprintf (st, "Not implemented\n"); return SCPE_OK; } + +const char *sys_description (DEVICE *dptr) +{ +return "PDP-11 model options"; +} + +t_stat sys_help (FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) +{ +fprintf (st, "The %s (%s) device help\n\n", dptr->description (dptr), dptr->name); +fprintf (st, "The SYSTEM device implements registers that vary among CPU types:\n"); +fprint_reg_help (st, dptr); +fprintf (st, "\n"); +fprintf (st, "For the 11/83, 11/84, 11/93, and 11/94, the user can set the default value\n"); +fprintf (st, "of the clock frequency:\n\n"); +fprint_set_help (st, dptr); +fprintf (st, "\n"); +fprintf (st, "The user can check the default value with:\n"); +fprint_show_help (st, dptr); +return SCPE_OK; +} diff --git a/PDP11/pdp11_cr.c b/PDP11/pdp11_cr.c index 9ab9d04d..1547ff4c 100644 --- a/PDP11/pdp11_cr.c +++ b/PDP11/pdp11_cr.c @@ -1832,6 +1832,8 @@ if (string) { if (crtypes & 4) strlcat (devtype, "CD20/", sizeof (devtype)); strlcpy (string, devtype, string_aize); + if (string[strlen (string) - 1] == '/') + string[strlen (string) - 1] = '\0'; } if (bits) *bits = crtypes; diff --git a/PDP11/pdp11_dup.c b/PDP11/pdp11_dup.c index ffd6599a..d46f2d8d 100644 --- a/PDP11/pdp11_dup.c +++ b/PDP11/pdp11_dup.c @@ -1487,8 +1487,8 @@ const char helpString[] = " data rates. The maximum emulated rate is dependent on the host CPU's\n" " available cycles.\n" "1 Hardware Description\n" - " The %1s %D11 consists of a microprocessor module and a synchronous line unit\n" - " module.\n" + " The %1s %D11 consists of a microprocessor module and a synchronous line\n" + " unit module.\n" "2 $Registers\n" "\n" " These registers contain the emulated state of the device. These values\n"