Added HELP device REGISTERS support and register definitions for the VAX CPU device

This commit is contained in:
Mark Pizzolato 2013-01-15 10:19:52 -08:00
parent 923d5411f5
commit 19f8fccbc1
2 changed files with 130 additions and 84 deletions

View file

@ -408,55 +408,55 @@ UNIT cpu_unit = {
}; };
REG cpu_reg[] = { REG cpu_reg[] = {
{ HRDATA (PC, R[nPC], 32) }, { HRDATAD (PC, R[nPC], 32, "program counter") },
{ HRDATA (R0, R[0], 32) }, { HRDATAD (R0, R[0], 32, "General Purpose Register 0") },
{ HRDATA (R1, R[1], 32) }, { HRDATAD (R1, R[1], 32, "General Purpose Register 1") },
{ HRDATA (R2, R[2], 32) }, { HRDATAD (R2, R[2], 32, "General Purpose Register 2") },
{ HRDATA (R3, R[3], 32) }, { HRDATAD (R3, R[3], 32, "General Purpose Register 3") },
{ HRDATA (R4, R[4], 32) }, { HRDATAD (R4, R[4], 32, "General Purpose Register 4") },
{ HRDATA (R5, R[5], 32) }, { HRDATAD (R5, R[5], 32, "General Purpose Register 5") },
{ HRDATA (R6, R[6], 32) }, { HRDATAD (R6, R[6], 32, "General Purpose Register 6") },
{ HRDATA (R7, R[7], 32) }, { HRDATAD (R7, R[7], 32, "General Purpose Register 7") },
{ HRDATA (R8, R[8], 32) }, { HRDATAD (R8, R[8], 32, "General Purpose Register 8") },
{ HRDATA (R9, R[9], 32) }, { HRDATAD (R9, R[9], 32, "General Purpose Register 9") },
{ HRDATA (R10, R[10], 32) }, { HRDATAD (R10, R[10], 32, "General Purpose Register 10") },
{ HRDATA (R11, R[11], 32) }, { HRDATAD (R11, R[11], 32, "General Purpose Register 11") },
{ HRDATA (R12, R[12], 32) }, { HRDATAD (R12, R[12], 32, "General Purpose Register 12") },
{ HRDATA (R13, R[13], 32) }, { HRDATAD (R13, R[13], 32, "General Purpose Register 13") },
{ HRDATA (R14, R[14], 32) }, { HRDATAD (R14, R[14], 32, "General Purpose Register 14") },
{ HRDATA (AP, R[nAP], 32) }, { HRDATAD (AP, R[nAP], 32, "Alias for R12") },
{ HRDATA (FP, R[nFP], 32) }, { HRDATAD (FP, R[nFP], 32, "Alias for R13") },
{ HRDATA (SP, R[nSP], 32) }, { HRDATAD (SP, R[nSP], 32, "Alias for R14") },
{ HRDATA (PSL, PSL, 32) }, { HRDATAD (PSL, PSL, 32, "processor status longword") },
{ HRDATA (CC, PSL, 4) }, { HRDATAD (CC, PSL, 4, "condition codes, PSL<3:0>") },
{ HRDATA (KSP, KSP, 32) }, { HRDATAD (KSP, KSP, 32, "kernel stack pointer") },
{ HRDATA (ESP, ESP, 32) }, { HRDATAD (ESP, ESP, 32, "executive stack pointer") },
{ HRDATA (SSP, SSP, 32) }, { HRDATAD (SSP, SSP, 32, "supervisor stack pointer") },
{ HRDATA (USP, USP, 32) }, { HRDATAD (USP, USP, 32, "user stack pointer") },
{ HRDATA (IS, IS, 32) }, { HRDATAD (IS, IS, 32, "interrupt stack pointer") },
{ HRDATA (SCBB, SCBB, 32) }, { HRDATAD (SCBB, SCBB, 32, "system control block base") },
{ HRDATA (PCBB, PCBB, 32) }, { HRDATAD (PCBB, PCBB, 32, "process control block base") },
{ HRDATA (P0BR, P0BR, 32) }, { HRDATAD (P0BR, P0BR, 32, "P0 base register") },
{ HRDATA (P0LR, P0LR, 22) }, { HRDATAD (P0LR, P0LR, 22, "P0 length register") },
{ HRDATA (P1BR, P1BR, 32) }, { HRDATAD (P1BR, P1BR, 32, "P1 base register") },
{ HRDATA (P1LR, P1LR, 22) }, { HRDATAD (P1LR, P1LR, 22, "P1 length register") },
{ HRDATA (SBR, SBR, 32) }, { HRDATAD (SBR, SBR, 32, "system base register") },
{ HRDATA (SLR, SLR, 22) }, { HRDATAD (SLR, SLR, 22, "system length register") },
{ HRDATA (SISR, SISR, 16) }, { HRDATAD (SISR, SISR, 16, "software interrupt summary register") },
{ HRDATA (ASTLVL, ASTLVL, 4) }, { HRDATAD (ASTLVL, ASTLVL, 4, "AST level register") },
{ FLDATA (MAPEN, mapen, 0) }, { FLDATAD (MAPEN, mapen, 0, "memory management enable") },
{ FLDATA (PME, pme, 0) }, { FLDATAD (PME, pme, 0, "performance monitor enable") },
{ HRDATA (TRPIRQ, trpirq, 8) }, { HRDATAD (TRPIRQ, trpirq, 8, "trap/interrupt pending") },
{ FLDATA (CRDERR, crd_err, 0) }, { FLDATAD (CRDERR, crd_err, 0, "correctible read data error flag") },
{ FLDATA (MEMERR, mem_err, 0) }, { FLDATAD (MEMERR, mem_err, 0, "memory error flag") },
{ FLDATA (HLTPIN, hlt_pin, 0) }, { FLDATA (HLTPIN, hlt_pin, 0) },
{ HRDATA (IDLE_MASK, cpu_idle_mask, 16), REG_HIDDEN }, { HRDATA (IDLE_MASK, cpu_idle_mask, 16), REG_HIDDEN },
{ DRDATA (IDLE_INDX, cpu_idle_type, 4), REG_HRO }, { DRDATA (IDLE_INDX, cpu_idle_type, 4), REG_HRO },
{ DRDATA (IDLE_ENAB, sim_idle_enab, 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 (PCQP, pcq_p, 6), REG_HRO },
{ HRDATA (BADABO, badabo, 32), 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 }, { HRDATA (MODEL, sys_model, 32), REG_HRO },
{ NULL } { NULL }
}; };

126
scp.c
View file

@ -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); 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; 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) t_stat help_cmd (int32 flag, char *cptr)
{ {
char gbuf[CBUFSIZE]; char gbuf[CBUFSIZE];
@ -1044,6 +1071,18 @@ if (*cptr) {
if (sim_log) if (sim_log)
fprintf (sim_log, "h{elp} %s ATTACH\t type help for device %s ATTACH command\n", dptr->name, dptr->name); 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 else
cmdp = NULL; cmdp = NULL;
if ((dptr->help == NULL) && (cmdp == NULL)) { if (0 == MATCH_CMD (gbuf, "REGISTERS")) {
fprintf (stdout, "No help available for the %s device\n", dptr->name); fprint_reg_help (stdout, dptr);
if (sim_log) if (sim_log)
fprintf (sim_log, "No help available for the %s device\n", dptr->name); fprint_reg_help (sim_log, dptr);
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 { else {
if (cmdp != NULL) { if ((dptr->help == NULL) && (cmdp == NULL)) {
if (cmdp->action != &attach_cmd) { fprintf (stdout, "No help available for the %s device\n", dptr->name);
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\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) if (sim_log)
fprintf (sim_log, "No help available for the %s device %s command\n", dptr->name, cmdp->name); fprintf (sim_log, "Some help is available if you type HELP %s ATTACH\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);
}
}
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 { else {
dptr->help (stdout, dptr, uptr, 0, cptr); if (cmdp != NULL) {
if (sim_log) if (cmdp->action != &attach_cmd) {
dptr->help (sim_log, dptr, uptr, 0, cptr); 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);
}
} }
} }
} }