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:
parent
387ae9aa53
commit
49b580a727
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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 */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user