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:
parent
bd83b1f2be
commit
cd8849128c
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user