mirror of
https://github.com/simh/simh.git
synced 2026-01-11 23:52:58 +00:00
SDS: Added C register implementation for various devices
This commit is contained in:
parent
4975fbe59c
commit
2dd8ededd3
@ -1,6 +1,6 @@
|
||||
/* sds_cpu.c: SDS 940 CPU simulator
|
||||
|
||||
Copyright (c) 2001-2017, Robert M. Supnik
|
||||
Copyright (c) 2001-2021, Robert M. Supnik
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
@ -26,6 +26,7 @@
|
||||
cpu central processor
|
||||
rtc real time clock
|
||||
|
||||
17-Feb-21 kenr Added C register implementation to support console
|
||||
07-Sep-17 RMS Fixed sim_eval declaration in history routine (COVERITY)
|
||||
09-Mar-17 RMS trap_P not set if mem mgt trap during fetch (COVERITY)
|
||||
28-Apr-07 RMS Removed clock initialization
|
||||
@ -38,6 +39,7 @@
|
||||
|
||||
A<0:23> A register
|
||||
B<0:23> B register
|
||||
C<0:23> C register
|
||||
X<0:23> X (index) register
|
||||
OV overflow indicator
|
||||
P<0:13> program counter
|
||||
@ -152,7 +154,7 @@
|
||||
typedef struct {
|
||||
uint32 typ;
|
||||
uint32 pc;
|
||||
uint32 ir;
|
||||
uint32 c;
|
||||
uint32 a;
|
||||
uint32 b;
|
||||
uint32 x;
|
||||
@ -160,7 +162,7 @@ typedef struct {
|
||||
} InstHistory;
|
||||
|
||||
uint32 M[MAXMEMSIZE] = { 0 }; /* memory */
|
||||
uint32 A, B, X; /* registers */
|
||||
uint32 A, B, C, X; /* registers */
|
||||
uint32 P; /* program counter */
|
||||
uint32 OV; /* overflow */
|
||||
uint32 xfr_req = 0; /* xfr req */
|
||||
@ -248,6 +250,7 @@ REG cpu_reg[] = {
|
||||
{ ORDATA (P, P, 14) },
|
||||
{ ORDATA (A, A, 24) },
|
||||
{ ORDATA (B, B, 24) },
|
||||
{ ORDATA (C, C, 24) },
|
||||
{ ORDATA (X, X, 24) },
|
||||
{ FLDATA (OV, OV, 0) },
|
||||
{ ORDATA (EM2, EM2, 3) },
|
||||
@ -411,6 +414,7 @@ while (reason == 0) { /* loop until halted */
|
||||
inst_hist (tinst, P, HIST_INT);
|
||||
if (pa != VEC_RTCP) { /* normal intr? */
|
||||
tr = one_inst (tinst, P, save_mode, &tmp); /* exec intr inst */
|
||||
Read (P, &C);
|
||||
if (tr) { /* stop code? */
|
||||
cpu_mode = save_mode; /* restore mode */
|
||||
reason = (tr > 0)? tr: STOP_MMINT;
|
||||
@ -464,11 +468,14 @@ while (reason == 0) { /* loop until halted */
|
||||
if (reason == SCPE_OK) { /* fetch ok? */
|
||||
ion_defer = 0; /* clear ion */
|
||||
if (hst_lnt)
|
||||
inst_hist (inst, save_P, HIST_XCT);
|
||||
reason = one_inst (inst, save_P, cpu_mode, &trap_P); /* exec inst */
|
||||
inst_hist (C, save_P, HIST_XCT);
|
||||
reason = one_inst (C, save_P, cpu_mode, &trap_P); /* exec inst */
|
||||
Read (P, &C);
|
||||
if (reason > 0) { /* stop code? */
|
||||
if (reason != STOP_HALT)
|
||||
if (reason != STOP_HALT) {
|
||||
P = save_P;
|
||||
Read (P, &C);
|
||||
}
|
||||
if (reason == STOP_IONRDY)
|
||||
reason = 0;
|
||||
}
|
||||
@ -496,6 +503,7 @@ while (reason == 0) { /* loop until halted */
|
||||
*/
|
||||
tr = one_inst (tinst, (reason == MM_NOACC)?
|
||||
trap_P: save_P, save_mode, &tmp); /* trap address */
|
||||
Read (P, &C);
|
||||
if (tr) { /* stop code? */
|
||||
cpu_mode = save_mode; /* restore mode */
|
||||
P = save_P; /* restore PC */
|
||||
@ -1511,6 +1519,13 @@ int_reqhi = api_findreq (); /* recalc intreq */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Post command routine */
|
||||
|
||||
void cpu_post_cmd (t_bool from_scp)
|
||||
{
|
||||
C = M[P];
|
||||
}
|
||||
|
||||
/* Reset routine */
|
||||
|
||||
t_stat cpu_reset (DEVICE *dptr)
|
||||
@ -1534,6 +1549,7 @@ else return SCPE_IERR;
|
||||
sim_brk_dflt = SWMASK ('E');
|
||||
sim_brk_types = SWMASK ('E') | SWMASK ('M') | SWMASK ('N') | SWMASK ('U');
|
||||
sim_vm_is_subroutine_call = cpu_is_pc_a_subroutine_call;
|
||||
sim_vm_post = cpu_post_cmd;
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
@ -1803,7 +1819,7 @@ return SCPE_OK;
|
||||
|
||||
/* Record history */
|
||||
|
||||
void inst_hist (uint32 ir, uint32 pc, uint32 tp)
|
||||
void inst_hist (uint32 c, uint32 pc, uint32 tp)
|
||||
{
|
||||
if (cpu_mode == hst_exclude)
|
||||
return;
|
||||
@ -1812,7 +1828,7 @@ if (hst_p >= hst_lnt)
|
||||
hst_p = 0;
|
||||
hst[hst_p].typ = tp | (OV << 4) | (cpu_mode << 5);
|
||||
hst[hst_p].pc = pc;
|
||||
hst[hst_p].ir = ir;
|
||||
hst[hst_p].c = c;
|
||||
hst[hst_p].a = A;
|
||||
hst[hst_p].b = B;
|
||||
hst[hst_p].x = X;
|
||||
@ -1881,7 +1897,7 @@ else lnt = hst_lnt;
|
||||
di = hst_p - lnt; /* work forward */
|
||||
if (di < 0)
|
||||
di = di + hst_lnt;
|
||||
fprintf (st, "CYC PC MD OV A B X EA IR\n\n");
|
||||
fprintf (st, "CYC PC MD OV A B X EA C\n\n");
|
||||
for (k = 0; k < lnt; k++) { /* print specified */
|
||||
h = &hst[(++di) % hst_lnt]; /* entry pointer */
|
||||
if (h->typ) { /* instruction? */
|
||||
@ -1891,9 +1907,9 @@ for (k = 0; k < lnt; k++) { /* print specified */
|
||||
if (h->ea & HIST_NOEA)
|
||||
fprintf (st, " ");
|
||||
else fprintf (st, "%05o ", h->ea);
|
||||
sim_eval[0] = h->ir;
|
||||
sim_eval[0] = h->c;
|
||||
if ((fprint_sym (st, h->pc, sim_eval, &cpu_unit, SWMASK ('M'))) > 0)
|
||||
fprintf (st, "(undefined) %08o", h->ir);
|
||||
fprintf (st, "(undefined) %08o", h->c);
|
||||
fputc ('\n', st); /* end line */
|
||||
} /* end else instruction */
|
||||
} /* end for */
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* sds_cr.c: SDS-930 card reader simulator
|
||||
|
||||
Copyright (c) 2020, Ken Rector
|
||||
Copyright (c) 2020-2021, Ken Rector
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
@ -23,8 +23,8 @@
|
||||
used in advertising or otherwise to promote the sale, use or other dealings
|
||||
in this Software without prior written authorization from Ken Rector.
|
||||
|
||||
03-Mar-20 kenr Initial Version
|
||||
|
||||
17-Feb-21 kenr Initial Version
|
||||
17-Feb-21 kenr Added C register support to CDR boot
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -353,7 +353,7 @@ t_stat cr_attach (UNIT *uptr, CONST char *cptr) {
|
||||
|
||||
/* Boot routine - simulate FILL console command */
|
||||
t_stat cr_boot (int32 unitno, DEVICE *dptr) {
|
||||
extern uint32 P, M[];
|
||||
extern uint32 P, C, M[];
|
||||
|
||||
cr_reset(dptr);
|
||||
M[0] = 077777771; /* -7B */
|
||||
@ -362,6 +362,7 @@ t_stat cr_boot (int32 unitno, DEVICE *dptr) {
|
||||
M[3] = 003200002; /* WIM 2 */
|
||||
M[4] = 000100002; /* BRU 2 */
|
||||
P = 1; /* start at 1 */
|
||||
C = M[1];
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* sds_mt.c: SDS 940 magnetic tape simulator
|
||||
|
||||
Copyright (c) 2001-2016, Robert M. Supnik
|
||||
Copyright (c) 2001-2021, Robert M. Supnik
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
@ -25,6 +25,7 @@
|
||||
|
||||
mt 7 track magnetic tape
|
||||
|
||||
03-Mar-21 kenr Added C register support to MT boot
|
||||
09-Oct-16 RMS Added precise gap erase
|
||||
19-Mar-12 RMS Fixed bug in scan function decode (Peter Schorn)
|
||||
16-Feb-06 RMS Added tape capacity checking
|
||||
@ -501,7 +502,7 @@ return sim_tape_detach (uptr);
|
||||
|
||||
t_stat mt_boot (int32 unitno, DEVICE *dptr)
|
||||
{
|
||||
extern uint32 P, M[];
|
||||
extern uint32 P, C, M[];
|
||||
|
||||
if (unitno) /* only unit 0 */
|
||||
return SCPE_ARG;
|
||||
@ -511,5 +512,6 @@ M[2] = 000203610; /* EOM 3610B */
|
||||
M[3] = 003200002; /* WIM 2 */
|
||||
M[4] = 000100002; /* BRU 2 */
|
||||
P = 1; /* start at 1 */
|
||||
C = M[1];
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* sds_rad.c: SDS 940 fixed head disk simulator
|
||||
|
||||
Copyright (c) 2001-2008, Robert M. Supnik
|
||||
Copyright (c) 2001-2021, Robert M. Supnik
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
@ -25,6 +25,8 @@
|
||||
|
||||
rad fixed head disk
|
||||
|
||||
17-Feb-21 kenr Added C register support to RAD boot
|
||||
|
||||
The fixed head disk is a head-per-track disk, with up to four disks. Each
|
||||
disk is divided into two logical units. Reads and writes cannot cross logical
|
||||
unit boundaries. The fixed head disk transfers 12b characters, rather than 6b
|
||||
@ -326,7 +328,7 @@ return SCPE_OK;
|
||||
|
||||
t_stat rad_boot (int32 unitno, DEVICE *dptr)
|
||||
{
|
||||
extern uint32 P, M[];
|
||||
extern uint32 P, C, M[];
|
||||
|
||||
if (unitno) /* only unit 0 */
|
||||
return SCPE_ARG;
|
||||
@ -338,5 +340,6 @@ M[2] = 000203226; /* EOM 3226B */
|
||||
M[3] = 003200002; /* WIM 2 */
|
||||
M[4] = 000100002; /* BRU 2 */
|
||||
P = 1; /* start at 1 */
|
||||
C = M[1];
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* sds_stddev.c: SDS 940 standard devices
|
||||
|
||||
Copyright (c) 2001-2020, Robert M. Supnik
|
||||
Copyright (c) 2001-2021, Robert M. Supnik
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
@ -28,6 +28,7 @@
|
||||
tti keyboard
|
||||
tto teleprinter
|
||||
|
||||
12-Feb-21 kenr Added C register support to PTR boot
|
||||
23-Oct-20 RMS TTO recognizes no leader flag (Ken Rector)
|
||||
29-Dec-03 RMS Added console backpressure support
|
||||
25-Apr-03 RMS Revised for extended file support
|
||||
@ -327,7 +328,7 @@ return SCPE_OK;
|
||||
|
||||
t_stat ptr_boot (int32 unitno, DEVICE *dptr)
|
||||
{
|
||||
extern uint32 P, M[];
|
||||
extern uint32 P, C, M[];
|
||||
|
||||
M[0] = 077777771; /* -7B */
|
||||
M[1] = 007100000; /* LDX 0 */
|
||||
@ -335,6 +336,7 @@ M[2] = 000203604; /* EOM 3604B */
|
||||
M[3] = 003200002; /* WIM 2 */
|
||||
M[4] = 000100002; /* BRU 2 */
|
||||
P = 1; /* start at 1 */
|
||||
C = M[1];
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
/* sds_sys.c: SDS 940 simulator interface
|
||||
|
||||
Copyright (c) 2001-2020, Robert M Supnik
|
||||
Copyright (c) 2001-2021, Robert M Supnik
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
@ -23,11 +23,12 @@
|
||||
used in advertising or otherwise to promote the sale, use or other dealings
|
||||
in this Software without prior written authorization from Robert M Supnik.
|
||||
|
||||
12-Feb-21 kenr Added C register support to loader
|
||||
01-Nov-20 RMS Fixed sds930-to-ascii entry 060 (Ken Rector)
|
||||
05-May-16 RMS Fixed ascii-to-sds940 data (Mark Pizzolato)
|
||||
19-Mar-12 RMS Fixed declarations of CCT arrays (Mark Pizzolato)
|
||||
*/
|
||||
|
||||
|
||||
#include "sds_defs.h"
|
||||
#include <ctype.h>
|
||||
#define FMTASC(x) ((x) < 040)? "<%03o>": "%c", (x)
|
||||
@ -261,7 +262,7 @@ t_stat sim_load (FILE *fileref, CONST char *cptr, CONST char *fnam, int flag)
|
||||
{
|
||||
int32 i, wd, buf[8];
|
||||
int32 ldr = 1;
|
||||
extern uint32 P;
|
||||
extern uint32 P, C;
|
||||
|
||||
if ((*cptr != 0) || (flag != 0))
|
||||
return SCPE_ARG;
|
||||
@ -283,6 +284,7 @@ for (i = 0; i < 8; i++) /* copy boot */
|
||||
M[i + 2] = buf[i];
|
||||
if (I_GETOP (buf[6]) == BRU)
|
||||
P = buf[6] & VA_MASK;
|
||||
C = M[P];
|
||||
for (i = (buf[3]+buf[7]) & VA_MASK; i <= VA_MASK; i++) {/* load data */
|
||||
if ((wd = get_word (fileref, &ldr)) < 0)
|
||||
return SCPE_OK;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user