diff --git a/PDP11/pdp11_dz.c b/PDP11/pdp11_dz.c index f631b884..07c719d7 100644 --- a/PDP11/pdp11_dz.c +++ b/PDP11/pdp11_dz.c @@ -114,6 +114,21 @@ extern int32 int_req[IPL_HLVL]; #define CSR_GETTL(x) (((x) >> CSR_V_TLINE) & DZ_LNOMASK) #define CSR_PUTTL(x,y) x = ((x) & ~CSR_TLINE) | (((y) & DZ_LNOMASK) << CSR_V_TLINE) +BITFIELD dz_csr_bits[] = { + BITNCF(3), /* not used */ + BIT(MAINT), /* Maint */ + BIT(MSE), /* naster scan enable */ + BIT(RIE), /* receive interrupt enable */ + BIT(RDONE), /* receive done */ + BITF(TLINE,3), /* transmit line */ + BITNCF(1), /* not used */ + BIT(SAE), /* silo alarm enable */ + BIT(SA), /* silo alarm */ + BIT(TIE), /* transmit interrupt enable */ + BIT(TRDY), /* transmit ready */ + ENDBITS +}; + /* DZRBUF - 160102 - receive buffer, read only */ #define RBUF_CHAR 0000377 /* rcv char */ @@ -124,6 +139,17 @@ extern int32 int_req[IPL_HLVL]; #define RBUF_VALID 0100000 /* rcv valid */ #define RBUF_MBZ 0004000 +BITFIELD dz_rbuf_bits[] = { + BITFFMT(RBUF,8,"%02X"), /* Received Character */ + BITF(RLINE,3), /* receive line */ + BITNCF(1), /* not used */ + BIT(PARE), /* parity error */ + BIT(FRME), /* frame error */ + BIT(OVRE), /* overrun error */ + BIT(VALID), /* receive valid */ + ENDBITS +}; + char *dz_charsizes[] = {"5", "6", "7", "8"}; char *dz_baudrates[] = {"50", "75", "110", "134.5", "150", "300", "600", "1200", "1800", "2000", "2400", "3600", "4800", "7200", "9600", "19200"}; @@ -148,21 +174,51 @@ char *dz_stopbits[] = {"1", "2", "1", "1.5"}; #define LPR_RCVE 0010000 /* receive enb */ #define LPR_GETLN(x) (((x) >> LPR_V_LINE) & DZ_LNOMASK) +BITFIELD dz_lpr_bits[] = { + BITF(LINE,3), /* line */ + BITFNAM(CHARSIZE,2,dz_charsizes), /* character size */ + BIT(STOPBITS), /* stop bits code */ + BIT(PARENB), /* parity error */ + BIT(PARODD), /* frame error */ + BITFNAM(SPEED,4,dz_baudrates), /* speed code */ + BITNCF(1), /* not used */ + BIT(RCVE), /* receive enable */ + ENDBITS +}; + /* DZTCR - 160104 - transmission control register */ #define TCR_V_XMTE 0 /* xmit enables */ #define TCR_V_DTR 8 /* DTRs */ +BITFIELD dz_tcr_bits[] = { + BITFFMT(XMTE,8,%02X), /* Transmit enable */ + BITFFMT(DTR, 8,%02X), /* Data Terminal Ready */ + ENDBITS +}; + /* DZMSR - 160106 - modem status register, read only */ #define MSR_V_RI 0 /* ring indicators */ #define MSR_V_CD 8 /* carrier detect */ +BITFIELD dz_msr_bits[] = { + BITFFMT(RI,8,%02X), /* ring indicators */ + BITFFMT(CD,8,%02X), /* carrier detects */ + ENDBITS +}; + /* DZTDR - 160106 - transmit data, write only */ #define TDR_CHAR 0000377 /* xmit char */ #define TDR_V_TBR 8 /* xmit break - NI */ +BITFIELD dz_tdr_bits[] = { + BITFFMT(CHAR,8,%02X), /* ring indicators */ + BITFFMT(TBR, 8,%02X), /* carrier detects */ + ENDBITS +}; + extern int32 IREQ (HLVL); extern int32 tmxr_poll; /* calibrated delay */ @@ -239,19 +295,19 @@ DIB dz_dib = { UNIT dz_unit = { UDATA (&dz_svc, UNIT_IDLE|UNIT_ATTABLE|DZ_8B_DFLT, 0) }; REG dz_reg[] = { - { BRDATAD (CSR, dz_csr, DEV_RDX, 16, MAX_DZ_MUXES, "control/status register") }, - { BRDATAD (RBUF, dz_rbuf, DEV_RDX, 16, MAX_DZ_MUXES, "receive buffer") }, - { BRDATAD (LPR, dz_lpr, DEV_RDX, 16, MAX_DZ_MUXES, "line parameter register") }, - { BRDATAD (TCR, dz_tcr, DEV_RDX, 16, MAX_DZ_MUXES, "transmission control register") }, - { BRDATAD (MSR, dz_msr, DEV_RDX, 16, MAX_DZ_MUXES, "modem status register") }, - { BRDATAD (TDR, dz_tdr, DEV_RDX, 16, MAX_DZ_MUXES, "transmit data register") }, - { BRDATAD (SAENB, dz_sae, DEV_RDX, 1, MAX_DZ_MUXES, "silo alarm enabled") }, - { GRDATAD (RXINT, dz_rxi, DEV_RDX, MAX_DZ_MUXES, 0, "receive interrupts") }, - { GRDATAD (TXINT, dz_txi, DEV_RDX, MAX_DZ_MUXES, 0, "transmit interrupts") }, - { FLDATAD (MDMCTL, dz_mctl, 0, "modem control enabled") }, - { FLDATAD (AUTODS, dz_auto, 0, "autodisconnect enabled") }, - { GRDATA (DEVADDR, dz_dib.ba, DEV_RDX, 32, 0), REG_HRO }, - { GRDATA (DEVVEC, dz_dib.vec, DEV_RDX, 16, 0), REG_HRO }, + { BRDATADF (CSR, dz_csr, DEV_RDX, 16, MAX_DZ_MUXES, "control/status register", dz_csr_bits) }, + { BRDATADF (RBUF, dz_rbuf, DEV_RDX, 16, MAX_DZ_MUXES, "receive buffer", dz_rbuf_bits) }, + { BRDATADF (LPR, dz_lpr, DEV_RDX, 16, MAX_DZ_MUXES, "line parameter register", dz_lpr_bits) }, + { BRDATADF (TCR, dz_tcr, DEV_RDX, 16, MAX_DZ_MUXES, "transmission control register", dz_tcr_bits) }, + { BRDATADF (MSR, dz_msr, DEV_RDX, 16, MAX_DZ_MUXES, "modem status register", dz_msr_bits) }, + { BRDATADF (TDR, dz_tdr, DEV_RDX, 16, MAX_DZ_MUXES, "transmit data register", dz_tdr_bits) }, + { BRDATAD (SAENB, dz_sae, DEV_RDX, 1, MAX_DZ_MUXES, "silo alarm enabled") }, + { GRDATAD (RXINT, dz_rxi, DEV_RDX, MAX_DZ_MUXES, 0, "receive interrupts") }, + { GRDATAD (TXINT, dz_txi, DEV_RDX, MAX_DZ_MUXES, 0, "transmit interrupts") }, + { FLDATAD (MDMCTL, dz_mctl, 0, "modem control enabled") }, + { FLDATAD (AUTODS, dz_auto, 0, "autodisconnect enabled") }, + { GRDATA (DEVADDR, dz_dib.ba, DEV_RDX, 32, 0), REG_HRO }, + { GRDATA (DEVVEC, dz_dib.vec, DEV_RDX, 16, 0), REG_HRO }, { NULL } }; @@ -337,7 +393,7 @@ switch ((PA >> 1) & 03) { /* case on PA<2:1> */ break; case 03: /* MSR */ - for (i=0; iradix); if ((rptr->flags & REG_VMAD) && sim_vm_fprint_addr) sim_vm_fprint_addr (ofile, sim_dflt_dev, (t_addr) val); else if (!(rptr->flags & REG_VMIO) || - (fprint_sym (ofile, rdx, &val, NULL, sim_switches | SIM_SW_REG) > 0)) + (fprint_sym (ofile, rdx, &val, NULL, sim_switches | SIM_SW_REG) > 0)) { fprint_val (ofile, val, rdx, rptr->width, rptr->flags & REG_FMT); + if (rptr->fields) { + fprintf (ofile, "\t"); + fprint_fields (ofile, val, val, rptr->fields); + } + } if (flag & EX_I) fprintf (ofile, "\t"); else fprintf (ofile, "\n"); @@ -6272,6 +6280,47 @@ if (!debug_unterm) { } } +void fprint_fields (FILE *stream, t_value before, t_value after, BITFIELD* bitdefs) +{ +int32 i, fields, offset; +uint32 value, beforevalue, mask; + +for (fields=offset=0; bitdefs[fields].name; ++fields) { + if (bitdefs[fields].offset == 0xffffffff) /* fixup uninitialized offsets */ + bitdefs[fields].offset = offset; + offset += bitdefs[fields].width; + } +for (i = fields-1; i >= 0; i--) { /* print xlation, transition */ + if (bitdefs[i].name[0] == '\0') + continue; + if ((bitdefs[i].width == 1) && (bitdefs[i].valuenames == NULL)) { + int off = ((after >> bitdefs[i].offset) & 1) + (((before ^ after) >> bitdefs[i].offset) & 1) * 2; + fprintf(stream, "%s%c ", bitdefs[i].name, debug_bstates[off]); + } + else { + char *delta = ""; + + mask = 0xFFFFFFFF >> (32-bitdefs[i].width); + value = (uint32)((after >> bitdefs[i].offset) & mask); + beforevalue = (uint32)((before >> bitdefs[i].offset) & mask); + if (value < beforevalue) + delta = "_"; + if (value > beforevalue) + delta = "^"; + if (bitdefs[i].valuenames) + fprintf(stream, "%s=%s%s ", bitdefs[i].name, delta, bitdefs[i].valuenames[value]); + else + if (bitdefs[i].format) { + fprintf(stream, "%s=%s", bitdefs[i].name, delta); + fprintf(stream, bitdefs[i].format, value); + fprintf(stream, " "); + } + else + fprintf(stream, "%s=%s0x%X ", bitdefs[i].name, delta, value); + } + } +} + /* Prints state of a register: bit translation + state (0,1,_,^) indicating the state and transition of the bit and bitfields. States: 0=steady(0->0), 1=steady(1->1), _=falling(1->0), ^=rising(0->1) */ @@ -6280,43 +6329,8 @@ void sim_debug_bits(uint32 dbits, DEVICE* dptr, BITFIELD* bitdefs, uint32 before, uint32 after, int terminate) { if (sim_deb && (dptr->dctrl & dbits)) { - int32 i, fields, offset; - uint32 value, beforevalue, mask; - - for (fields=offset=0; bitdefs[fields].name; ++fields) { - if (bitdefs[fields].offset == 0xffffffff) /* fixup uninitialized offsets */ - bitdefs[fields].offset = offset; - offset += bitdefs[fields].width; - } sim_debug_prefix(dbits, dptr); /* print prefix if required */ - for (i = fields-1; i >= 0; i--) { /* print xlation, transition */ - if (bitdefs[i].name[0] == '\0') - continue; - if ((bitdefs[i].width == 1) && (bitdefs[i].valuenames == NULL)) { - int off = ((after >> bitdefs[i].offset) & 1) + (((before ^ after) >> bitdefs[i].offset) & 1) * 2; - fprintf(sim_deb, "%s%c ", bitdefs[i].name, debug_bstates[off]); - } - else { - char *delta = ""; - - mask = 0xFFFFFFFF >> (32-bitdefs[i].width); - value = ((after >> bitdefs[i].offset) & mask); - beforevalue = ((before >> bitdefs[i].offset) & mask); - if (value < beforevalue) - delta = "_"; - if (value > beforevalue) - delta = "^"; - if (bitdefs[i].valuenames) - fprintf(sim_deb, "%s=%s%s ", bitdefs[i].name, delta, bitdefs[i].valuenames[value]); - else - if (bitdefs[i].format) { - fprintf(sim_deb, "%s=%s", bitdefs[i].name, delta); - fprintf(sim_deb, bitdefs[i].format, value); - } - else - fprintf(sim_deb, "%s=%s0x%X ", bitdefs[i].name, delta, value); - } - } + fprint_fields (sim_deb, (t_value)before, (t_value)after, bitdefs); /* print xlation, transition */ if (terminate) fprintf(sim_deb, "\r\n"); debug_unterm = terminate ? 0 : 1; /* set unterm for next */ diff --git a/sim_defs.h b/sim_defs.h index 269adfbd..d970d9af 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -447,6 +447,14 @@ struct sim_unit { #define UNIT_TM_POLL 0000002 /* TMXR Polling unit */ #define UNIT_NO_FIO 0000004 /* fileref is NOT a FILE * */ +struct sim_bitfield { + char *name; /* field name */ + uint32 offset; /* starting bit */ + uint32 width; /* width */ + const char **valuenames; /* map of values to strings */ + const char *format; /* value format string */ + }; + /* Register data structure */ struct sim_reg { @@ -457,6 +465,7 @@ struct sim_reg { uint32 offset; /* starting bit */ uint32 depth; /* save depth */ char *desc; /* description */ + struct sim_bitfield *fields; /* bit fields */ uint32 flags; /* flags */ uint32 qptr; /* circ q ptr */ }; @@ -558,14 +567,6 @@ struct sim_debtab { #define SIM_DBG_ACTIVATE 0x20000 #define SIM_DBG_AIO_QUEUE 0x40000 -struct sim_bitfield { - char *name; /* field name */ - uint32 offset; /* starting bit */ - uint32 width; /* width */ - const char **valuenames; /* map of values to strings */ - const char *format; /* value format string */ - }; - /* File Reference */ struct sim_fileref { char name[CBUFSIZE]; /* file name */ @@ -578,22 +579,30 @@ struct sim_fileref { #define UDATA(act,fl,cap) NULL,act,NULL,NULL,NULL,0,0,(fl),0,(cap),0,NULL,0,0 #if defined (__STDC__) || defined (_WIN32) -#define ORDATA(nm,loc,wd) #nm, &(loc), 8, (wd), 0, 1, NULL -#define DRDATA(nm,loc,wd) #nm, &(loc), 10, (wd), 0, 1, NULL -#define HRDATA(nm,loc,wd) #nm, &(loc), 16, (wd), 0, 1, NULL -#define FLDATA(nm,loc,pos) #nm, &(loc), 2, 1, (pos), 1, NULL -#define GRDATA(nm,loc,rdx,wd,pos) #nm, &(loc), (rdx), (wd), (pos), 1, NULL -#define BRDATA(nm,loc,rdx,wd,dep) #nm, (loc), (rdx), (wd), 0, (dep), NULL +#define ORDATA(nm,loc,wd) #nm, &(loc), 8, (wd), 0, 1, NULL, NULL +#define DRDATA(nm,loc,wd) #nm, &(loc), 10, (wd), 0, 1, NULL, NULL +#define HRDATA(nm,loc,wd) #nm, &(loc), 16, (wd), 0, 1, NULL, NULL +#define FLDATA(nm,loc,pos) #nm, &(loc), 2, 1, (pos), 1, NULL, NULL +#define GRDATA(nm,loc,rdx,wd,pos) #nm, &(loc), (rdx), (wd), (pos), 1, NULL, NULL +#define BRDATA(nm,loc,rdx,wd,dep) #nm, (loc), (rdx), (wd), 0, (dep), NULL, NULL #define URDATA(nm,loc,rdx,wd,off,dep,fl) \ - #nm, &(loc), (rdx), (wd), (off), (dep), NULL, ((fl) | REG_UNIT) -#define ORDATAD(nm,loc,wd,desc) #nm, &(loc), 8, (wd), 0, 1, (desc) -#define DRDATAD(nm,loc,wd,desc) #nm, &(loc), 10, (wd), 0, 1, (desc) -#define HRDATAD(nm,loc,wd,desc) #nm, &(loc), 16, (wd), 0, 1, (desc) -#define FLDATAD(nm,loc,pos,desc) #nm, &(loc), 2, 1, (pos), 1, (desc) -#define GRDATAD(nm,loc,rdx,wd,pos,desc) #nm, &(loc), (rdx), (wd), (pos), 1, (desc) -#define BRDATAD(nm,loc,rdx,wd,dep,desc) #nm, (loc), (rdx), (wd), 0, (dep), (desc) + #nm, &(loc), (rdx), (wd), (off), (dep), NULL, NULL, ((fl) | REG_UNIT) +#define ORDATAD(nm,loc,wd,desc) #nm, &(loc), 8, (wd), 0, 1, (desc), NULL +#define DRDATAD(nm,loc,wd,desc) #nm, &(loc), 10, (wd), 0, 1, (desc), NULL +#define HRDATAD(nm,loc,wd,desc) #nm, &(loc), 16, (wd), 0, 1, (desc), NULL +#define FLDATAD(nm,loc,pos,desc) #nm, &(loc), 2, 1, (pos), 1, (desc), NULL +#define GRDATAD(nm,loc,rdx,wd,pos,desc) #nm, &(loc), (rdx), (wd), (pos), 1, (desc), NULL +#define BRDATAD(nm,loc,rdx,wd,dep,desc) #nm, (loc), (rdx), (wd), 0, (dep), (desc), NULL #define URDATAD(nm,loc,rdx,wd,off,dep,fl,desc) \ - #nm, &(loc), (rdx), (wd), (off), (dep), (desc), ((fl) | REG_UNIT) + #nm, &(loc), (rdx), (wd), (off), (dep), (desc), NULL, ((fl) | REG_UNIT) +#define ORDATADF(nm,loc,wd,desc,flds) #nm, &(loc), 8, (wd), 0, 1, (desc), (flds) +#define DRDATADF(nm,loc,wd,desc,flds) #nm, &(loc), 10, (wd), 0, 1, (desc), (flds) +#define HRDATADF(nm,loc,wd,desc,flds) #nm, &(loc), 16, (wd), 0, 1, (desc), (flds) +#define FLDATADF(nm,loc,pos,desc,flds) #nm, &(loc), 2, 1, (pos), 1, (desc), (flds) +#define GRDATADF(nm,loc,rdx,wd,pos,desc,flds) #nm, &(loc), (rdx), (wd), (pos), 1, (desc), (flds) +#define BRDATADF(nm,loc,rdx,wd,dep,desc,flds) #nm, (loc), (rdx), (wd), 0, (dep), (desc), (flds) +#define URDATADF(nm,loc,rdx,wd,off,dep,fl,desc,flds) \ + #nm, &(loc), (rdx), (wd), (off), (dep), (desc), (flds), ((fl) | REG_UNIT) #define BIT(nm) {#nm, 0xffffffff, 1} /* Single Bit definition */ #define BITNC {"", 0xffffffff, 1} /* Don't care Bit definition */ #define BITF(nm,sz) {#nm, 0xffffffff, sz} /* Bit Field definition */ @@ -601,22 +610,30 @@ struct sim_fileref { #define BITFFMT(nm,sz,fmt) {#nm, 0xffffffff, sz, NULL, #fmt}/* Bit Field definition with Output format */ #define BITFNAM(nm,sz,names) {#nm, 0xffffffff, sz, names} /* Bit Field definition with value->name map */ #else -#define ORDATA(nm,loc,wd) "nm", &(loc), 8, (wd), 0, 1, NULL -#define DRDATA(nm,loc,wd) "nm", &(loc), 10, (wd), 0, 1, NULL -#define HRDATA(nm,loc,wd) "nm", &(loc), 16, (wd), 0, 1, NULL -#define FLDATA(nm,loc,pos) "nm", &(loc), 2, 1, (pos), 1, NULL -#define GRDATA(nm,loc,rdx,wd,pos) "nm", &(loc), (rdx), (wd), (pos), 1, NULL -#define BRDATA(nm,loc,rdx,wd,dep) "nm", (loc), (rdx), (wd), 0, (dep), NULL +#define ORDATA(nm,loc,wd) "nm", &(loc), 8, (wd), 0, 1, NULL, NULL +#define DRDATA(nm,loc,wd) "nm", &(loc), 10, (wd), 0, 1, NULL, NULL +#define HRDATA(nm,loc,wd) "nm", &(loc), 16, (wd), 0, 1, NULL, NULL +#define FLDATA(nm,loc,pos) "nm", &(loc), 2, 1, (pos), 1, NULL, NULL +#define GRDATA(nm,loc,rdx,wd,pos) "nm", &(loc), (rdx), (wd), (pos), 1, NULL, NULL +#define BRDATA(nm,loc,rdx,wd,dep) "nm", (loc), (rdx), (wd), 0, (dep), NULL, NULL #define URDATA(nm,loc,rdx,wd,off,dep,fl) \ - "nm", &(loc), (rdx), (wd), (off), (dep), NULL, ((fl) | REG_UNIT) -#define ORDATAD(nm,loc,wd,desc) "nm", &(loc), 8, (wd), 0, 1, (desc) -#define DRDATAD(nm,loc,wd,desc) "nm", &(loc), 10, (wd), 0, 1, (desc) -#define HRDATAD(nm,loc,wd,desc) "nm", &(loc), 16, (wd), 0, 1, (desc) -#define FLDATAD(nm,loc,pos,desc) "nm", &(loc), 2, 1, (pos), 1, (desc) -#define GRDATAD(nm,loc,rdx,wd,pos,desc) "nm", &(loc), (rdx), (wd), (pos), 1, (desc) -#define BRDATAD(nm,loc,rdx,wd,dep,desc) "nm", (loc), (rdx), (wd), 0, (dep), (desc) + "nm", &(loc), (rdx), (wd), (off), (dep), NULL, NULL, ((fl) | REG_UNIT) +#define ORDATAD(nm,loc,wd,desc) "nm", &(loc), 8, (wd), 0, 1, (desc), NULL +#define DRDATAD(nm,loc,wd,desc) "nm", &(loc), 10, (wd), 0, 1, (desc), NULL +#define HRDATAD(nm,loc,wd,desc) "nm", &(loc), 16, (wd), 0, 1, (desc), NULL +#define FLDATAD(nm,loc,pos,desc) "nm", &(loc), 2, 1, (pos), 1, (desc), NULL +#define GRDATAD(nm,loc,rdx,wd,pos,desc) "nm", &(loc), (rdx), (wd), (pos), 1, (desc), NULL +#define BRDATAD(nm,loc,rdx,wd,dep,desc) "nm", (loc), (rdx), (wd), 0, (dep), (desc), NULL #define URDATAD(nm,loc,rdx,wd,off,dep,fl,desc) \ - "nm", &(loc), (rdx), (wd), (off), (dep), (desc), ((fl) | REG_UNIT) + "nm", &(loc), (rdx), (wd), (off), (dep), (desc), NULL, ((fl) | REG_UNIT) +#define ORDATADF(nm,loc,wd,desc,flds) "nm", &(loc), 8, (wd), 0, 1, (desc), (flds) +#define DRDATADF(nm,loc,wd,desc,flds) "nm", &(loc), 10, (wd), 0, 1, (desc), (flds) +#define HRDATADF(nm,loc,wd,desc,flds) "nm", &(loc), 16, (wd), 0, 1, (desc), (flds) +#define FLDATADF(nm,loc,pos,desc,flds) "nm", &(loc), 2, 1, (pos), 1, (desc), (flds) +#define GRDATADF(nm,loc,rdx,wd,pos,desc,flds) "nm", &(loc), (rdx), (wd), (pos), 1, (desc), (flds) +#define BRDATADF(nm,loc,rdx,wd,dep,desc,flds) "nm", (loc), (rdx), (wd), 0, (dep), (desc), (flds) +#define URDATADF(nm,loc,rdx,wd,off,dep,fl,desc,flds) \ + "nm", &(loc), (rdx), (wd), (off), (dep), (desc), (flds), ((fl) | REG_UNIT) #define BIT(nm) {"nm", 0xffffffff, 1} /* Single Bit definition */ #define BITNC {"", 0xffffffff, 1} /* Don't care Bit definition */ #define BITF(nm,sz) {"nm", 0xffffffff, sz} /* Bit Field definition */