1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-01-22 10:31:12 +00:00

KA10: Fixed single step. Added boot to Papertape. Fixed RIM Loader.

This commit is contained in:
Richard Cornwell 2017-01-30 20:45:10 -05:00
parent e1108eeb24
commit 387ae9aa53
3 changed files with 89 additions and 14 deletions

View File

@ -1341,8 +1341,14 @@ int sac_inh; /* Inihibit saving AC after instruction */
int f; /* Temporary variables */
int flag1;
int flag3;
int instr_count = 0; /* Number of instructions to execute */
uint32 IA;
if (sim_step != 0) {
instr_count = sim_step;
sim_cancel_step();
}
/* Build device table */
if ((reason = build_dev_tab ()) != SCPE_OK) /* build, chk dib_tab */
return reason;
@ -1365,8 +1371,7 @@ if ((reason = build_dev_tab ()) != SCPE_OK) /* build, chk dib_tab */
while ( reason == 0) { /* loop until ABORT */
if (sim_interval <= 0) { /* check clock queue */
if ((reason = sim_process_event()) != SCPE_OK) {/* error? stop sim */
if (reason != SCPE_STEP || !BYF5)
return reason;
return reason;
}
}
@ -1450,8 +1455,7 @@ no_fetch:
/* Handle events during a indirect loop */
if (sim_interval-- <= 0) {
if ((reason = sim_process_event()) != SCPE_OK) {
if (reason != SCPE_STEP || !BYF5)
return reason;
return reason;
}
}
} while (ind & !pi_rq);
@ -3806,6 +3810,8 @@ last:
pi_restore = 0;
}
sim_interval--;
if (!pi_cycle && instr_count != 0 && --instr_count == 0)
return SCPE_STEP;
}
/* Should never get here */

View File

@ -57,6 +57,7 @@ const char *ptp_description (DEVICE *dptr);
t_stat ptr_devio(uint32 dev, uint64 *data);
t_stat ptr_svc (UNIT *uptr);
t_stat ptr_boot(int32 unit_num, DEVICE * dptr);
t_stat ptr_reset (DEVICE *dptr);
t_stat ptr_attach (UNIT *uptr, CONST char *cptr);
t_stat ptr_detach (UNIT *uptr);
@ -84,8 +85,7 @@ MTAB ptp_mod[] = {
DEVICE ptp_dev = {
"PTP", &ptp_unit, ptp_reg, ptp_mod,
1, 10, 31, 1, 8, 8,
NULL, NULL, &ptp_reset,
NULL, &ptp_attach, &ptp_detach,
NULL, NULL, &ptp_reset, NULL, &ptp_attach, &ptp_detach,
&ptp_dib, DEV_DISABLE | DEV_DEBUG, 0, dev_debug,
NULL, NULL, &ptp_help, NULL, NULL, &ptp_description
};
@ -109,8 +109,7 @@ MTAB ptr_mod[] = {
DEVICE ptr_dev = {
"PTR", &ptr_unit, ptr_reg, ptr_mod,
1, 10, 31, 1, 8, 8,
NULL, NULL, &ptr_reset,
NULL, &ptr_attach, &ptr_detach,
NULL, NULL, &ptr_reset, &ptr_boot, &ptr_attach, &ptr_detach,
&ptr_dib, DEV_DISABLE | DEV_DEBUG, 0, dev_debug,
NULL, NULL, &ptr_help, NULL, NULL, &ptr_description
};
@ -267,12 +266,12 @@ t_stat ptr_svc (UNIT *uptr)
uptr->STATUS |= DONE_FLG;
set_interrupt(PR_DEVNUM, uptr->STATUS);
if ((ptr_unit.flags & UNIT_ATT) == 0) /* attached? */
if ((uptr->flags & UNIT_ATT) == 0) /* attached? */
return SCPE_UNATT;
word = 0;
while (count > 0) {
if ((temp = getc (ptr_unit.fileref)) == EOF) {
if (feof (ptr_unit.fileref)) {
if ((temp = getc (uptr->fileref)) == EOF) {
if (feof (uptr->fileref)) {
uptr->STATUS &= ~TAPE_PR;
break;
}
@ -293,6 +292,50 @@ t_stat ptr_svc (UNIT *uptr)
return SCPE_OK;
}
uint64
ptr_read_word(UNIT *uptr) {
int i, ch;
uint64 word;
for(i = 0; i <= 6;) {
if ((ch = getc (uptr->fileref)) == EOF) {
if (ch & 0200) {
word <<= 6;
word |= (uint64)(ch & 077);
i++;
}
}
}
return word;
}
/* Boot from given device */
t_stat
ptr_boot(int32 unit_num, DEVICE * dptr)
{
UNIT *uptr = &dptr->units[unit_num];
uint64 word;
int wc, addr;
if ((uptr->flags & UNIT_ATT) == 0)
return SCPE_UNATT; /* attached? */
word = ptr_read_word(uptr);
wc = (word >> 18) & RMASK;
addr = word & RMASK;
while (wc != 0) {
wc = (wc + 1) & RMASK;
addr = (addr + 1) & RMASK;
word = ptr_read_word(uptr);
if (addr < 020)
FM[addr] = word;
else
M[addr] = word;
}
PC = addr;
return SCPE_OK;
}
/* Reset routine */

View File

@ -198,9 +198,26 @@ return word;
#define AOB(x) FMASK & ((x) + 01000001LL)
t_stat load_rim (FILE *fileref)
{
uint64 count, cksm, data;
uint32 pa;
int32 op;
uint64 count, cksm, data;
t_bool its_rim;
uint32 pa;
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 */
if (ldrc == 016) /* 16? RIM10B */
its_rim = FALSE;
else if (ldrc == 017) /* 17? ITS RIM */
its_rim = TRUE;
else SCPE_FMT; /* unknown */
for (i = 0; i < ldrc; i++) { /* skip the loader */
data = getrimw (fileref);
if (data < 0)
return SCPE_FMT;
}
for ( ;; ) { /* loop until JRST */
count = cksm = getrimw (fileref); /* get header */
@ -211,6 +228,15 @@ for ( ;; ) { /* loop until JRST */
data = getrimw (fileref); /* get data wd */
if (data == RIM_EOF)
return SCPE_FMT;
if (its_rim) { /* ITS RIM? */
cksm = (((cksm << 1) | (cksm >> 35)) + data) & FMASK;
/* add to rotated cksm */
pa = ((uint32) count) & RMASK; /* store */
}
else { /* RIM10B */
cksm = (cksm + data) & FMASK; /* add to cksm */
pa = ((uint32) count + 1) & RMASK; /* store */
}
cksm = cksm + data; /* add to cksm */
pa = ((uint32) count + 1) & RMASK; /* store */
M[pa] = data;