From 19f8fccbc1db99a066edcfaa9323c470ad4a8e9d Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 15 Jan 2013 10:19:52 -0800 Subject: [PATCH] Added HELP device REGISTERS support and register definitions for the VAX CPU device --- VAX/vax_cpu.c | 88 +++++++++++++++++------------------ scp.c | 126 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 130 insertions(+), 84 deletions(-) diff --git a/VAX/vax_cpu.c b/VAX/vax_cpu.c index 9da3ad71..062cf74d 100644 --- a/VAX/vax_cpu.c +++ b/VAX/vax_cpu.c @@ -408,55 +408,55 @@ UNIT cpu_unit = { }; REG cpu_reg[] = { - { HRDATA (PC, R[nPC], 32) }, - { HRDATA (R0, R[0], 32) }, - { HRDATA (R1, R[1], 32) }, - { HRDATA (R2, R[2], 32) }, - { HRDATA (R3, R[3], 32) }, - { HRDATA (R4, R[4], 32) }, - { HRDATA (R5, R[5], 32) }, - { HRDATA (R6, R[6], 32) }, - { HRDATA (R7, R[7], 32) }, - { HRDATA (R8, R[8], 32) }, - { HRDATA (R9, R[9], 32) }, - { HRDATA (R10, R[10], 32) }, - { HRDATA (R11, R[11], 32) }, - { HRDATA (R12, R[12], 32) }, - { HRDATA (R13, R[13], 32) }, - { HRDATA (R14, R[14], 32) }, - { HRDATA (AP, R[nAP], 32) }, - { HRDATA (FP, R[nFP], 32) }, - { HRDATA (SP, R[nSP], 32) }, - { HRDATA (PSL, PSL, 32) }, - { HRDATA (CC, PSL, 4) }, - { HRDATA (KSP, KSP, 32) }, - { HRDATA (ESP, ESP, 32) }, - { HRDATA (SSP, SSP, 32) }, - { HRDATA (USP, USP, 32) }, - { HRDATA (IS, IS, 32) }, - { HRDATA (SCBB, SCBB, 32) }, - { HRDATA (PCBB, PCBB, 32) }, - { HRDATA (P0BR, P0BR, 32) }, - { HRDATA (P0LR, P0LR, 22) }, - { HRDATA (P1BR, P1BR, 32) }, - { HRDATA (P1LR, P1LR, 22) }, - { HRDATA (SBR, SBR, 32) }, - { HRDATA (SLR, SLR, 22) }, - { HRDATA (SISR, SISR, 16) }, - { HRDATA (ASTLVL, ASTLVL, 4) }, - { FLDATA (MAPEN, mapen, 0) }, - { FLDATA (PME, pme, 0) }, - { HRDATA (TRPIRQ, trpirq, 8) }, - { FLDATA (CRDERR, crd_err, 0) }, - { FLDATA (MEMERR, mem_err, 0) }, - { FLDATA (HLTPIN, hlt_pin, 0) }, + { HRDATAD (PC, R[nPC], 32, "program counter") }, + { HRDATAD (R0, R[0], 32, "General Purpose Register 0") }, + { HRDATAD (R1, R[1], 32, "General Purpose Register 1") }, + { HRDATAD (R2, R[2], 32, "General Purpose Register 2") }, + { HRDATAD (R3, R[3], 32, "General Purpose Register 3") }, + { HRDATAD (R4, R[4], 32, "General Purpose Register 4") }, + { HRDATAD (R5, R[5], 32, "General Purpose Register 5") }, + { HRDATAD (R6, R[6], 32, "General Purpose Register 6") }, + { HRDATAD (R7, R[7], 32, "General Purpose Register 7") }, + { HRDATAD (R8, R[8], 32, "General Purpose Register 8") }, + { HRDATAD (R9, R[9], 32, "General Purpose Register 9") }, + { HRDATAD (R10, R[10], 32, "General Purpose Register 10") }, + { HRDATAD (R11, R[11], 32, "General Purpose Register 11") }, + { HRDATAD (R12, R[12], 32, "General Purpose Register 12") }, + { HRDATAD (R13, R[13], 32, "General Purpose Register 13") }, + { HRDATAD (R14, R[14], 32, "General Purpose Register 14") }, + { HRDATAD (AP, R[nAP], 32, "Alias for R12") }, + { HRDATAD (FP, R[nFP], 32, "Alias for R13") }, + { HRDATAD (SP, R[nSP], 32, "Alias for R14") }, + { HRDATAD (PSL, PSL, 32, "processor status longword") }, + { HRDATAD (CC, PSL, 4, "condition codes, PSL<3:0>") }, + { HRDATAD (KSP, KSP, 32, "kernel stack pointer") }, + { HRDATAD (ESP, ESP, 32, "executive stack pointer") }, + { HRDATAD (SSP, SSP, 32, "supervisor stack pointer") }, + { HRDATAD (USP, USP, 32, "user stack pointer") }, + { HRDATAD (IS, IS, 32, "interrupt stack pointer") }, + { HRDATAD (SCBB, SCBB, 32, "system control block base") }, + { HRDATAD (PCBB, PCBB, 32, "process control block base") }, + { HRDATAD (P0BR, P0BR, 32, "P0 base register") }, + { HRDATAD (P0LR, P0LR, 22, "P0 length register") }, + { HRDATAD (P1BR, P1BR, 32, "P1 base register") }, + { HRDATAD (P1LR, P1LR, 22, "P1 length register") }, + { HRDATAD (SBR, SBR, 32, "system base register") }, + { HRDATAD (SLR, SLR, 22, "system length register") }, + { HRDATAD (SISR, SISR, 16, "software interrupt summary register") }, + { HRDATAD (ASTLVL, ASTLVL, 4, "AST level register") }, + { FLDATAD (MAPEN, mapen, 0, "memory management enable") }, + { FLDATAD (PME, pme, 0, "performance monitor enable") }, + { HRDATAD (TRPIRQ, trpirq, 8, "trap/interrupt pending") }, + { FLDATAD (CRDERR, crd_err, 0, "correctible read data error flag") }, + { FLDATAD (MEMERR, mem_err, 0, "memory error flag") }, + { FLDATA (HLTPIN, hlt_pin, 0) }, { HRDATA (IDLE_MASK, cpu_idle_mask, 16), REG_HIDDEN }, { DRDATA (IDLE_INDX, cpu_idle_type, 4), REG_HRO }, { DRDATA (IDLE_ENAB, sim_idle_enab, 4), REG_HRO }, - { BRDATA (PCQ, pcq, 16, 32, PCQ_SIZE), REG_RO+REG_CIRC }, + { BRDATAD (PCQ, pcq, 16, 32, PCQ_SIZE, "PC prior to last PC change or interrupt;"), REG_RO+REG_CIRC }, { HRDATA (PCQP, pcq_p, 6), REG_HRO }, { HRDATA (BADABO, badabo, 32), REG_HRO }, - { HRDATA (WRU, sim_int_char, 8) }, + { HRDATAD (WRU, sim_int_char, 8, "interrupt character") }, { HRDATA (MODEL, sys_model, 32), REG_HRO }, { NULL } }; diff --git a/scp.c b/scp.c index 27c19484..f002c355 100644 --- a/scp.c +++ b/scp.c @@ -1007,10 +1007,37 @@ for (i = 0; (dptr = sim_devices[i]) != NULL; i++) { fprintf (st, "h{elp} %sn ATTACH\t type help for unit %sn ATTACH command\n", dptr->name, dptr->name); } } + if (dptr->registers) { + REG *rptr; + + for (rptr = dptr->registers; rptr->name != NULL; rptr++) { + if (rptr->desc) { + fprintf (st, "h{elp} %s REGISTERS\t type help for device %s register variables\n", dptr->name, dptr->name); + break; + } + } + } } return; } +void fprint_reg_help (FILE *st, DEVICE *dptr) +{ +REG *rptr; +t_bool found = FALSE; + +for (rptr = dptr->registers; rptr->name != NULL; rptr++) { + if (rptr->desc) { + if (!found) + fprintf (st, "%s device registers:\n", dptr->name); + found = TRUE; + fprintf (st, " %-9s %s\n", rptr->name, rptr->desc); + } + } +if (!found) + fprintf (st, "No register help is available for the %s device\n", dptr->name); +} + t_stat help_cmd (int32 flag, char *cptr) { char gbuf[CBUFSIZE]; @@ -1044,6 +1071,18 @@ if (*cptr) { if (sim_log) fprintf (sim_log, "h{elp} %s ATTACH\t type help for device %s ATTACH command\n", dptr->name, dptr->name); } + if (dptr->registers) { + REG *rptr; + + for (rptr = dptr->registers; rptr->name != NULL; rptr++) { + if (rptr->desc) { + fprintf (stdout, "h{elp} %s REGISTERS\t type help for device %s register variables\n", dptr->name, dptr->name); + if (sim_log) + fprintf (sim_log, "h{elp} %s REGISTERS\t type help for device %s register variables\n", dptr->name, dptr->name); + break; + } + } + } } } } @@ -1101,53 +1140,60 @@ if (*cptr) { } else cmdp = NULL; - if ((dptr->help == NULL) && (cmdp == NULL)) { - fprintf (stdout, "No help available for the %s device\n", dptr->name); + if (0 == MATCH_CMD (gbuf, "REGISTERS")) { + fprint_reg_help (stdout, dptr); if (sim_log) - fprintf (sim_log, "No help available for the %s device\n", dptr->name); - if (dptr->attach_help || - (DEV_TYPE(dptr) == DEV_MUX) || - (DEV_TYPE(dptr) == DEV_ETHER) || - (DEV_TYPE(dptr) == DEV_DISK) || - (DEV_TYPE(dptr) == DEV_TAPE)) { - fprintf (stdout, "Some help is available if you type HELP %s ATTACH\n", dptr->name); - if (sim_log) - fprintf (sim_log, "Some help is available if you type HELP %s ATTACH\n", dptr->name); - } + fprint_reg_help (sim_log, dptr); } else { - if (cmdp != NULL) { - if (cmdp->action != &attach_cmd) { - fprintf (stdout, "No help available for the %s device %s command\n", dptr->name, cmdp->name); + if ((dptr->help == NULL) && (cmdp == NULL)) { + fprintf (stdout, "No help available for the %s device\n", dptr->name); + if (sim_log) + fprintf (sim_log, "No help available for the %s device\n", dptr->name); + if (dptr->attach_help || + (DEV_TYPE(dptr) == DEV_MUX) || + (DEV_TYPE(dptr) == DEV_ETHER) || + (DEV_TYPE(dptr) == DEV_DISK) || + (DEV_TYPE(dptr) == DEV_TAPE)) { + fprintf (stdout, "Some help is available if you type HELP %s ATTACH\n", dptr->name); if (sim_log) - fprintf (sim_log, "No help available for the %s device %s command\n", dptr->name, cmdp->name); - if (dptr->attach_help || - (DEV_TYPE(dptr) == DEV_MUX) || - (DEV_TYPE(dptr) == DEV_ETHER) || - (DEV_TYPE(dptr) == DEV_DISK) || - (DEV_TYPE(dptr) == DEV_TAPE)) { - fprintf (stdout, "Some help is available if you type HELP %s ATTACH\n", dptr->name); - if (sim_log) - fprintf (sim_log, "Some help is available if you type HELP %s ATTACH\n", dptr->name); - } - } - else { - if (dptr->attach_help) { - dptr->attach_help (stdout, dptr, uptr, 0, cptr); - if (sim_log) - dptr->attach_help (sim_log, dptr, uptr, 0, cptr); - } - else { - helps[i].attach_help (stdout, dptr, uptr, 0, cptr); - if (sim_log) - helps[i].attach_help (sim_log, dptr, uptr, 0, cptr); - } + fprintf (sim_log, "Some help is available if you type HELP %s ATTACH\n", dptr->name); } } else { - dptr->help (stdout, dptr, uptr, 0, cptr); - if (sim_log) - dptr->help (sim_log, dptr, uptr, 0, cptr); + if (cmdp != NULL) { + if (cmdp->action != &attach_cmd) { + fprintf (stdout, "No help available for the %s device %s command\n", dptr->name, cmdp->name); + if (sim_log) + fprintf (sim_log, "No help available for the %s device %s command\n", dptr->name, cmdp->name); + if (dptr->attach_help || + (DEV_TYPE(dptr) == DEV_MUX) || + (DEV_TYPE(dptr) == DEV_ETHER) || + (DEV_TYPE(dptr) == DEV_DISK) || + (DEV_TYPE(dptr) == DEV_TAPE)) { + fprintf (stdout, "Some help is available if you type HELP %s ATTACH\n", dptr->name); + if (sim_log) + fprintf (sim_log, "Some help is available if you type HELP %s ATTACH\n", dptr->name); + } + } + else { + if (dptr->attach_help) { + dptr->attach_help (stdout, dptr, uptr, 0, cptr); + if (sim_log) + dptr->attach_help (sim_log, dptr, uptr, 0, cptr); + } + else { + helps[i].attach_help (stdout, dptr, uptr, 0, cptr); + if (sim_log) + helps[i].attach_help (sim_log, dptr, uptr, 0, cptr); + } + } + } + else { + dptr->help (stdout, dptr, uptr, 0, cptr); + if (sim_log) + dptr->help (sim_log, dptr, uptr, 0, cptr); + } } } }