1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-01-22 02:25:05 +00:00

KA10: Fixed PTR to boot correctly, Fixed Rim Loader.

Fixed PTR to boot correctly. RIM appears to leave device running.
   Fixed MTA to read in a ITS tape.
   Fixed load of RIM10 file to be correct.
This commit is contained in:
Richard Cornwell 2017-02-01 22:46:16 -05:00
parent 387ae9aa53
commit 49b580a727
3 changed files with 53 additions and 43 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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 */