1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-01-25 03:36:04 +00:00

KA10: KI10 support improved. Added switch register.

This commit is contained in:
Richard Cornwell 2016-10-16 21:47:52 -04:00
parent a6bd4512e3
commit be6f5aa8bd
3 changed files with 65 additions and 65 deletions

View File

@ -130,6 +130,7 @@ uint32 PC; /* Program counter */
uint32 IR; /* Instruction register */
uint32 FLAGS; /* Flags */
uint32 AC; /* Operand accumulator */
uint64 SW; /* Switch register */
int BYF5; /* Second half of LDB/DPB instruction */
int uuo_cycle; /* Uuo cycle in progress */
int sac_inh; /* Don't store AR in AC */
@ -255,6 +256,7 @@ REG cpu_reg[] = {
{ ORDATA (FM17, FM[017], 36) },
{ ORDATA (PIENB, pi_enable, 7) },
{ BRDATA (REG, FM, 8, 36, 017) },
{ ORDATAD(SW, SW, 36, "Console SW Register"), REG_FIT},
{ NULL }
};
@ -267,7 +269,7 @@ MTAB cpu_mod[] = {
{ UNIT_MSIZE, 8, "128K", "128K", &cpu_set_size },
{ UNIT_MSIZE, 12, "196K", "196K", &cpu_set_size },
{ UNIT_MSIZE, 16, "256K", "256K", &cpu_set_size },
#if KI & KI_22BIT
#if KI_22BIT
{ UNIT_MSIZE, 32, "512K", "512K", &cpu_set_size },
{ UNIT_MSIZE, 64, "1024K", "1024K", &cpu_set_size },
{ UNIT_MSIZE, 128, "2048K", "2048K", &cpu_set_size },
@ -724,10 +726,10 @@ t_stat dev_pag(uint32 dev, uint64 *data) {
}
if (res & SMASK) {
ub_ptr = ((res >> 18) & 017777) << 9;
user_addr_cmp = (res & 00020000000000LL) != 0;
small_user = (res & 00040000000000LL) != 0;
fm_sel = (uint8)(res >> 29) & 060;
}
user_addr_cmp = (res & 00020000000000LL) != 0;
small_user = (res & 00040000000000LL) != 0;
fm_sel = (uint8)(res >> 29) & 060;
pag_reload = 0;
sim_debug(DEBUG_DATAIO, &cpu_dev,
"DATAO PAG %012llo ebr=%06o ubr=%06o\n",
@ -817,6 +819,7 @@ t_stat dev_apr(uint32 dev, uint64 *data) {
case DATAI:
/* Read switches */
*data = SW;
sim_debug(DEBUG_DATAIO, &cpu_dev, "DATAI APR %012llo\n", *data);
break;
}
@ -909,6 +912,7 @@ t_stat dev_apr(uint32 dev, uint64 *data) {
case DATAI:
/* Read switches */
*data = SW;
sim_debug(DEBUG_DATAIO, &cpu_dev, "DATAI APR %012llo\n", *data);
break;
}
@ -1019,6 +1023,7 @@ int page_lookup(int addr, int flag, int *loc, int wr, int cur_context) {
fprintf(stderr, " %03o small fault\n\r", page);
return 0;
}
data = M[base + (page >> 1)];
} else {
/* If paging is not enabled, address is direct */
if (!page_enable) {
@ -1026,14 +1031,12 @@ int page_lookup(int addr, int flag, int *loc, int wr, int cur_context) {
return 1;
}
/* Pages 340-377 via UBR */
// fprintf(stderr, "xlat %06o %03o ", addr, page >> 1);
if ((page & 0740) == 0340) {
page += 01000 - 0340;
/* Pages 400-777 via EBR */
} else if (page & 0400) {
base = eb_ptr;
} else {
// fprintf(stderr, "\n\r");
if (!flag && ((FLAGS & PUBLIC) != 0)) {
/* Handle public violation */
fault_data = (((uint64)(page))<<18) | ((uint64)(uf) << 27) | 021LL;
@ -1045,18 +1048,14 @@ int page_lookup(int addr, int flag, int *loc, int wr, int cur_context) {
}
}
data = M[base + (page >> 1)];
// fprintf(stderr, " %06o %03o %012llo ", base, page, data);
if ((page & 1) == 0)
data >>= 18;
data &= RMASK;
// fprintf(stderr, " -> %06llo wr=%o ", data, wr);
*loc = ((data & 017777) << 9) + (addr & 0777);
// fprintf(stderr, " -> %06o\n", *loc);
if (!flag && ((FLAGS & PUBLIC) != 0) && ((data & 0200000) == 0)) {
/* Handle public violation */
fault_data = (((uint64)(page))<<18) | ((uint64)(uf) << 27) | 021LL;
private_page = 1;
// fprintf(stderr, " public");
}
if (cur_context && ((data & 0200000) != 0))
FLAGS |= PUBLIC;
@ -1073,7 +1072,6 @@ int page_lookup(int addr, int flag, int *loc, int wr, int cur_context) {
fprintf(stderr, " fault\n\r");
return 0;
}
// fprintf(stderr, "\n\r");
return 1;
}
@ -1405,29 +1403,6 @@ no_fetch:
}
} while (ind & !pi_rq);
/* Update history */
if (hst_lnt && PC > 020 && (PC & 0777774) != 0472174 &&
(PC & 0777700) != 023700 && (PC != 0527154)) {
hst_p = hst_p + 1;
if (hst_p >= hst_lnt) {
hst_p = 0;
// reason = STOP_IBKPT;
}
hst[hst_p].pc = HIST_PC | ((BYF5)? (HIST_PC2|PC) : PC);
hst[hst_p].ea = AB;
hst[hst_p].ir = AD;
hst[hst_p].flags = (FLAGS << 5) |(clk_flg << 2) | (nxm_flag << 1)
#if KA
| (mem_prot << 4) | (push_ovf << 3)
#endif
;
hst[hst_p].ac = get_reg(AC);
}
// /* Update final address into history. */
// if (hst_lnt) {
// hst[hst_p].ea = AB;
// }
/* If there is a interrupt handle it. */
if (pi_rq) {
set_pi_hold(); /* Hold off all lower interrupts */
@ -1464,6 +1439,30 @@ no_fetch:
#endif
}
/* Update history */
#if KI
if (hst_lnt && (fm_sel || PC > 020) && (PC & 0777774) != 0472174 &&
(PC & 0777700) != 023700 && (PC != 0527154)) {
#else
if (hst_lnt && PC > 020 && (PC & 0777774) != 0472174 &&
(PC & 0777700) != 023700 && (PC != 0527154)) {
#endif
hst_p = hst_p + 1;
if (hst_p >= hst_lnt) {
hst_p = 0;
// reason = STOP_IBKPT;
}
hst[hst_p].pc = HIST_PC | ((BYF5)? (HIST_PC2|PC) : PC);
hst[hst_p].ea = AB;
hst[hst_p].ir = AD;
hst[hst_p].flags = (FLAGS << 5) |(clk_flg << 2) | (nxm_flag << 1)
#if KA
| (mem_prot << 4) | (push_ovf << 3)
#endif
;
hst[hst_p].ac = get_reg(AC);
}
fetch_opr:
/* Set up to execute instruction */

View File

@ -55,7 +55,8 @@
#endif
#ifndef KI_22BIT
#define KI_22BIT KI|KL
//#define KI_22BIT KI|KL
#define KI_22BIT 0
#endif
/* Digital Equipment Corporation's 36b family had six implementations:
@ -211,13 +212,13 @@ extern DEBTAB crd_debug[];
#define ICWA 0000000000776
#if KI_22BIT
#define AMASK 0000017777777LL
#define WMASK 037777LL
#define CSHIFT 22
#define AMASK 00000017777777LL
#define WMASK 00777760LL
#define CSHIFT 22
#else
#define AMASK RMASK
#define WMASK RMASK
#define CSHIFT 18
#define AMASK RMASK
#define WMASK RMASK
#define CSHIFT 18
#endif
#define API_MASK 0000000007

View File

@ -30,7 +30,7 @@ void df10_setirq(struct df10 *df) {
void df10_writecw(struct df10 *df) {
df->status |= 1 << df->ccw_comp;
M[df->cia|1] = (((uint64)(df->ccw)) << CSHIFT) | ((uint64)df->cda);
M[df->cia|1] = ((uint64)(df->ccw & WMASK) << CSHIFT) | ((uint64)df->cda & AMASK);
}
void df10_finish_op(struct df10 *df, int flags) {
@ -75,43 +75,43 @@ int df10_fetch(struct df10 *df) {
int df10_read(struct df10 *df) {
uint64 data;
if (df->wcr == 0) {
if (!df10_fetch(df))
return 0;
if (!df10_fetch(df))
return 0;
}
df->wcr = (df->wcr + 1) & WMASK;
df->wcr = (uint32)((df->wcr + 1) & WMASK);
if (df->cda != 0) {
if (df->cda > MEMSIZE) {
df10_finish_op(df, 1<<df->nxmerr);
return 0;
}
df->cda = (uint32)((df->cda + 1) & AMASK);
data = M[df->cda];
} else {
data = 0;
}
df->buf = data;
if (df->wcr == 0) {
if (df->cda > MEMSIZE) {
df10_finish_op(df, 1<<df->nxmerr);
return 0;
}
df->cda = (uint32)((df->cda + 1) & AMASK);
data = M[df->cda];
} else {
data = 0;
}
df->buf = data;
if (df->wcr == 0) {
return df10_fetch(df);
}
return 1;
}
return 1;
}
int df10_write(struct df10 *df) {
if (df->wcr == 0) {
if (!df10_fetch(df))
return 0;
if (!df10_fetch(df))
return 0;
}
df->wcr = (uint32)((df->wcr + 1) & WMASK);
if (df->cda != 0) {
if (df->cda > MEMSIZE) {
if (df->cda > MEMSIZE) {
df10_finish_op(df, 1<<df->nxmerr);
return 0;
}
df->cda = (uint32)((df->cda + 1) & AMASK);
M[df->cda] = df->buf;
}
df->cda = (uint32)((df->cda + 1) & AMASK);
M[df->cda] = df->buf;
}
if (df->wcr == 0) {
return df10_fetch(df);
return df10_fetch(df);
}
return 1;
}