mirror of
https://github.com/prirun/p50em.git
synced 2026-01-11 23:42:56 +00:00
changed main loop to test inhcount only when intvec is set;
this also required changes to emdev.h (can't look at inhcount)
This commit is contained in:
parent
84f57c9d59
commit
c845fdce12
2
ea64v.h
2
ea64v.h
@ -161,7 +161,7 @@ labB:
|
||||
SB%+20,*, which may still be in the same page. Don't switch to
|
||||
UNBR if the new ea is still in the current page */
|
||||
|
||||
if ((((ea_s & 0x8FFF) << 16) | (ea_w & 0xFC00)) != eap->vpn)
|
||||
if ((((ea_s & 0x8FFF) << 16) | (ea_w & 0xFC00)) != (eap->vpn & 0x0FFFFFFF))
|
||||
eap = &gvp->brp[UNBR];
|
||||
}
|
||||
if (xok)
|
||||
|
||||
67
em.c
67
em.c
@ -4642,42 +4642,43 @@ fetch:
|
||||
|
||||
/* is an interrupt pending, with interrupts enabled? */
|
||||
|
||||
if (gvp->inhcount)
|
||||
gvp->inhcount--;
|
||||
else if (gvp->intvec >= 0 && (crs[MODALS] & 0100000) /* && gvp->inhcount == 0 */) {
|
||||
//printf("fetch: taking interrupt vector '%o, modals='%o\n", gvp->intvec, crs[MODALS]);
|
||||
TRACE(T_FLOW, "\nfetch: taking interrupt vector '%o, modals='%o\n", gvp->intvec, crs[MODALS]);
|
||||
regs.sym.pswpb = RP;
|
||||
regs.sym.pswkeys = crs[KEYS];
|
||||
if (gvp->intvec >= 0 && (crs[MODALS] & 0100000)) {
|
||||
if (gvp->inhcount == 0) {
|
||||
//printf("fetch: taking interrupt vector '%o, modals='%o\n", gvp->intvec, crs[MODALS]);
|
||||
TRACE(T_FLOW, "\nfetch: taking interrupt vector '%o, modals='%o\n", gvp->intvec, crs[MODALS]);
|
||||
regs.sym.pswpb = RP;
|
||||
regs.sym.pswkeys = crs[KEYS];
|
||||
|
||||
if (crs[MODALS] & 010) { /* PX enabled */
|
||||
//gvp->traceflags = ~TB_MAP;
|
||||
newkeys(014000);
|
||||
RPH = 4;
|
||||
RPL = gvp->intvec;
|
||||
if (crs[MODALS] & 010) { /* PX enabled */
|
||||
//gvp->traceflags = ~TB_MAP;
|
||||
newkeys(014000);
|
||||
RPH = 4;
|
||||
RPL = gvp->intvec;
|
||||
|
||||
} else if (crs[MODALS] & 040000) { /* vectored interrupt mode */
|
||||
m = get16(gvp->intvec);
|
||||
if (m != 0) {
|
||||
put16(RPL, m);
|
||||
RP = m+1;
|
||||
} else {
|
||||
printf("fetch: interrupt vector '%o = 0 in vectored interrupt mode\n", gvp->intvec);
|
||||
fatal(NULL);
|
||||
} else if (crs[MODALS] & 040000) { /* vectored interrupt mode */
|
||||
m = get16(gvp->intvec);
|
||||
if (m != 0) {
|
||||
put16(RPL, m);
|
||||
RP = m+1;
|
||||
} else {
|
||||
printf("fetch: interrupt vector '%o = 0 in vectored interrupt mode\n", gvp->intvec);
|
||||
fatal(NULL);
|
||||
}
|
||||
|
||||
} else { /* standard interrupt mode */
|
||||
m = get16(063);
|
||||
//printf("Standard mode interrupt vector loc = %o\n", m);
|
||||
//gvp->traceflags = ~TB_MAP;
|
||||
if (m != 0) {
|
||||
put16(RPL, m);
|
||||
RP = m+1;
|
||||
} else {
|
||||
fatal("em: loc '63 = 0 when standard mode interrupt occurred");
|
||||
}
|
||||
}
|
||||
|
||||
} else { /* standard interrupt mode */
|
||||
m = get16(063);
|
||||
//printf("Standard mode interrupt vector loc = %o\n", m);
|
||||
//gvp->traceflags = ~TB_MAP;
|
||||
if (m != 0) {
|
||||
put16(RPL, m);
|
||||
RP = m+1;
|
||||
} else {
|
||||
fatal("em: loc '63 = 0 when standard mode interrupt occurred");
|
||||
}
|
||||
}
|
||||
crs[MODALS] &= 077777; /* inhibit interrupts */
|
||||
crs[MODALS] &= 077777; /* inhibit interrupts */
|
||||
} else
|
||||
gvp->inhcount--;
|
||||
}
|
||||
|
||||
gvp->prevpc = RP;
|
||||
|
||||
4
emdev.h
4
emdev.h
@ -1257,7 +1257,7 @@ int devmt (int class, int func, int device) {
|
||||
TRACE(T_TIO, " POLL device '%02o, enabled=%d, interrupting=%d\n", device, enabled, interrupting);
|
||||
if (enabled && (interrupting == 1)) {
|
||||
devpoll[device] = 100; /* assume interrupt will be deferred */
|
||||
if (gvp->intvec == -1 && (crs[MODALS] & 0100000) && gvp->inhcount == 0) {
|
||||
if (gvp->intvec == -1 && (crs[MODALS] & 0100000)) {
|
||||
TRACE(T_TIO, " CPU interrupt to vector '%o\n", mtvec);
|
||||
gvp->intvec = mtvec;
|
||||
devpoll[device] = 0;
|
||||
@ -2086,7 +2086,7 @@ int devdisk (int class, int func, int device) {
|
||||
|
||||
case 14: /* DINT = generate interrupt through vector address */
|
||||
TRACE(T_INST|T_DIO, " interrupt through '%o\n", m1);
|
||||
if (gvp->intvec >= 0 || !(crs[MODALS] & 0100000) || gvp->inhcount > 0)
|
||||
if (gvp->intvec >= 0 || !(crs[MODALS] & 0100000))
|
||||
dc[device].oar -= 2; /* can't take interrupt right now */
|
||||
else {
|
||||
gvp->intvec = m1;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user