sigma: New simulator (from beta)
This commit is contained in:
parent
e3cdbed45f
commit
54516bb175
11 changed files with 39 additions and 41 deletions
BIN
doc/sigma_doc.doc
Normal file
BIN
doc/sigma_doc.doc
Normal file
Binary file not shown.
|
@ -1,6 +1,6 @@
|
|||
/* sigma_cis.c: Sigma decimal instructions
|
||||
|
||||
Copyright (c) 2007-2008, Robert M Supnik
|
||||
Copyright (c) 2007-2018, 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,8 @@
|
|||
Questions:
|
||||
|
||||
1. On the Sigma 9, in ASCII mode, is an ASCII blank used in EBS?
|
||||
|
||||
02-Jun-2018 RMS Fixed unsigned < 0 in decimal compare (Mark Pizzolato)
|
||||
*/
|
||||
|
||||
#include "sigma_defs.h"
|
||||
|
@ -100,7 +102,7 @@ uint32 cis_dec (uint32 op, uint32 lnt, uint32 bva)
|
|||
{
|
||||
dstr_t src1, src2, src2x, dst;
|
||||
uint32 i, t, kint, ldivr, ldivd, ad, c, d, end;
|
||||
int32 sc;
|
||||
int32 sc, scmp;
|
||||
uint32 tr;
|
||||
|
||||
if (lnt == 0) /* adjust length */
|
||||
|
@ -163,10 +165,10 @@ switch (op) { /* case on opcode */
|
|||
if (src1.sign ^ src2.sign) /* signs differ? */
|
||||
CC = src1.sign? CC4: CC3; /* set < or > */
|
||||
else { /* same signs */
|
||||
int32 t = CmpDstr (&src1, &src2); /* compare strings */
|
||||
if (t < 0)
|
||||
scmp = CmpDstr (&src1, &src2); /* compare strings */
|
||||
if (scmp < 0)
|
||||
CC = (src1.sign? CC3: CC4);
|
||||
else if (t > 0)
|
||||
else if (scmp > 0)
|
||||
CC = (src1.sign? CC4: CC3);
|
||||
else CC = 0;
|
||||
}
|
||||
|
@ -720,11 +722,11 @@ return cy;
|
|||
void SubDstr (dstr_t *s1, dstr_t *s2, dstr_t *ds)
|
||||
{
|
||||
uint32 i;
|
||||
dstr_t Compl;
|
||||
dstr_t complm;
|
||||
|
||||
for (i = 0; i < DSTRLNT; i++) /* 9's comp s2 */
|
||||
Compl.val[i] = 0x99999999 - s1->val[i];
|
||||
AddDstr (&Compl, s2, ds, 1); /* s1 + ~s2 + 1 */
|
||||
complm.val[i] = 0x99999999 - s1->val[i];
|
||||
AddDstr (&complm, s2, ds, 1); /* s1 + ~s2 + 1 */
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -248,7 +248,7 @@ extern uint32 io_tio (uint32 rn, uint32 bva);
|
|||
extern uint32 io_tdv (uint32 rn, uint32 bva);
|
||||
extern uint32 io_hio (uint32 rn, uint32 bva);
|
||||
extern uint32 io_aio (uint32 rn, uint32 bva);
|
||||
extern t_stat int_reset (DEVICE *dev);
|
||||
extern uint32 int_reset (DEVICE *dev);
|
||||
extern void io_set_eimax (uint32 lnt);
|
||||
extern void io_sclr_req (uint32 inum, uint32 val);
|
||||
extern void io_sclr_arm (uint32 inum, uint32 val);
|
||||
|
@ -476,7 +476,6 @@ while (reason == 0) { /* loop until stop */
|
|||
if (sim_brk_summ &&
|
||||
sim_brk_test (PC, SWMASK ('E'))) { /* breakpoint? */
|
||||
reason = STOP_IBKPT; /* stop simulation */
|
||||
sim_interval++; /* don't count non-executed instruction */
|
||||
break;
|
||||
}
|
||||
if (PSW_QRX9 && (PC & PSW1_XA)) /* S9 real ext && ext? */
|
||||
|
@ -1124,7 +1123,7 @@ switch (op) {
|
|||
res = R[rn] | opnd;
|
||||
CC34_W (res); /* set CC's */
|
||||
R[rn] = res; /* store */
|
||||
break;
|
||||
break;
|
||||
|
||||
case OP_EOR: /* xor */
|
||||
if ((tr = Ea (IR, &bva, VR, WD)) != 0) /* get eff addr */
|
||||
|
@ -1134,7 +1133,7 @@ switch (op) {
|
|||
res = R[rn] ^ opnd;
|
||||
CC34_W (res); /* set CC's */
|
||||
R[rn] = res; /* store */
|
||||
break;
|
||||
break;
|
||||
|
||||
/* Compares */
|
||||
|
||||
|
@ -2705,7 +2704,7 @@ return SCPE_OK;
|
|||
t_stat cpu_show_addr (FILE *of, UNIT *uptr, int32 val, CONST void *desc)
|
||||
{
|
||||
t_stat r;
|
||||
CONST char *cptr = (CONST char *) desc;
|
||||
char *cptr = (char *) desc;
|
||||
uint32 ad, bpa, dlnt, virt;
|
||||
static const char *lnt_str[] = {
|
||||
"byte",
|
||||
|
@ -2825,7 +2824,7 @@ t_stat cpu_show_hist (FILE *st, UNIT *uptr, int32 val, CONST void *desc)
|
|||
{
|
||||
int32 k, di, lnt;
|
||||
t_stat r;
|
||||
CONST char *cptr = (CONST char *) desc;
|
||||
char *cptr = (char *) desc;
|
||||
InstHistory *h;
|
||||
|
||||
if (hst_lnt == 0) /* enabled? */
|
||||
|
|
|
@ -34,10 +34,6 @@
|
|||
|
||||
#include "sim_defs.h" /* simulator defns */
|
||||
|
||||
/* Rename of global PC variable to avoid namespace conflicts on some platforms */
|
||||
|
||||
#define PC PC_Global
|
||||
|
||||
#if defined(USE_INT64) || defined(USE_ADDR64)
|
||||
#error "Sigma 32b does not support 64b values!"
|
||||
#endif
|
||||
|
|
Binary file not shown.
|
@ -261,7 +261,7 @@ typedef struct {
|
|||
uint32 tpos; /* to position */
|
||||
} DP_SNSTAB;
|
||||
|
||||
static char *dp_cname[] = {
|
||||
static const char *dp_cname[] = {
|
||||
"7240", "7270", "7260", "7275", "7265", "T3281"
|
||||
};
|
||||
|
||||
|
@ -1113,7 +1113,7 @@ t_stat dp_ioerr (UNIT *uptr)
|
|||
uint32 cidx = uptr->UCTX;
|
||||
uint32 dva = dp_dib[cidx].dva;
|
||||
|
||||
sim_perror ("DP I/O error");
|
||||
perror ("DP I/O error");
|
||||
clearerr (uptr->fileref);
|
||||
dp_ctx[cidx].dp_flags |= DPF_DPE; /* set DPE flag */
|
||||
chan_set_chf (dva, CHF_XMDE);
|
||||
|
|
|
@ -356,7 +356,7 @@ if (skp && CHP (CH_TOF, lp_cct[lp_cctp])) /* skip, TOF? */
|
|||
}
|
||||
uptr->pos = ftell (uptr->fileref); /* update position */
|
||||
if (ferror (uptr->fileref)) { /* error? */
|
||||
sim_perror ("Line printer I/O error");
|
||||
perror ("Line printer I/O error");
|
||||
clearerr (uptr->fileref);
|
||||
chan_set_chf (lp_dib.dva, CHF_XMDE);
|
||||
return SCPE_IOERR;
|
||||
|
@ -391,7 +391,7 @@ if ((lp_model == LP_7440) || lp_pass) { /* ready to print? */
|
|||
fputc (lp_inh? '\r': '\n', uptr->fileref); /* cr or nl */
|
||||
uptr->pos = ftell (uptr->fileref); /* update position */
|
||||
if (ferror (uptr->fileref)) { /* error? */
|
||||
sim_perror ("Line printer I/O error");
|
||||
perror ("Line printer I/O error");
|
||||
clearerr (uptr->fileref);
|
||||
chan_set_chf (lp_dib.dva, CHF_XMDE);
|
||||
return SCPE_IOERR;
|
||||
|
|
|
@ -529,8 +529,7 @@ if (QCPU_S89)
|
|||
((R[rn] & S89_SR1_MARG) >> S89_SR1_MAROFF);
|
||||
break;
|
||||
case 0xB: /* read sr0, clr */
|
||||
mem_sr0[memu] = mem_sr1[memu] = 0;
|
||||
/* fall through */
|
||||
mem_sr0[memu] = mem_sr1[memu] = 0; /* fall through */
|
||||
case 0x8: /* read sr0 */
|
||||
R[rn] = (wd & S89_SR0_RD) |
|
||||
(((1u << (chan_num + 1)) - 1) << (S89_SR0_V_PORTS - (chan_num + 1)));
|
||||
|
@ -559,8 +558,7 @@ else switch (CC) { /* 5X0 */
|
|||
mmc_wlk[ppag | 1] = R[rn] & 0xF;
|
||||
break;
|
||||
case 0xC: /* read sr0, clr */
|
||||
mem_sr0[memu] = 0; /* clr */
|
||||
/* fall through */
|
||||
mem_sr0[memu] = 0; /* clr, fall through */
|
||||
case 0x8: /* read sr0 */
|
||||
R[rn] = S5X0_SR0_FIXED | (wd & S5X0_SR0_RD) |
|
||||
(((1u << (chan_num + 1)) - 1) << (S5X0_SR0_V_PORTS - (chan_num + 1)));
|
||||
|
|
|
@ -477,8 +477,7 @@ switch (st) {
|
|||
case MTSE_FMT: /* illegal fmt */
|
||||
case MTSE_UNATT: /* not attached */
|
||||
case MTSE_WRP: /* write protect */
|
||||
chan_set_chf (mt_dib.dva, CHF_XMME); /* set err */
|
||||
/* fall through */
|
||||
chan_set_chf (mt_dib.dva, CHF_XMME); /* set err, fall through */
|
||||
case MTSE_OK: /* no error */
|
||||
chan_uen (mt_dib.dva); /* uend */
|
||||
return SCPE_IERR;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* sigma_pt.c: Sigma 7060 paper tape reader/punch
|
||||
|
||||
Copyright (c) 2007-2008, Robert M. Supnik
|
||||
Copyright (c) 2007-2018, 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"),
|
||||
|
@ -24,6 +24,8 @@
|
|||
in this Software without prior written authorization from Robert M Supnik.
|
||||
|
||||
pt 7060 paper-tape reader/punch
|
||||
|
||||
02-Jun-2018 RMS Defanged clang signed/unsigned whining (Mark Pizzolato)
|
||||
*/
|
||||
|
||||
#include "sigma_io_defs.h"
|
||||
|
@ -158,7 +160,7 @@ return 0;
|
|||
t_stat pt_svc (UNIT *uptr)
|
||||
{
|
||||
int32 c;
|
||||
uint32 cmd;
|
||||
uint32 uc, cmd;
|
||||
uint32 st;
|
||||
|
||||
switch (pt_cmd) { /* case on state */
|
||||
|
@ -186,7 +188,7 @@ switch (pt_cmd) { /* case on state */
|
|||
break;
|
||||
}
|
||||
else { /* real error */
|
||||
sim_perror ("PTR I/O error");
|
||||
perror ("PTR I/O error");
|
||||
clearerr (uptr->fileref);
|
||||
chan_set_chf (pt_dib.dva, CHF_XMDE); /* data error */
|
||||
return pt_chan_err (SCPE_IOERR); /* force uend */
|
||||
|
@ -196,7 +198,7 @@ switch (pt_cmd) { /* case on state */
|
|||
if (c != 0) /* leader done? */
|
||||
ptr_nzc = 1; /* set flag */
|
||||
if ((pt_cmd == PTS_READI) || ptr_nzc) {
|
||||
st = chan_WrMemB (pt_dib.dva, c); /* write to memory */
|
||||
st = chan_WrMemB (pt_dib.dva, ((uint32) c));/* write to memory */
|
||||
if (CHS_IFERR (st)) /* channel error? */
|
||||
return pt_chan_err (st);
|
||||
if (st == CHS_ZBC) /* bc == 0? */
|
||||
|
@ -208,11 +210,11 @@ switch (pt_cmd) { /* case on state */
|
|||
sim_activate (uptr, pt_unit[PTP].wait); /* continue thread */
|
||||
if ((pt_unit[PTP].flags & UNIT_ATT) == 0) /* not attached? */
|
||||
return ptp_stopioe? SCPE_UNATT: SCPE_OK;
|
||||
st = chan_RdMemB (pt_dib.dva, (uint32 *)&c); /* read from channel */
|
||||
st = chan_RdMemB (pt_dib.dva, &uc); /* read from channel */
|
||||
if (CHS_IFERR (st)) /* channel error? */
|
||||
return pt_chan_err (st);
|
||||
if (putc (c, pt_unit[PTP].fileref) == EOF) {
|
||||
sim_perror ("PTP I/O error");
|
||||
if (putc (((int32) uc), pt_unit[PTP].fileref) == EOF) {
|
||||
perror ("PTP I/O error");
|
||||
clearerr (pt_unit[PTP].fileref);
|
||||
chan_set_chf (pt_dib.dva, CHF_XMDE); /* data error */
|
||||
return pt_chan_err (SCPE_IOERR); /* force uend */
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* sigma_tt.c: Sigma 7012 console teletype
|
||||
|
||||
Copyright (c) 2007-2008, Robert M. Supnik
|
||||
Copyright (c) 2007-2018, 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"),
|
||||
|
@ -30,6 +30,8 @@
|
|||
CR input, mapped to NEWLINE and echoes CR-LF
|
||||
^H input, mapped to EOM and not echoed
|
||||
HT input or output, simulates tabbing with fixed 8 character stops
|
||||
|
||||
02-Jun-2018 RMS Defanged clang signed/unsigned whining (Mark Pizzolato)
|
||||
*/
|
||||
|
||||
#include "sigma_io_defs.h"
|
||||
|
@ -214,8 +216,8 @@ return SCPE_OK;
|
|||
|
||||
t_stat tto_svc (UNIT *uptr)
|
||||
{
|
||||
uint32 c, cmd;
|
||||
uint32 st;
|
||||
int32 c;
|
||||
uint32 uc, cmd, st;
|
||||
|
||||
switch (tt_cmd) { /* case on state */
|
||||
|
||||
|
@ -231,10 +233,10 @@ switch (tt_cmd) { /* case on state */
|
|||
break;
|
||||
|
||||
case TTS_WRITE: /* char output */
|
||||
st = chan_RdMemB (tt_dib.dva, &c); /* get char */
|
||||
st = chan_RdMemB (tt_dib.dva, &uc); /* get char */
|
||||
if (CHS_IFERR (st)) /* channel error? */
|
||||
return tt_chan_err (st);
|
||||
c = ebcdic_to_ascii[c & 0xFF]; /* convert to ASCII */
|
||||
c = ebcdic_to_ascii[uc & 0xFF]; /* convert to ASCII */
|
||||
tto_echo (c); /* echo character */
|
||||
sim_activate (uptr, uptr->wait); /* continue thread */
|
||||
if (st == CHS_ZBC) /* st = zbc? */
|
||||
|
|
Loading…
Add table
Reference in a new issue