From cd8849128cf05a2af29ff338ebe4d6f48194c6f0 Mon Sep 17 00:00:00 2001 From: Richard Cornwell Date: Mon, 16 Jan 2017 21:58:26 -0500 Subject: [PATCH] KA10: Minor cleanup of KI10 paging, RP10 Disk and TMA Tape. --- PDP10/ka10_cpu.c | 27 +++++++++++++------- PDP10/ka10_dp.c | 8 ++++++ PDP10/ka10_mt.c | 66 +++++------------------------------------------- 3 files changed, 32 insertions(+), 69 deletions(-) diff --git a/PDP10/ka10_cpu.c b/PDP10/ka10_cpu.c index af57277..4dcb95b 100644 --- a/PDP10/ka10_cpu.c +++ b/PDP10/ka10_cpu.c @@ -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; diff --git a/PDP10/ka10_dp.c b/PDP10/ka10_dp.c index 8d40288..a8ad36f 100644 --- a/PDP10/ka10_dp.c +++ b/PDP10/ka10_dp.c @@ -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; } diff --git a/PDP10/ka10_mt.c b/PDP10/ka10_mt.c index be04969..2f2df24 100644 --- a/PDP10/ka10_mt.c +++ b/PDP10/ka10_mt.c @@ -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;