1
0
mirror of https://github.com/prirun/p50em.git synced 2026-03-09 20:01:45 +00:00

fixed multiple extension segments (stex, pcl, prtn), perf tweaks

-- this was causing the LISTENER_ORDER$ signals after DIAG
-- also was causing HELP to fail sporadically (HELP MTRESUME)
removed TB_xxx flags (identical to T_xxx)
added some eap hints
changed to pop the concealed stack earlier
changed LDLR/LDAR to load result from RP if ea is 7
changed STLR/STAR to store result in RP if ea is 7
added new trace flags for GET/PUT (unimplemented)
This commit is contained in:
Jim
2007-10-16 00:00:00 -04:00
parent dffe43212e
commit 3bb5eefc61
2 changed files with 160 additions and 118 deletions

258
em.c
View File

@@ -265,37 +265,23 @@ static void macheck (unsigned short p300vec, unsigned short chkvec, unsigned int
T_PX Process exchange
*/
#define TB_EAR 0x00000001
#define TB_EAV 0x00000002
#define TB_EAI 0x00000004
#define TB_INST 0x00000008
#define TB_FLOW 0x00000010
#define TB_MODE 0x00000020
#define TB_EAAP 0x00000040
#define TB_DIO 0x00000080
#define TB_MAP 0x00000100
#define TB_PCL 0x00000200
#define TB_FAULT 0x00000400
#define TB_PX 0x00000800
#define TB_TIO 0x00001000
#define TB_TERM 0x00002000
#define TB_RIO 0x00004000
#define T_EAR TB_EAR
#define T_EAV TB_EAV
#define T_EAI TB_EAI
#define T_INST TB_INST
#define T_FLOW TB_FLOW
#define T_MODE TB_MODE
#define T_EAAP TB_EAAP
#define T_DIO TB_DIO
#define T_MAP TB_MAP
#define T_PCL TB_PCL
#define T_FAULT TB_FAULT
#define T_PX TB_PX
#define T_TIO TB_TIO
#define T_TERM TB_TERM
#define T_RIO TB_RIO
#define T_EAR 0x00000001
#define T_EAV 0x00000002
#define T_EAI 0x00000004
#define T_INST 0x00000008
#define T_FLOW 0x00000010
#define T_MODE 0x00000020
#define T_EAAP 0x00000040
#define T_DIO 0x00000080
#define T_MAP 0x00000100
#define T_PCL 0x00000200
#define T_FAULT 0x00000400
#define T_PX 0x00000800
#define T_TIO 0x00001000
#define T_TERM 0x00002000
#define T_RIO 0x00004000
#define T_GET 0x00002000
#define T_PUT 0x00001000
#define BITMASK16(b) (0x8000 >> ((b)-1))
#define BITMASK32(b) ((unsigned int)(0x80000000) >> ((b)-1))
@@ -1077,13 +1063,6 @@ static inline unsigned short get16(ea_t ea) {
}
#endif
#if 0
/* idle loop runs faster if this is enabled, but executable is 27K
bigger and programs (ADD) run slower. Maybe inline expansions of
get16 & fastmap are too big for cache (?) */
return MEM[fastmap(ea, RP, RACC)];
#endif
#ifdef FAST
#ifndef NOTRACE
gvp->supercalls++;
@@ -2380,29 +2359,46 @@ static unsigned short dumppcb(unsigned short pcb) {
}
/* stack extension, called with size of extension in 16-bit words,
returns a pointer to the extension */
the stackroot segment.
static ea_t stex(unsigned int extsize) {
short stackrootseg;
ea_t stackrootp, stackfp;
According to the ISG, STEX can create a multi-segment extension,
but the emulator doesn't support this and will fault.
if (extsize & 1) extsize++;
NOTE: see related code in PCL and PRTN.
*/
static ea_t stex(unsigned int framesize) {
short stackrootseg, stackseg;
unsigned long utempl;
ea_t stackfp, fpva;
if (framesize > 0xFFFF)
fault(RESTRICTFAULT, 0, 0);
framesize = (framesize + 1) & 0xFFFE; /* round up to even */
eap = &gvp->brp[SBBR];
stackrootseg = get16((*(unsigned int *)(crs+SB))+1);
stackrootp = MAKEVA(stackrootseg,0);
stackfp = get32(stackrootp);
stackseg = stackrootseg;
stackfp = get32(MAKEVA(stackseg,0));
/* find a stack segment where this extension will fit */
/* see if there is room for this frame */
while (stackfp != 0 && (stackfp & 0xFFFF) + extsize > 0xFFFF) {
stackfp = get32(MAKEVA(stackfp>>16, 2));
TRACE(T_FLOW, " no room for frame, extension pointer is %o/%o\n", stackfp>>16, stackfp&0xFFFF);
if ((stackfp & 0xFFFF) + framesize > 0xFFFF) {
/* no, follow the extension pointer in the last stack segment to
the next stack segment */
stackseg = SEGNO32(stackfp);
fpva = MAKEVA(stackseg, 2);
stackfp = get32(fpva);
TRACE(T_PCL, " no room for frame, extension pointer at %o/%o is %o/%o\n", fpva>>16, fpva&0xffff, stackfp>>16, stackfp&0xFFFF);
if (stackfp == 0 || (stackfp & 0xFFFF) + framesize > 0xFFFF)
fault(STACKFAULT, 0, MAKEVA(stackseg,0) | (RP & RINGMASK32));
}
if (stackfp == 0)
fault(STACKFAULT, 0, MAKEVA(stackrootseg,0) | (RP & RINGMASK32));
/* update the stack free pointer */
put32((stackfp+extsize) & ~RINGMASK32, stackrootp);
put32((stackfp+framesize) & ~RINGMASK32, MAKEVA(stackrootseg, 0));
TRACE(T_FLOW, " stack extension is at %o/%o\n", stackfp>>16, stackfp&0xffff);
return stackfp;
}
@@ -2414,23 +2410,29 @@ static ea_t stex(unsigned int extsize) {
If changing rings, make sure to invalidate the brp cache. */
static inline void prtn() {
unsigned short stackrootseg;
unsigned short stackroot;
ea_t newrp,newsb,newlb;
ea_t fpva;
unsigned short fpseg;
unsigned short keys;
int maxloop;
stackrootseg = get16(*(unsigned int *)(crs+SB)+1);
eap = &gvp->brp[SBBR];
stackroot = get16(*(unsigned int *)(crs+SB)+1);
newrp = get32(*(unsigned int *)(crs+SB)+2);
newsb = get32(*(unsigned int *)(crs+SB)+4);
newlb = get32(*(unsigned int *)(crs+SB)+6);
keys = get16(*(unsigned int *)(crs+SB)+8);
put32(*(unsigned int *)(crs+SB), MAKEVA(stackrootseg,0));
/* update the stack free pointer */
put32(*(unsigned int *)(crs+SB), MAKEVA(stackroot, 0));
if ((newrp ^ RP) & RINGMASK32)
invalidate_brp();
RP = newrp | (RP & RINGMASK32);
*(unsigned int *)(crs+SB) = newsb;
*(unsigned int *)(crs+LB) = newlb;
newkeys(keys & 0177770);
invalidate_brp();
//TRACE(T_FLOW, " Finished PRTN, RP=%o/%o\n", RPH, RPL);
}
@@ -2484,6 +2486,7 @@ static inline ea_t pclea(unsigned short brsave[6], ea_t rp, unsigned short *bita
if (ea & 0x80000000)
fault(POINTERFAULT, ea>>16, 0); /* XXX: faddr=0? */
iwea = ea;
eap = &gvp->brp[br];
ea = get32(iwea);
TRACE(T_PCL, " Indirect pointer is %o/%o\n", ea>>16, ea & 0xFFFF);
#if 1
@@ -2544,6 +2547,7 @@ static argt() {
/* stackfp is the new stack frame, rp is in the middle of
argument templates and is advanced after each transfer */
eap = &gvp->brp[SBBR];
stackfp = *(unsigned int *)(crs+SB);
rp = get32(stackfp+2);
@@ -2634,19 +2638,21 @@ static argt() {
static pcl (ea_t ecbea) {
short i,j;
unsigned long utempl;
unsigned short access;
unsigned short ecb[9];
short bit; /* bit offset for args */
ea_t newrp; /* start of new proc */
ea_t ea;
ea_t rp; /* return pointer */
short stackrootseg;
unsigned short stacksize;
short stackrootseg, stackseg;
unsigned short framesize;
short store; /* true if store bit set on AP */
short storedargs; /* # of arguments that have been stored */
short lastarg; /* true if "last" bit seen in PCL arglist */
ea_t argp; /* where to store next arg in new frame */
ea_t stackfp; /* new stack frame pointer */
ea_t fpva; /* virtual address of the free pointer */
pa_t pa; /* physical address of ecb */
unsigned short brsave[6]; /* old PB,SB,LB */
unsigned short utempa;
@@ -2659,7 +2665,7 @@ static pcl (ea_t ecbea) {
#if 0
if (ecbea == UNWIND_) {
printf("pcl: calling unwind_ at %d\n", gvp->instcount);
gvp->savetraceflags = ~TB_MAP;
gvp->savetraceflags = ~T_MAP;
}
#endif
@@ -2697,35 +2703,46 @@ static pcl (ea_t ecbea) {
TRACE(T_PCL, " ecb.pb: %o/%o\n ecb.framesize: %d\n ecb.stackroot %o\n ecb.argdisp: %o\n ecb.nargs: %d\n ecb.lb: %o/%o\n ecb.keys: %o\n", ecb[0], ecb[1], ecb[2], ecb[3], ecb[4], ecb[5], ecb[6], ecb[7], ecb[8]);
newrp = *(unsigned int *)(ecb+0);
if (access != 1) /* not a gate, but weaken ring (outward calls) */
if (access != 1) /* not a gate, so weaken ring (outward calls) */
newrp = newrp | (RP & RINGMASK32);
/* setup stack frame
NOTE: newrp must be used here so that accesses succeed when calling
an inner ring procedure. */
NOTE: newrp must be used here so that accesses succeed when
calling an inner ring procedure.
NOTE: see related code in STEX and PRTN.
*/
framesize = (ecb[2] + 1) & 0xFFFE; /* round up frame size to even */
stackrootseg = ecb[3];
eap = &gvp->brp[SBBR];
if (stackrootseg == 0) {
eap = &gvp->brp[SBBR];
stackrootseg = get16((*(unsigned int *)(crs+SB)) + 1);
TRACE(T_PCL, " stack root in ecb was zero, stack root from caller is %o\n", stackrootseg);
}
stackfp = get32r(MAKEVA(stackrootseg,0), newrp);
TRACE(T_PCL, " stack free pointer: %o/%o, current ring=%o, new ring=%o\n", stackfp>>16, stackfp&0xFFFF, (RPH&RINGMASK16)>>13, (newrp&RINGMASK32)>>29);
stacksize = ecb[2];
stackseg = stackrootseg;
/* if there isn't room for this frame, check the stack extension
pointer */
stackfp = get32r(MAKEVA(stackrootseg, 0), newrp);
TRACE(T_PCL, " stack free pointer is %o/%o, current ring=%o, new ring=%o\n", stackfp>>16, stackfp&0xFFFF, (RPH&RINGMASK16)>>13, (newrp&RINGMASK32)>>29);
if ((stackfp & 0xFFFF) + stacksize > 0xFFFF) {
stackfp = get32r(MAKEVA(stackrootseg,2), newrp);
TRACE(T_PCL, " no room for frame, extension pointer is %o/%o\n", stackfp>>16, stackfp&0xFFFF);
/* see if there is room for this frame */
/* XXX: faddr may need to be the last segment tried when this is changed to loop.
CPU.PCL Case 26 wants fault address word number to be 3; set EHDB */
if ((stackfp & 0xFFFF) + framesize > 0xFFFF) {
if (stackfp == 0 || (stackfp & 0xFFFF) + stacksize > 0xFFFF)
fault(STACKFAULT, 0, MAKEVA(stackrootseg,0) | (newrp & RINGMASK32));
/* no, follow the extension pointer in the last stack segment to
the next stack segment */
stackseg = SEGNO32(stackfp);
fpva = MAKEVA(stackseg, 2);
stackfp = get32r(fpva, newrp);
TRACE(T_PCL, " no room for frame, extension pointer at %o/%o is %o/%o\n", fpva>>16, fpva&0xffff, stackfp>>16, stackfp&0xFFFF);
/* CPU.PCL Case 26 wants fault address word number to be 3 for some
CPU models; set EHDB switch in CPU.PCL to avoid this error */
if (stackfp == 0 || (stackfp & 0xFFFF) + framesize > 0xFFFF)
fault(STACKFAULT, 0, MAKEVA(stackseg,0) | (newrp & RINGMASK32));
}
/* setup the new stack frame at stackfp
@@ -2760,7 +2777,12 @@ static pcl (ea_t ecbea) {
if (access == 1) /* for gate access, don't weaken ring */
*(unsigned int *)(crs+SB) = stackfp;
else
#if 1
*(unsigned int *)(crs+SB) = (stackfp & ~RINGMASK32) | (RP & RINGMASK32);
#else
/* XXX: use newrp ring, right? What about setting ring on LB, below? */
*(unsigned int *)(crs+SB) = (stackfp & ~RINGMASK32) | (newrp & RINGMASK32);
#endif
TRACE(T_PCL, " new SB=%o/%o\n", crs[SBH], crs[SBL]);
*(unsigned int *)(crs+LB) = *(unsigned int *)(ecb+6);
newkeys(ecb[8] & 0177770);
@@ -2772,11 +2794,11 @@ static pcl (ea_t ecbea) {
pointer if the extension pointer was followed. Try setting EHDB
to suppress this spurious DIAG error. */
ea = MAKEVA(stackrootseg,0) | (newrp & RINGMASK32);
ea = MAKEVA(stackrootseg, 0) | (newrp & RINGMASK32);
if (cpuid == 15)
put32r(stackfp+stacksize, ea, newrp);
put32r(stackfp+framesize, ea, newrp);
else
put32r((stackfp+stacksize) & ~RINGMASK32, ea, newrp);
put32r((stackfp+framesize) & ~RINGMASK32, ea, newrp);
/* transfer arguments if arguments are expected. There is no
documentation explaining how the Y register is used during
@@ -2900,6 +2922,7 @@ static void calf(ea_t ea) {
/* get concealed stack entry address */
eap = &gvp->brp[UNBR];
first = get16r0(pcbp+PCBCSFIRST);
next = get16r0(pcbp+PCBCSNEXT);
last = get16r0(pcbp+PCBCSLAST);
@@ -2911,6 +2934,7 @@ static void calf(ea_t ea) {
csea = MAKEVA(crs[OWNERH]+gvp->csoffset, this);
TRACE(T_FAULT,"CALF: cs frame is at %o/%o\n", csea>>16, csea&0xFFFF);
#if DBG
/* make sure ecb specifies zero args (not part of the architecture)
NOTE: this check needs get16r0 too because in Rev 19, segment 5
@@ -2922,26 +2946,31 @@ static void calf(ea_t ea) {
printf("CALF ecb at %o/%o has arguments!\n", ea>>16, ea&0xFFFF);
fatal(NULL);
}
#endif
pcl(ea);
/* get the concealed stack entries and adjust the new stack frame */
eap = &gvp->brp[UNBR];
*(unsigned int *)(cs+0) = get32r0(csea+0);
*(long long *)(cs+2) = get64r0(csea+2);
*(unsigned int *)(cs+2) = get32r0(csea+2);
*(unsigned int *)(cs+4) = get32r0(csea+4);
/* pop the concealed stack
XXX: this was after code below. Does it matter? */
put16r0(this, pcbp+PCBCSNEXT);
TRACE(T_FAULT, "CALF: cs entry: retpb=%o/%o, retkeys=%o, fcode=%o, faddr=%o/%o\n", cs[0], cs[1], cs[2], cs[3], cs[4], cs[5]);
eap = &gvp->brp[SBBR];
stackfp = *(unsigned int *)(crs+SB);
put16(1, stackfp+0); /* flag it as CALF frame */
put32(*(unsigned int *)(cs+0), stackfp+2); /* return PB */
put16(cs[2], stackfp+8); /* return keys */
put16(cs[3], stackfp+10); /* fault code */
put32(*(unsigned int *)(cs+4), stackfp+11); /* fault address */
/* pop the concealed stack */
put16r0(this, pcbp+PCBCSNEXT);
}
@@ -3575,7 +3604,7 @@ static lpsw() {
} else
gvp->livereglim = 040;
#if 0
gvp->savetraceflags |= TB_FLOW; /****/
gvp->savetraceflags |= T_FLOW; /****/
#endif
if (crs[MODALS] & 010) {
TRACE(T_PX, "Process exchange enabled:\n");
@@ -3611,7 +3640,7 @@ static sssn() {
int i;
//printf("SSSN @ %o/%o\n", RPH, RPL);
//gvp->savetraceflags = gvp->traceflags = ~TB_MAP; /*****/
//gvp->savetraceflags = gvp->traceflags = ~T_MAP; /*****/
TRACE(T_FLOW, " SSSN\n");
ea = *(unsigned int *)(crs+XB);
for (i=0; i<8; i++)
@@ -4028,6 +4057,8 @@ static int ldar(ea_t ea) {
result = 1;
else if (ea == 024)
result = -1;
else if (ea == 7)
result = RP;
else
result = regs.u32[ea];
} else {
@@ -4047,7 +4078,10 @@ static star(unsigned int val32, ea_t ea) {
printf("em: STLR ea '%o is out of range for this cpu model.\nThis -cpuid may not be supported by this version of software\nTry a lower -cpuid", ea);
fatal(NULL);
}
regs.u32[ea & 0777] = val32;
ea &= 0777;
regs.u32[ea] = val32;
if (ea == 7)
RP = val32;
} else {
ea &= 037;
if (ea > 017) RESTRICT();
@@ -4286,35 +4320,39 @@ main (int argc, char **argv) {
while (i+1 < argc && argv[i+1][0] != '-') {
i++;
if (strcmp(argv[i],"ear") == 0)
gvp->traceflags |= TB_EAR;
gvp->traceflags |= T_EAR;
else if (strcmp(argv[i],"eav") == 0)
gvp->traceflags |= TB_EAV;
gvp->traceflags |= T_EAV;
else if (strcmp(argv[i],"eai") == 0)
gvp->traceflags |= TB_EAI;
gvp->traceflags |= T_EAI;
else if (strcmp(argv[i],"inst") == 0)
gvp->traceflags |= TB_INST;
gvp->traceflags |= T_INST;
else if (strcmp(argv[i],"flow") == 0)
gvp->traceflags |= TB_FLOW;
gvp->traceflags |= T_FLOW;
else if (strcmp(argv[i],"mode") == 0)
gvp->traceflags |= TB_MODE;
gvp->traceflags |= T_MODE;
else if (strcmp(argv[i],"eaap") == 0)
gvp->traceflags |= TB_EAAP;
gvp->traceflags |= T_EAAP;
else if (strcmp(argv[i],"dio") == 0)
gvp->traceflags |= TB_DIO;
gvp->traceflags |= T_DIO;
else if (strcmp(argv[i],"map") == 0)
gvp->traceflags |= TB_MAP;
gvp->traceflags |= T_MAP;
else if (strcmp(argv[i],"pcl") == 0)
gvp->traceflags |= TB_PCL;
gvp->traceflags |= T_PCL;
else if (strcmp(argv[i],"fault") == 0)
gvp->traceflags |= TB_FAULT;
gvp->traceflags |= T_FAULT;
else if (strcmp(argv[i],"px") == 0)
gvp->traceflags |= TB_PX;
gvp->traceflags |= T_PX;
else if (strcmp(argv[i],"tio") == 0)
gvp->traceflags |= TB_TIO;
gvp->traceflags |= T_TIO;
else if (strcmp(argv[i],"term") == 0)
gvp->traceflags |= TB_TERM;
gvp->traceflags |= T_TERM;
else if (strcmp(argv[i],"rio") == 0)
gvp->traceflags |= TB_RIO;
gvp->traceflags |= T_RIO;
else if (strcmp(argv[i],"put") == 0)
gvp->traceflags |= T_PUT;
else if (strcmp(argv[i],"get") == 0)
gvp->traceflags |= T_GET;
else if (strcmp(argv[i],"all") == 0)
gvp->traceflags = ~0;
else if (isdigit(argv[i][0]) && strlen(argv[i]) <= 2 && sscanf(argv[i],"%d", &templ) == 1)
@@ -4568,7 +4606,7 @@ fetch:
#if 0
if (gvp->instcount > 2681900)
gvp->savetraceflags = TB_FLOW;
gvp->savetraceflags = T_FLOW;
if (gvp->instcount > 3000000)
gvp->savetraceflags = 0;
#endif
@@ -4588,7 +4626,7 @@ fetch:
following ARGT (if PCL completes w/o faults) */
if (TRACEUSER && SEGNO16(RPH) == 041 && 06200 <= RPL && RPL <= 06201) { /* ac$set */
gvp->savetraceflags = ~TB_MAP;
gvp->savetraceflags = ~T_MAP;
printf("enable trace, RPH=%o, RPL=%o\n", SEGNO16(RPH), RPL);
}
if (TRACEUSER && SEGNO16(RPH) == 013 && 044030 <= RPL && RPL <= 044031) { /* setrc$ */
@@ -4600,7 +4638,7 @@ fetch:
#if 0
/* this is for FTN Generic 3 trace */
if (SEGNO16(RPH) == 04000 && RPL >= 034750 && RPL <= 034760)
gvp->savetraceflags = ~TB_MAP;
gvp->savetraceflags = ~T_MAP;
else
gvp->savetraceflags = 0;
#endif
@@ -4645,7 +4683,7 @@ fetch:
To track this down, turn on tracing just before this instruction. */
if (75370000 < gvp->instcount && gvp->instcount < 75380000)
gvp->traceflags = ~TB_MAP;
gvp->traceflags = ~T_MAP;
#endif
#if 0
@@ -4709,7 +4747,7 @@ fetch:
regs.sym.pswkeys = crs[KEYS];
if (crs[MODALS] & 010) { /* PX enabled */
//gvp->traceflags = ~TB_MAP;
//gvp->traceflags = ~T_MAP;
newkeys(014000);
RPH = 4;
RPL = gvp->intvec;
@@ -4727,7 +4765,7 @@ fetch:
} else { /* standard interrupt mode */
m = get16(063);
//printf("Standard mode interrupt vector loc = %o\n", m);
//gvp->traceflags = ~TB_MAP;
//gvp->traceflags = ~T_MAP;
if (m != 0) {
put16(RPL, m);
RP = m+1;
@@ -5073,6 +5111,7 @@ d_nop: /* 000001 */
d_rsav: /* 000715 */
TRACE(T_FLOW, " RSAV\n");
ea = apea(NULL);
eap = &gvp->brp[SBBR]; /* registers almost always saved on the stack */
j = 1;
savemask = 0;
for (i = 11; i >= 0; i--) {
@@ -5092,6 +5131,7 @@ d_rsav: /* 000715 */
d_rrst: /* 000717 */
TRACE(T_FLOW, " RRST\n");
ea = apea(NULL);
eap = &gvp->brp[SBBR]; /* registers almost always saved on the stack */
savemask = get16(ea);
TRACE(T_INST, " Save mask=%o\n", savemask);
j = 1;
@@ -7140,7 +7180,7 @@ d_smcs: /* 0101200 */
d_badgen:
TRACEA(" unrecognized generic instruction!\n");
printf("em: #%d %o/%o: Unrecognized generic instruction '%o!\n", gvp->instcount, RPH, RPL, inst);
//gvp->traceflags = ~TB_MAP;
//gvp->traceflags = ~T_MAP;
fault(UIIFAULT, RPL, RP);
fatal(NULL);
@@ -8663,7 +8703,7 @@ imodepcl:
if (gvp->numtraceprocs > 0 && TRACEUSER)
for (i=0; i<gvp->numtraceprocs; i++)
if (traceprocs[i].ecb == (ea & 0xFFFFFFF) && traceprocs[i].sb == -1) {
gvp->traceflags = ~TB_MAP;
gvp->traceflags = ~T_MAP;
gvp->savetraceflags = gvp->traceflags;
traceprocs[i].sb = *(int *)(crs+SB);
printf("Enabled trace for %s at sb '%o/%o\n", traceprocs[i].name, crs[SBH], crs[SBL]);

20
emdev.h
View File

@@ -449,9 +449,9 @@ readasr:
printf("Trace owner = %o/%o\n", crs[OWNER], crs[OWNERL]);
if (gvp->savetraceflags == 0) {
TRACEA("\nTRACE ENABLED:\n\n");
gvp->savetraceflags = ~TB_MAP;
gvp->savetraceflags = ~T_MAP;
gvp->savetraceflags = ~0;
gvp->savetraceflags = TB_FLOW;
gvp->savetraceflags = T_FLOW|T_FAULT;
} else {
TRACEA("\nTRACE DISABLED:\n\n");
gvp->savetraceflags = 0;
@@ -1035,7 +1035,7 @@ int devmt (int class, int func, int device) {
devpoll[device] = 10;
if ((crs[A] & 0x00E0) == 0x0020) { /* rewind */
//gvp->traceflags = ~TB_MAP;
//gvp->traceflags = ~T_MAP;
TRACE(T_TIO, " rewind\n");
if (lseek(unit[u].fd, 0, SEEK_SET) == -1) {
perror("Unable to rewind tape drive file");
@@ -1375,7 +1375,7 @@ int devcp (int class, int func, int device) {
} else if (func == 015) { /* set interrupt mask */
/* this enables tracing when the clock process initializes */
//gvp->traceflags = ~TB_MAP;
//gvp->traceflags = ~T_MAP;
//TRACEA("Clock interrupt enabled!\n");
enabled = 1;
SETCLKPOLL;
@@ -1402,7 +1402,7 @@ int devcp (int class, int func, int device) {
if (func == 011) { /* input ID */
crs[A] = 020; /* this is the Option-A board */
crs[A] = 0120; /* this is the SOC board */
//gvp->traceflags = ~TB_MAP;
//gvp->traceflags = ~T_MAP;
} else if (func == 016) {
crs[A] = sswitch;
} else if (func == 017) { /* read switches pushed down */
@@ -1504,6 +1504,7 @@ int devcp (int class, int func, int device) {
the correct time. In addition to lowering overhead, slower
clock tick rates make catching up much faster. */
#ifndef FIXEDCLOCK
if (abs(ticks-targetticks) > 5000 && datnowea != 0)
ticks = -1;
else if (ticks < targetticks)
@@ -1516,6 +1517,7 @@ int devcp (int class, int func, int device) {
ticks = 0;
}
}
#endif
/* update instpermsec every 5 seconds. Check for instcount
overflow and reset when it occurs.
@@ -1693,7 +1695,7 @@ int devdisk (int class, int func, int device) {
char rtfile[16]; /* read trace file name */
int rtnw; /* total number of words read (all channels) */
//gvp->traceflags |= TB_DIO;
//gvp->traceflags |= T_DIO;
switch (class) {
@@ -1751,7 +1753,7 @@ int devdisk (int class, int func, int device) {
TRACE(T_INST|T_DIO, " INA '%2o%2o\n", func, device);
/* this turns tracing on when the Primos disk processes initialize */
//gvp->traceflags = ~TB_MAP;
//gvp->traceflags = ~T_MAP;
/* INA's are only accepted when the controller is not busy */
@@ -2095,7 +2097,7 @@ int devdisk (int class, int func, int device) {
gvp->intvec = m1;
dc[device].state = S_INT;
}
//gvp->traceflags = ~TB_MAP;
//gvp->traceflags = ~T_MAP;
devpoll[device] = 10;
return;
@@ -3040,7 +3042,7 @@ int devpnc (int class, int func, int device) {
#define DELIM " \t\n"
#define PDELIM ":"
//gvp->traceflags = ~TB_MAP;
//gvp->traceflags = ~T_MAP;
if (nport <= 0) {
if (class == -1)