1
0
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:
Jim 2007-10-04 00:00:00 -04:00
parent 84f57c9d59
commit c845fdce12
3 changed files with 37 additions and 36 deletions

View File

@ -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
View File

@ -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;

View File

@ -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;