Added HELP device REGISTERS support and register definitions for the VAX CPU device
This commit is contained in:
parent
923d5411f5
commit
19f8fccbc1
2 changed files with 130 additions and 84 deletions
|
@ -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 }
|
||||
};
|
||||
|
|
126
scp.c
126
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue