diff --git a/PDP10/ka10_mt.c b/PDP10/ka10_mt.c index e59db98..f8cc8d4 100644 --- a/PDP10/ka10_mt.c +++ b/PDP10/ka10_mt.c @@ -50,8 +50,7 @@ #define MTUF_7TRK (1 << MTUF_V_UF) #define BUFFSIZE (32 * 1024) -#define UNIT_MT(x) UNIT_ATTABLE | UNIT_DISABLE | UNIT_ROABLE | \ - UNIT_S_CHAN(x) +#define UNIT_MT UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+UNIT_ROABLE #define LT 66 /* Time per char low density */ #define HT 16 /* Time per char high density */ @@ -160,22 +159,14 @@ uint8 mt_buffer[BUFFSIZE]; UNIT mt_unit[] = { /* Controller 1 */ - {UDATA(&mt_srv, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE, 0)}, /* 0 */ - {UDATA(&mt_srv, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE, 0)}, /* 1 */ - {UDATA(&mt_srv, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE, 0)}, /* 2 */ - {UDATA(&mt_srv, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE, 0)}, /* 3 */ - {UDATA(&mt_srv, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE, 0)}, /* 4 */ - {UDATA(&mt_srv, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE, 0)}, /* 5 */ - {UDATA(&mt_srv, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE, 0)}, /* 6 */ - {UDATA(&mt_srv, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+ - UNIT_ROABLE, 0)}, /* 7 */ + {UDATA(&mt_srv, UNIT_MT, 0)}, /* 0 */ + {UDATA(&mt_srv, UNIT_MT, 0)}, /* 1 */ + {UDATA(&mt_srv, UNIT_MT, 0)}, /* 2 */ + {UDATA(&mt_srv, UNIT_MT, 0)}, /* 3 */ + {UDATA(&mt_srv, UNIT_MT, 0)}, /* 4 */ + {UDATA(&mt_srv, UNIT_MT, 0)}, /* 5 */ + {UDATA(&mt_srv, UNIT_MT, 0)}, /* 6 */ + {UDATA(&mt_srv, UNIT_MT, 0)}, /* 7 */ }; DIB mt_dib = {MT_DEVNUM, 2, &mt_devio, NULL}; @@ -793,6 +784,7 @@ mt_boot(int32 unit_num, DEVICE * dptr) r = sim_tape_rewind(uptr); if (r != SCPE_OK) return r; + uptr->u3 = 022200; /* Read 800 BPI, Core */ r = sim_tape_rdrecf(uptr, &mt_buffer[0], &reclen, BUFFSIZE); if (r != SCPE_OK) return r; @@ -805,11 +797,12 @@ mt_boot(int32 unit_num, DEVICE * dptr) while (wc != 0) { wc = (wc + 1) & RMASK; addr = (addr + 1) & RMASK; - if ((uint32)uptr->u6 >= reclen) { + if ((uint32)uptr->u6 >= uptr->hwmark) { r = sim_tape_rdrecf(uptr, &mt_buffer[0], &reclen, BUFFSIZE); if (r != SCPE_OK) return r; uptr->u6 = 0; + uptr->hwmark = reclen; } mt_read_word(uptr); if (addr < 020) @@ -817,7 +810,18 @@ mt_boot(int32 unit_num, DEVICE * dptr) else M[addr] = mt_df10.buf; } - PC = addr; + if (addr < 020) + FM[addr] = mt_df10.buf; + else + M[addr] = mt_df10.buf; + + /* If not at end of record and TMA continue record read */ + if ((uptr->u6 < uptr->hwmark) && (dptr->flags & MTDF_TYPEB) == 0) { + uptr->u3 |= MT_MOTION|MT_BUSY; + uptr->u3 &= ~(MT_BRFUL|MT_BUFFUL); + sim_activate(uptr, 300); + } + PC = mt_df10.buf & RMASK; return SCPE_OK; } diff --git a/PDP10/ka10_pt.c b/PDP10/ka10_pt.c index 1c9fe77..0a39fd9 100644 --- a/PDP10/ka10_pt.c +++ b/PDP10/ka10_pt.c @@ -69,7 +69,7 @@ const char *ptr_description (DEVICE *dptr); DIB ptp_dib = { PP_DEVNUM, 1, &ptp_devio, NULL }; UNIT ptp_unit = { - UDATA (&ptp_svc, UNIT_SEQ+UNIT_ATTABLE+UNIT_TEXT, 0), SERIAL_OUT_WAIT + UDATA (&ptp_svc, UNIT_ATTABLE+UNIT_TEXT, 0), SERIAL_OUT_WAIT }; REG ptp_reg[] = { @@ -93,7 +93,7 @@ DEVICE ptp_dev = { DIB ptr_dib = { PR_DEVNUM, 1, &ptr_devio, NULL }; UNIT ptr_unit = { - UDATA (&ptr_svc, UNIT_SEQ+UNIT_ATTABLE+UNIT_TEXT, 0), SERIAL_OUT_WAIT + UDATA (&ptr_svc, UNIT_ATTABLE+UNIT_TEXT, 0), SERIAL_OUT_WAIT }; REG ptr_reg[] = { @@ -295,15 +295,15 @@ t_stat ptr_svc (UNIT *uptr) uint64 ptr_read_word(UNIT *uptr) { int i, ch; - uint64 word; + uint64 word = 0; - for(i = 0; i <= 6;) { - if ((ch = getc (uptr->fileref)) == EOF) { - if (ch & 0200) { - word <<= 6; - word |= (uint64)(ch & 077); - i++; - } + for(i = 0; i < 6;) { + if ((ch = getc (uptr->fileref)) == EOF) + return word; + if (ch & 0200) { + word <<= 6; + word |= (uint64)(ch & 077); + i++; } } return word; @@ -332,7 +332,15 @@ ptr_boot(int32 unit_num, DEVICE * dptr) else M[addr] = word; } - PC = addr; + if (addr < 020) + FM[addr] = word; + else + M[addr] = word; + uptr->STATUS = BUSY_FLG|BIN_FLG|TAPE_PR; + uptr->CHR = 0; + uptr->CHL = 0; + sim_activate (&ptr_unit, ptr_unit.wait); + PC = word & RMASK; return SCPE_OK; } diff --git a/PDP10/ka10_sys.c b/PDP10/ka10_sys.c index 1e47bd2..d414e05 100644 --- a/PDP10/ka10_sys.c +++ b/PDP10/ka10_sys.c @@ -206,22 +206,22 @@ int32 op, i, ldrc; data = getrimw (fileref); /* get first word */ if ((data < 0) || ((data & AMASK) != 0)) /* error? SA != 0? */ return SCPE_FMT; -ldrc = -((int32) ((data >> 18) & RMASK)); /* get loader count */ +ldrc = 1 + (RMASK ^ ((int32) ((data >> 18) & RMASK))); /* get loader count */ if (ldrc == 016) /* 16? RIM10B */ its_rim = FALSE; else if (ldrc == 017) /* 17? ITS RIM */ its_rim = TRUE; -else SCPE_FMT; /* unknown */ +else return SCPE_FMT; /* unknown */ for (i = 0; i < ldrc; i++) { /* skip the loader */ data = getrimw (fileref); - if (data < 0) + if (data == RIM_EOF) return SCPE_FMT; } for ( ;; ) { /* loop until JRST */ count = cksm = getrimw (fileref); /* get header */ - if (count == RIM_EOF) /* read err? */ + if (count == RIM_EOF) /* read err? */ return SCPE_FMT; if (TSTS (count)) { /* hdr = IOWD? */ for ( ; TSTS (count); count = AOB (count)) { @@ -229,29 +229,27 @@ for ( ;; ) { /* loop until JRST */ if (data == RIM_EOF) return SCPE_FMT; if (its_rim) { /* ITS RIM? */ - cksm = (((cksm << 1) | (cksm >> 35)) + data) & FMASK; + cksm = (((cksm << 1) | (cksm >> 35))) & FMASK; /* add to rotated cksm */ - pa = ((uint32) count) & RMASK; /* store */ + pa = ((uint32) count) & RMASK; /* store */ } else { /* RIM10B */ - cksm = (cksm + data) & FMASK; /* add to cksm */ - pa = ((uint32) count + 1) & RMASK; /* store */ + pa = ((uint32) count + 1) & RMASK; /* store */ } - cksm = cksm + data; /* add to cksm */ - pa = ((uint32) count + 1) & RMASK; /* store */ + cksm = (cksm + data) & FMASK; /* add to cksm */ M[pa] = data; } /* end for */ data = getrimw (fileref); /* get cksm */ if (data == RIM_EOF) return SCPE_FMT; - if ((cksm + data) & FMASK) /* test cksm */ + if (cksm != data) /* test cksm */ return SCPE_CSUM; } /* end if count */ else { op = GET_OP (count); /* not IOWD */ if (op != OP_JRST) /* JRST? */ return SCPE_FMT; - PC = (uint32) count & RMASK; /* set PC */ + PC = (uint32) count & RMASK; /* set PC */ break; } /* end else */ } /* end for */