1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-01-20 01:44:44 +00:00

KA10: Minor cleanup of KI10 paging, RP10 Disk and TMA Tape.

This commit is contained in:
Richard Cornwell 2017-01-16 21:58:26 -05:00
parent bd83b1f2be
commit cd8849128c
3 changed files with 32 additions and 69 deletions

View File

@ -105,7 +105,7 @@
#define TMR_RTC 1
#define UNIT_V_MSIZE (UNIT_V_UF + 0)
#if KI10
#if KI
#define UNIT_MSIZE (0177 << UNIT_V_MSIZE)
#else
#define UNIT_MSIZE (017 << UNIT_V_MSIZE)
@ -269,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_22BIT
#if KI_22BIT|KI
{ UNIT_MSIZE, 32, "512K", "512K", &cpu_set_size },
{ UNIT_MSIZE, 64, "1024K", "1024K", &cpu_set_size },
{ UNIT_MSIZE, 128, "2048K", "2048K", &cpu_set_size },
@ -998,18 +998,26 @@ t_stat null_dev(uint32 dev, uint64 *data) {
int page_lookup(int addr, int flag, int *loc, int wr, int cur_context) {
uint64 data;
int base = ub_ptr;
int page = addr >> 9;
int page = (RMASK & addr) >> 9;
int uf = (FLAGS & USER) != 0;
if (page_fault)
return 0;
/* If paging is not enabled, address is direct */
if (!page_enable) {
*loc = addr;
return 1;
}
/* If fetching byte data, use write access */
if (BYF5 && (IR & 06) == 6)
wr = 1;
/* If this is modify instruction use write access */
wr |= modify;
/* Figure out if this is a user space access */
if (flag)
uf = 0;
else if (xct_flag != 0 && !cur_context && !uf) {
@ -1019,6 +1027,7 @@ int page_lookup(int addr, int flag, int *loc, int wr, int cur_context) {
}
}
/* If user, check if small user enabled */
if (uf) {
if (small_user && (page & 0340) != 0) {
fault_data = (((uint64)(page))<<18) | ((uint64)(uf) << 27) | 020LL;
@ -1026,20 +1035,17 @@ 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) {
*loc = addr;
return 1;
}
/* Handle system mapping */
/* Pages 340-377 via UBR */
if ((page & 0740) == 0340) {
page += 01000 - 0340;
/* Pages 400-777 via EBR */
} else if (page & 0400) {
base = eb_ptr;
/* Pages 000-037 direct map */
} else {
/* Check if supervisory mode */
if (!flag && ((FLAGS & PUBLIC) != 0)) {
/* Handle public violation */
fault_data = (((uint64)(page))<<18) | ((uint64)(uf) << 27) | 021LL;
@ -1050,11 +1056,14 @@ int page_lookup(int addr, int flag, int *loc, int wr, int cur_context) {
return 1;
}
}
/* Map the page */
data = M[base + (page >> 1)];
/* Even in left half, Odd in right half. */
if ((page & 1) == 0)
data >>= 18;
data &= RMASK;
*loc = ((data & 017777) << 9) + (addr & 0777);
/* Access check logic */
if (!flag && ((FLAGS & PUBLIC) != 0) && ((data & 0200000) == 0)) {
/* Handle public violation */
fault_data = (((uint64)(page))<<18) | ((uint64)(uf) << 27) | 021LL;

View File

@ -379,6 +379,8 @@ t_stat dp_devio(uint32 dev, uint64 *data) {
}
if (tmp)
df10->status &= ~PI_ENABLE;
else
df10_setirq(df10);
}
sim_debug(DEBUG_CONO, dptr, "DP %03o CONO %06o %d PC=%o %06o\n", dev,
(uint32)*data, ctlr, PC, df10->status);
@ -543,28 +545,33 @@ t_stat dp_svc (UNIT *uptr)
if (uptr->STATUS & END_CYL) {
uptr->UFLAGS |= DONE;
df10_finish_op(df10, 0);
sim_debug(DEBUG_DATA, dptr, "DP %03o DFS %012llo %06o %06o\n", ctlr, M[df10->cia|1], df10->ccw, df10->cda);
return SCPE_OK;
}
if (sect >= dp_drv_tab[dtype].sect) {
uptr->UFLAGS |= DONE;
uptr->STATUS |= SEC_ERR;
df10_finish_op(df10, 0);
sim_debug(DEBUG_DATA, dptr, "DP %03o DFS %012llo %06o %06o\n", ctlr, M[df10->cia|1], df10->ccw, df10->cda);
return SCPE_OK;
}
if (surf >= dp_drv_tab[dtype].surf) {
uptr->UFLAGS |= DONE;
uptr->STATUS |= SUF_ERR;
df10_finish_op(df10, 0);
sim_debug(DEBUG_DATA, dptr, "DP %03o DFS %012llo %06o %06o\n", ctlr, M[df10->cia|1], df10->ccw, df10->cda);
return SCPE_OK;
}
if (cyl != uptr->CUR_CYL) {
uptr->UFLAGS |= DONE;
uptr->STATUS |= SRC_ERR;
df10_finish_op(df10, 0);
sim_debug(DEBUG_DATA, dptr, "DP %03o DFS %012llo %06o %06o\n", ctlr, M[df10->cia|1], df10->ccw, df10->cda);
return SCPE_OK;
}
if ((uptr->STATUS & BUSY) == 0) {
df10_finish_op(df10, 0);
sim_debug(DEBUG_DATA, dptr, "DP %03o DFS %012llo %06o %06o\n", ctlr, M[df10->cia|1], df10->ccw, df10->cda);
return SCPE_OK;
}
if (cmd != WR) {
@ -647,6 +654,7 @@ t_stat dp_svc (UNIT *uptr)
if (r)
sim_activate(uptr, 25);
else {
sim_debug(DEBUG_DATA, dptr, "DP %03o DFS %012llo %06o %06o\n", ctlr, M[df10->cia|1], df10->ccw, df10->cda);
uptr->STATUS &= ~(SRC_DONE|BUSY);
uptr->UFLAGS |= DONE;
}

View File

@ -257,8 +257,6 @@ t_stat mt_devio(uint32 dev, uint64 *data) {
case WTM:
break;
case READ:
// if ((uptr->u3 & ODD_PARITY) != 0)
// status |= PARITY_ERR;
CLR_BUF(uptr);
uptr->u5 = 0;
uptr->u6 = 0;
@ -269,8 +267,6 @@ t_stat mt_devio(uint32 dev, uint64 *data) {
break;
}
case CMP:
// if ((uptr->u3 & ODD_PARITY) != 0)
// status |= PARITY_ERR;
CLR_BUF(uptr);
uptr->u5 = 0;
uptr->u6 = 0;
@ -281,14 +277,9 @@ t_stat mt_devio(uint32 dev, uint64 *data) {
set_interrupt(MT_DEVNUM, pia);
}
}
// if (NOP_CLR != ((uptr->u3 & FUNCTION) >> 9)) {
// uptr->u3 |= MT_MOTION;
// status |= JOB_DONE;
// break;
// }
status |= IDLE_UNIT;
uptr->u3 |= MT_BUSY;
sim_activate(uptr, 100);
sim_activate(uptr, 300);
} else {
sim_activate(uptr, 9999999);
sim_debug(DEBUG_CONO, dptr, "MT CONO %03o hung PC=%06o\n", dev, PC);
@ -297,8 +288,6 @@ t_stat mt_devio(uint32 dev, uint64 *data) {
case DATAI:
/* Xfer data */
// if (status & JOB_DONE)
// mt_df10.buf = 0;
clr_interrupt(MT_DEVNUM);
*data = hold_reg;
uptr->u3 &= ~MT_BUFFUL;
@ -321,13 +310,7 @@ t_stat mt_devio(uint32 dev, uint64 *data) {
hold_reg = *data;
status &= ~DATA_REQUEST;
clr_interrupt(MT_DEVNUM);
// if ((uptr->u3 & MT_BRFUL) == 0) {
// mt_df10.buf = hold_reg;
// uptr->u3 |= MT_BRFUL;
// uptr->u3 &= ~MT_BUFFUL;
// } else {
uptr->u3 |= MT_BUFFUL;
// }
uptr->u3 |= MT_BUFFUL;
sim_debug(DEBUG_DATA, dptr, "MT %03o <%012llo, %012llo\n",
dev, hold_reg, mt_df10.buf);
break;
@ -352,17 +335,10 @@ t_stat mt_devio(uint32 dev, uint64 *data) {
case CONO|04:
if (*data & 1) {
uptr->u3 |= MT_STOP;
// if (status & DATA_REQUEST) {
// status &= ~DATA_REQUEST;
// clr_interrupt(MT_DEVNUM);
// }
sim_debug(DEBUG_DETAIL, dptr, "MT stop %03o\n", dev);
}
if (*data & 2) {
// mt_df10.buf = hold_reg;
hold_reg ^= mt_df10.buf;
// hold_reg = 0;
// mt_df10.buf = 0;
}
sim_debug(DEBUG_CONO, dptr, "MT CONO %03o control %o %o %012llo %012llo\n",
dev, uptr->u3, unit, hold_reg, mt_df10.buf);
@ -384,6 +360,7 @@ t_stat mt_devio(uint32 dev, uint64 *data) {
return SCPE_OK;
}
/* Wrapper to handle reading of hold register or via DF10 */
void mt_df10_read(DEVICE *dptr, UNIT *uptr) {
if (dptr->flags & MTDF_TYPEB) {
if (!df10_read(&mt_df10)) {
@ -410,6 +387,7 @@ void mt_df10_read(DEVICE *dptr, UNIT *uptr) {
uptr->u5 = 0;
}
/* Wrapper to handle writing of hold register or via DF10 */
void mt_df10_write(DEVICE *dptr, UNIT *uptr) {
if (dptr->flags & MTDF_TYPEB) {
if (!df10_write(&mt_df10)) {
@ -669,21 +647,7 @@ t_stat mt_srv(UNIT * uptr)
uptr->u5++;
if (uptr->u5 == cc_max) {
uptr->u5 = 0;
// if (uptr->u5 & MT_BUFFUL) {
// if ((dptr->flags & MTDF_TYPEB) == 0) {
// status |= DATA_REQUEST;
// set_interrupt(MT_DEVNUM, pia);
// }
// uptr->u3 &= ~(MT_BUFFUL);
// mt_df10.buf = hold_reg;
// uptr->u3 |= MT_BRFUL;
// } else {
uptr->u3 &= ~MT_BRFUL;
// if ((dptr->flags & MTDF_TYPEB) == 0) {
// status |= DATA_REQUEST;
// set_interrupt(MT_DEVNUM, pia);
// }
// }
uptr->u3 &= ~MT_BRFUL;
}
status &= ~CHAR_COUNT;
status |= (uint64)(uptr->u5) << 18;
@ -701,10 +665,6 @@ t_stat mt_srv(UNIT * uptr)
uptr->hwmark = 0;
uptr->u5 = 0;
uptr->u6 = 0;
// if ((dptr->flags & MTDF_TYPEB) == 0) {
// status |= DATA_REQUEST;
// set_interrupt(MT_DEVNUM, pia);
// }
break;
}
if ((uptr->u3 & MT_BRFUL) == 0)
@ -729,21 +689,7 @@ t_stat mt_srv(UNIT * uptr)
uptr->u5++;
if (uptr->u5 == cc_max) {
uptr->u5 = 0;
// if (uptr->u5 & MT_BUFFUL) {
// if ((dptr->flags & MTDF_TYPEB) == 0) {
// status |= DATA_REQUEST;
// set_interrupt(MT_DEVNUM, pia);
// }
// uptr->u3 &= ~(MT_BUFFUL);
// mt_df10.buf = hold_reg;
// uptr->u3 |= MT_BRFUL;
// } else {
uptr->u3 &= ~MT_BRFUL;
// if ((dptr->flags & MTDF_TYPEB) == 0) {
// status |= DATA_REQUEST;
// set_interrupt(MT_DEVNUM, pia);
// }
// }
uptr->u3 &= ~MT_BRFUL;
}
status &= ~CHAR_COUNT;
status |= (uint64)(uptr->u5) << 18;