sigma: Update latest from Bob Supnik's v3.12-5

- Add new CP and CR devices
- COC: Zero delay from SIO to INIT state Detect and UEN on 0xFF order
- COC: Moved SIO int pending test to devices
- DK: Zero delay from SIO to INIT state
- DP: Added case points for RDEES, dp_aio_status
- DP: Zero delay from SIO to INIT state
 - defs:  Added chaining modifier flag
 - defs:  Fixed DVT_NODEV definition
 - defs:  Added chan_chk_dvi definition
 - io: Added chaining modifier flag
- LP: Zero delay from SIO to INIT state
- LP: Added INIT test for illegal command
- LP: Moved SIO interrupt test to devices
- MT: Zero delay from SIO to INIT state
- PT: Zero delay from SIO to INIT state
- PT: Moved SIO interrupt test to devices
- RAD: Zero delay from SIO to INIT state
- RAD: Fixed nx unit test
- RAD: Fixed write protect test
- TT: Zero delay from SIO to INIT state
- TT: Moved SIO int pending test to devices
This commit is contained in:
Ken Rector 2024-07-29 10:12:00 -10:00 committed by Paul Koning
parent 9ef8bf57b4
commit 36605c4950
19 changed files with 958 additions and 46 deletions

View file

@ -205,10 +205,18 @@
RelativePath="..\sigma\sigma_coc.c" RelativePath="..\sigma\sigma_coc.c"
> >
</File> </File>
<File
RelativePath="..\sigma\sigma_cp.c"
>
</File>
<File <File
RelativePath="..\sigma\sigma_cpu.c" RelativePath="..\sigma\sigma_cpu.c"
> >
</File> </File>
<File
RelativePath="..\sigma\sigma_cr.c"
>
</File>
<File <File
RelativePath="..\sigma\sigma_dk.c" RelativePath="..\sigma\sigma_dk.c"
> >

View file

@ -240,7 +240,9 @@
<ClCompile Include="..\scp.c" /> <ClCompile Include="..\scp.c" />
<ClCompile Include="..\sigma\sigma_cis.c" /> <ClCompile Include="..\sigma\sigma_cis.c" />
<ClCompile Include="..\sigma\sigma_coc.c" /> <ClCompile Include="..\sigma\sigma_coc.c" />
<ClCompile Include="..\sigma\sigma_cp.c" />
<ClCompile Include="..\sigma\sigma_cpu.c" /> <ClCompile Include="..\sigma\sigma_cpu.c" />
<ClCompile Include="..\sigma\sigma_cr.c" />
<ClCompile Include="..\sigma\sigma_dk.c" /> <ClCompile Include="..\sigma\sigma_dk.c" />
<ClCompile Include="..\sigma\sigma_dp.c" /> <ClCompile Include="..\sigma\sigma_dp.c" />
<ClCompile Include="..\sigma\sigma_fp.c" /> <ClCompile Include="..\sigma\sigma_fp.c" />

View file

@ -2147,7 +2147,8 @@ SIGMA = ${SIGMAD}/sigma_cpu.c ${SIGMAD}/sigma_sys.c ${SIGMAD}/sigma_cis.c \
${SIGMAD}/sigma_coc.c ${SIGMAD}/sigma_dk.c ${SIGMAD}/sigma_dp.c \ ${SIGMAD}/sigma_coc.c ${SIGMAD}/sigma_dk.c ${SIGMAD}/sigma_dp.c \
${SIGMAD}/sigma_fp.c ${SIGMAD}/sigma_io.c ${SIGMAD}/sigma_lp.c \ ${SIGMAD}/sigma_fp.c ${SIGMAD}/sigma_io.c ${SIGMAD}/sigma_lp.c \
${SIGMAD}/sigma_map.c ${SIGMAD}/sigma_mt.c ${SIGMAD}/sigma_pt.c \ ${SIGMAD}/sigma_map.c ${SIGMAD}/sigma_mt.c ${SIGMAD}/sigma_pt.c \
${SIGMAD}/sigma_rad.c ${SIGMAD}/sigma_rtc.c ${SIGMAD}/sigma_tt.c ${SIGMAD}/sigma_rad.c ${SIGMAD}/sigma_rtc.c ${SIGMAD}/sigma_tt.c \
${SIGMAD}/sigma_cr.c ${SIGMAD}/sigma_cp.c
SIGMA_OPT = -I ${SIGMAD} SIGMA_OPT = -I ${SIGMAD}
SEL32D = ${SIMHD}/SEL32 SEL32D = ${SIMHD}/SEL32

View file

@ -31,6 +31,8 @@ add_simulator(sigma
sigma_rad.c sigma_rad.c
sigma_rtc.c sigma_rtc.c
sigma_tt.c sigma_tt.c
sigma_cp.c
sigma_cr.c
INCLUDES INCLUDES
${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
LABEL sigma LABEL sigma

View file

@ -114,36 +114,32 @@
108. DP: TIO status routine always returns DVS_AUTO instead of proper status. 108. DP: TIO status routine always returns DVS_AUTO instead of proper status.
109. DP: DP_SEEK definition is off by 1. 109. DP: DP_SEEK definition is off by 1.
110. DP: reset does not properly initialize controller, seek threads. 110. DP: reset does not properly initialize controller, seek threads.
111. DP: device address must include unit identifier everywhere, for interrupt generation. 111. DP, DK, MT, RAD: device address must include unit identifier everywhere, for interrupt generation.
112. DK: device address must include unit identifier everywhere, for interrupt generation. 112. MT: error handling not consistent.
113. MT: device address must include unit identifier everywhere, for interrupt generation. 113: IO: dangling else in write direct mode 1 code causes incorrect behavior.
114: RAD: device address must include unit identifier everywhere, for interrupt generation. 114: CPU: sim_interval is decremented before breakpoint test, which is incorrect.
115. MT: error handling not consistent. 115. MT: revised error handling failed to set tape mark status on space file forward/reverse.
116: IO: dangling else in write direct mode 1 code causes incorrect behavior. 116. IO: UEND flag in the wrong bit position in status word.
117: CPU: sim_interval is decremented before breakpoint test, which is incorrect. 117. DP: SEEK(I), RECAL(I) must be coded as fast operations.
118. MT: revised error handling failed to set tape mark status on space file forward/reverse. 118. COC: Transmit long space is 0x6, and stop transmit is 0xE.
119. IO: UEND flag in the wrong bit position in status word. 119. COC: Received break generates a data-in channel transaction with a flag bit set
120. DP: SEEK(I), RECAL(I) must be coded as fast operations.
121. COC: Transmit long space is 0x6, and stop transmit is 0xE.
122. COC: Received break generates a data-in channel transaction with a flag bit set
in the line number. in the line number.
123. DP: dp_inv_adr error must set a TDV visible flag (i.e., PGE) before UEND. 120. DP: dp_inv_adr error must set a TDV visible flag (i.e., PGE) before UEND.
124. IO, all devices: moved SIO reject-on-interrupt test to devices. 121. IO, all devices: moved SIO reject-on-interrupt test to devices.
125. DP: SIO will knock down pending device interrupts and allow operation to proceed. 122. DP: SIO will knock down pending device interrupts and allow operation to proceed.
126. MT: AIO must mask unit number before calling TDV status. 123. MT: AIO must mask unit number before calling TDV status.
127. IO: location 20/21 set incorrectly in the even, non-zero register case. 124. IO: location 20/21 set incorrectly in the even, non-zero register case.
128. CPU: WAIT must be implemented for correct operation of CP-V. 125. CPU: WAIT must be implemented for correct operation of CP-V.
129. DP: On 10 byte models, SENSE length errors can't happen. On 16 byte models, 126. DP: On 10 byte models, SENSE length errors can't happen. On 16 byte models,
SENSE length errors only occur if length == 0 || length > 16. SENSE length errors only occur if length == 0 || length > 16.
130. IO: DVT_NOTDEV macro incorrect. 127. IO: DVT_NOTDEV macro incorrect.
131. DP: Test for non-existent device returns wrong status. 128. DP, DK, MT, RAD: Test for non-existent device returns wrong status.
132. DK: Test for non-existent device returns wrong status. 129. DP, DK, MT: TIO status should return non-operational for unattached device.
133. MT: Test for non-existent device returns wrong status. 130. IO: Device mapping algorithm creates false dispatch points.
134. RAD: Test for non-existent device returns wrong status. 131. All devices: dispatch time to INIT state must be 0.
135. DP: TIO status should return non-operational for unattached device. 132. LPT: device must flag illegal commands in IDLE state.
136. DK: TIO status should return non-operational for unattached device. 133. COC: must flag 0xFF as illegal command in IDLE state.
137. NT: TIO status should return non-operational for unattached device. 134. IO: multiplexor channel implements a "chain modifier" capability, needed by punch.
138. IO: Device mapping algorithm creates false dispatch points.
Diagnostic Notes Diagnostic Notes
---------------- ----------------

View file

@ -1,6 +1,6 @@
/* sigma_coc.c: Sigma character-oriented communications subsystem simulator /* sigma_coc.c: Sigma character-oriented communications subsystem simulator
Copyright (c) 2007-2022, Robert M Supnik Copyright (c) 2007-2024, Robert M Supnik
Permission is hereby granted, free of charge, to any person obtaining a Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"), copy of this software and associated documentation files (the "Software"),
@ -25,6 +25,9 @@
coc 7611 communications multiplexor coc 7611 communications multiplexor
17-Feb-24 RMS Zero delay from SIO to INIT state (Ken Rector)
Detect and UEN on 0xFF order
15-Dec-22 RMS Moved SIO int pending test to devices
24-Aug-22 RMS Transmit long space is 0x6, not 0xD (Ken Rector) 24-Aug-22 RMS Transmit long space is 0x6, not 0xD (Ken Rector)
Added LNORDER modifier Added LNORDER modifier
*/ */
@ -281,7 +284,7 @@ switch (op) { /* case on op */
*dvst |= (CC2 << DVT_V_CC); /* SIO fails */ *dvst |= (CC2 << DVT_V_CC); /* SIO fails */
else if ((*dvst & DVS_CST) == 0) { /* ctrl idle? */ else if ((*dvst & DVS_CST) == 0) { /* ctrl idle? */
muxc_cmd = MUXC_INIT; /* start dev thread */ muxc_cmd = MUXC_INIT; /* start dev thread */
sim_activate (&mux_unit[MUXC], chan_ctl_time); sim_activate (&mux_unit[MUXC], 0);
} }
break; break;
@ -405,7 +408,11 @@ else { /* receive */
return 0; return 0;
} }
/* Unit service - channel overhead */ /* Unit service - channel overhead
The documentation says that the channel command is thrown away,
but the system exerciser requires a UEN on command 0xFF.
*/
t_stat muxc_svc (UNIT *uptr) t_stat muxc_svc (UNIT *uptr)
{ {
@ -417,6 +424,10 @@ if (muxc_cmd == MUXC_INIT) { /* init state? */
if (CHS_IFERR (st)) /* channel error? */ if (CHS_IFERR (st)) /* channel error? */
mux_chan_err (st); /* go idle */ mux_chan_err (st); /* go idle */
else muxc_cmd = MUXC_RCV; /* no, receive */ else muxc_cmd = MUXC_RCV; /* no, receive */
if (cmd == 0xFF) { /* invalid cmd? */
chan_uen (mux_dib.dva); /* uend */
return SCPE_OK;
}
} }
else if (muxc_cmd == MUXC_END) { /* end state? */ else if (muxc_cmd == MUXC_END) { /* end state? */
st = chan_end (mux_dib.dva); /* set channel end */ st = chan_end (mux_dib.dva); /* set channel end */

339
sigma/sigma_cp.c Normal file
View file

@ -0,0 +1,339 @@
/* sigma_cp.c Sigma 7160 Card Punch
Copyright (c) 2024, Ken Rector
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
KEN RECTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Ken Rector shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Ken Rector.
cp 7160 300 cpm card punch
The 7160 card punch is described in the SDS Reference Manual, 900971A.
The simulator writes 120 byte records to the cp attached output file. There
is no control or formatting meta data included in the file.
Output requests in EBCDIC mode produce hollerith encoded card images.
Output in binary mode produces column binary card images.
Capacity describes the number of punched cards in the outout stacker. This
accumulates indefinitely. It is not reset when the output file is detached.
*/
#include "sigma_io_defs.h"
#include "sim_card.h"
/* Local unit Commands */
#define CPS_INIT 0x101
#define CPS_STOP 0x00 /* stop*/
#define CPS_PU01 0x01 /* punch binary normal */
#define CPS_PU05 0x05 /* punch ebcdic normal */
#define CPS_PU09 0x09 /* punch binary, error alternate */
#define CPS_PU0D 0x0d /* punch ebcdic, error alternate */
#define CPS_PU11 0x11 /* punch binary, alternate */
#define CPS_PU15 0x15 /* punch ebcdic, alternate */
#define CPS_PU19 0x19 /* punch binary, alternate */
#define CPS_PU1D 0x1d /* punch ebcdic, alternate */
#define CPS_STOPI 0x80 /* stop and interrupt */
#define UST u3 /* unit status */
#define UCMD u4 /* unit command */
#define LEN 120 /* output length */
#define DPS_UEN 0x04 /* unusual end occured */
char cp_buffer[LEN]; /* card output image */
int32 cp_bptr = 0; /* buf ptr */
int32 cp_row = 0; /* row counter */
int32 cp_stacker1;
int32 cp_stacker2;
uint32 cp_disp(uint32 fnc, uint32 inst, uint32 *dat);
uint32 cp_tio_status(void);
uint32 cp_tdv_status(void);
t_stat cp_chan_err (uint32 st);
t_stat cp_svc(UNIT *);
t_stat cp_reset (DEVICE *dptr);
t_stat cp_attach(UNIT * uptr, CONST char *file);
t_stat cp_detach(UNIT * uptr);
t_stat cp_show_cap (FILE *st, UNIT *uptr, int32 val, CONST void *desc);
uint8 cp_op[] = {
1, 1, 0, 0, 0, 1, 0, 0,
0, 1, 0, 0, 0, 1, 0, 0,
0, 1, 0, 0, 0, 1, 0, 0,
0, 1, 0, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
1
};
extern uint32 chan_ctl_time;
extern uint16 ebcdic_to_hol[];
dib_t cp_dib = { DVA_CP, cp_disp, 0, NULL };
UNIT cp_unit = {UDATA(&cp_svc, UNIT_ATTABLE , 0), 2000 };
MTAB cp_mod[] = {
{MTAB_XTD | MTAB_VDV, 0, "CHANNEL", "CHANNEL",
&io_set_dvc,&io_show_dvc,NULL},
{ MTAB_XTD|MTAB_VDV, 0, "CAPACITY", NULL,
NULL, &cp_show_cap, NULL, "Punch stacker Count" },
{0}
};
REG cp_reg[] = {
{ BRDATA (BUFF, cp_buffer, 8, 8, sizeof(cp_buffer)/sizeof(*cp_buffer)), REG_HRO},
{ DRDATA (BPTR, cp_bptr, 18), PV_LEFT },
{ DRDATA (POS, cp_unit.pos, T_ADDR_W), PV_LEFT },
{ NULL }
};
DEVICE cp_dev = {
"CP", &cp_unit, cp_reg, cp_mod,
1, 10, 31, 1, 16, 8,
NULL, NULL, &cp_reset, NULL, &cp_attach, &cp_detach,
&cp_dib, 0
};
/* Card Punch : IO Dispatch rotine*/
uint32 cp_disp (uint32 op, uint32 dva, uint32 *dvst) {
switch (op) {
case OP_SIO: /* start I/O */
*dvst = cp_tio_status (); /* get status */
/* if automatic mode and ready */
if ((*dvst & DVS_AUTO) && !sim_is_active(&cp_unit)) {
cp_unit.UCMD = CPS_INIT; /* start dev thread */
cp_unit.UST = 0;
cp_row = 0;
sim_activate (&cp_unit, 0);
}
break;
case OP_TIO: /* test status */
*dvst = cp_tio_status (); /* return status */
break;
case OP_TDV: /* test status */
*dvst = cp_tdv_status (); /* return status */
break;
case OP_HIO: /* halt I/O */
chan_clr_chi (cp_dib.dva); /* clear int */
*dvst = cp_tio_status (); /* get status */
if ((*dvst & DVS_DST) != 0) { /* busy? */
sim_cancel (&cp_unit); /* stop dev thread */
cp_unit.UST = DPS_UEN;
chan_uen (cp_dib.dva); /* uend */
cp_unit.UCMD = 0; /* ctlr idle */
}
break;
case OP_AIO: /* acknowledge int */
chan_clr_chi (cp_dib.dva); /* clr int*/
*dvst = 0; /* no status */
break;
default:
*dvst = 0;
return SCPE_IERR;
}
return 0;
}
/* punch service */
t_stat cp_svc(UNIT *uptr) {
uint32 cmd;
uint32 dva = cp_dib.dva;
uint32 st;
uint32 i;
uint32 c;
if (uptr->UCMD == CPS_INIT) { /* init state? */
st = chan_get_cmd (cp_dib.dva, &cmd); /* get order */
if (CHS_IFERR (st))
return cp_chan_err (st);
if ((cmd > 0x80) ||
(cp_op[cmd] == 0)) { /* invalid order? */
uptr->UST = DPS_UEN;
chan_uen (cp_dib.dva); /* report uend */
return SCPE_OK;
}
uptr->UCMD = cmd;
sim_activate (uptr, chan_ctl_time);
return SCPE_OK;
}
switch (uptr->UCMD) {
case CPS_PU01:
case CPS_PU05:
case CPS_PU09:
case CPS_PU0D:
case CPS_PU11:
case CPS_PU15:
case CPS_PU19:
case CPS_PU1D:
if (cp_row++ == 11) { /* last row? */
memset(cp_buffer,0,sizeof(cp_buffer));
if (uptr->UCMD & 0x4) { /* mode? */
i = 0; /* ebcdic */
while (i < LEN) {
unsigned short int col;
st = chan_RdMemB(dva,&c);
if (CHS_IFERR (st)) /* channel error? */
return cp_chan_err (st);
col = ebcdic_to_hol[c]; /* byte and 1/2 */
cp_buffer[i++] = (col >> 4) & 0xff;
cp_buffer[i] = (col & 0x0f) << 4;
if (st == CHS_ZBC) /* end request size? */
break;
st = chan_RdMemB(dva,&c);
if (CHS_IFERR (st)) /* channel error? */
return cp_chan_err (st);
col = ebcdic_to_hol[c]; /* 1/2 and byte */
cp_buffer[i++] |= (col >> 8) & 0xf;
cp_buffer[i++] = (col & 0xff);
if (st == CHS_ZBC) /* end request size? */
break;
}
}
else {
for (i = 0; i < LEN; i++) { /* Binary */
st = chan_RdMemB(dva,&c);
if (CHS_IFERR (st)) /* channel error? */
return cp_chan_err (st);
cp_buffer[i] = c;
if (st == CHS_ZBC) /* end request size? */
break;
}
}
sim_fwrite (cp_buffer, LEN, 1, uptr->fileref);
cp_stacker1++;
chan_set_cm (dva); /* set Chaining Modifier flag */
}
st = chan_end (dva);
uptr->UCMD = CPS_INIT;
break;
case CPS_STOPI:
chan_set_chi(dva,CHI_END); /* interrupt */
case CPS_STOP:
st = chan_end (dva); /* set channel end */
if (CHS_IFERR (st)) /* channel error? */
return cp_chan_err (st);
return SCPE_OK; /* done */
}
sim_activate (uptr, chan_ctl_time);
return SCPE_OK;
}
/* CP status routine */
uint32 cp_tio_status (void)
{
uint32 st;
st = cp_unit.flags & UNIT_ATT? DVS_AUTO: 0; /* AUTO : MANUAL */
if (sim_is_active (&cp_unit)) /* dev busy? */
st |= ( DVS_DBUSY | (CC2 << DVT_V_CC));
st |= cp_unit.UST; /* uend? */
return st;
}
uint32 cp_tdv_status (void)
{
if (cp_unit.flags & UNIT_ATT) /* rdr att? */
return cp_unit.UST; /* uend */
return CC2 << DVT_V_CC;
}
/* Channel error */
t_stat cp_chan_err (uint32 st)
{
cp_unit.UST = DPS_UEN;
chan_uen (cp_dib.dva); /* uend */
if (st < CHS_ERR)
return st;
return SCPE_OK;
}
/* Reset routine */
t_stat cp_reset (DEVICE *dptr)
{
sim_cancel (&cp_unit); /* stop dev thread */
cp_bptr = 0;
cp_row = 0;
chan_reset_dev (cp_dib.dva); /* clr int, active */
return SCPE_OK;
}
/* Attach routine */
t_stat cp_attach(UNIT * uptr, CONST char *cptr) {
return (attach_unit(uptr, cptr));
}
t_stat cp_detach(UNIT * uptr) {
return (detach_unit(uptr));
}
t_stat cp_show_cap (FILE *st, UNIT *uptr, int32 val, CONST void *desc) {
int n;
if ((n = cp_stacker1) == 0)
fprintf(st,"stacker empty");
else {
if (n == 1)
fprintf(st,"1 card");
else
fprintf(st,"%d cards",n);
fprintf(st," in stacker");
}
return SCPE_OK;
}

437
sigma/sigma_cr.c Normal file
View file

@ -0,0 +1,437 @@
/* sigma_cr.c: Sigma 7120/7122/7140 card reader
Copyright (c) 2024, Ken Rector
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
KEN RECTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of Ken Rector shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Ken Rector.
cr 7120 card reader
27-Feb-2024 kenr Initial version
The 7120, 7122 and 7140 card readers are described in the SDS
reference manual, 900970C.
The simulator expects input data to be a file of 120 byte records with no control
or other extraneous data, to simulate a punched card deck. Each 120 byte record
is translated to 80 16 bit columns with data in the loworder 12 bits. In
automatic mode each column (1-1/2 bytes) is translated from a hollerith code
to an ebcdic character (1 byte). In binary mode each pair of columns is
translated to 3 data bytes.
A length error in the input data will not be detected until the end of file
and results in an Invalid Length and Unusual End status. CPV sets the ignore
incorrect length flag so this can cause trouble in the symbiont input process.
Card reader speed for the 7120, 7122 and 7140 machines was 400, 400 and 1500
cards per minute respectively, or 150, 150 and 40 msec per card. The simulator
runs much faster than this, transmitting 80 columns in ~400 instruction cycles,
or 5 cycles per column.
The cr device capacity indicates the number of cards in the hopper and stacker.
There is no limit on the number of records in the hopper or stacker. The
stacker is never emptied and the count can overflow. The hopper counter is
set when a file is attached and reduced as each card is read.
The cardreader is detached from the input file when the hopper count
reaches zero.
The card reader reports a Data Transmission Error if an incorrect EBCDIC character
is detected, (more than 1 punch in rows 1-7).
*/
#include <sys/stat.h>
#include "sigma_io_defs.h"
#include "sim_card.h"
/* Unit status */
#define CDR_DTE 0x08 /* data error */
/* Device States */
#define CRS_INIT 0x101 /* feed card */
#define CRS_END 0x102 /* end card */
#define UST u3 /* unit status */
#define UCMD u4 /* unit command */
uint32 cr_bptr; /* buffer index */
uint32 cr_blnt; /* buffer length */
uint32 cr_col; /* current column */
uint32 cr_hopper; /* hopper count */
uint32 *cr_stkptr; /* selected stacker */
uint32 cr_stacker = 0; /* stacker count */
uint32 cr_stacker1 = 0; /* stacker 1 count */
uint32 cr_stacker2 = 0; /* stacker 2 count */
uint16 cr_buffer[80]; /* 80 column data */
uint32 cr_ebcdic_init = 0; /* translate initial flag */
uint16 hol_to_ebcdic[4096]; /* translation table */
uint8 cr_ord[] = { /* valid order codes*/
0, 0, 1, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 0, 1, 0
};
extern uint32 chan_ctl_time;
extern uint16 ebcdic_to_hol[];
uint32 cr_disp (uint32 op, uint32 dva, uint32 *dvst);
t_stat cr_readrec (UNIT *uptr);
uint32 cr_tio_status (void);
uint32 cr_tdv_status (void);
t_stat cr_chan_err (uint32 st);
t_stat cr_svc (UNIT *uptr);
t_stat cr_reset (DEVICE *dptr);
t_stat cr_attach (UNIT *uptr, CONST char *cptr);
t_stat cr_detach (UNIT *uptr);
t_stat cr_show_cap (FILE *st, UNIT *uptr, int32 val, CONST void *desc);
dib_t cr_dib = { DVA_CR, cr_disp, 0, NULL };
UNIT cr_unit = {
UDATA(&cr_svc, UNIT_ATTABLE | UNIT_RO , 0),
60
};
REG cr_reg[] = {
{ DRDATA (BPTR, cr_bptr, 17), PV_LEFT },
{ DRDATA (BLNT, cr_blnt, 17), PV_LEFT },
{ NULL }
};
MTAB cr_mod[] = {
{MTAB_XTD | MTAB_VDV, 0, "CHANNEL", "CHANNEL",
&io_set_dvc,&io_show_dvc,NULL},
{MTAB_XTD|MTAB_VDV, 0, "DVA", "DVA",
&io_set_dva, &io_show_dva, NULL },
{MTAB_XTD|MTAB_VDV, 0, "CAPACITY", NULL,
NULL, &cr_show_cap, NULL, "Card hopper size" },
{0}
};
DEVICE cr_dev = {
"CR", &cr_unit, cr_reg, cr_mod,
1, 10, 31, 1, 16, 8,
NULL, NULL, &cr_reset, &io_boot,&cr_attach,&cr_detach,
&cr_dib, 0
};
/* Card Reader : IO dispatch routine */
uint32 cr_disp (uint32 op, uint32 dva, uint32 *dvst)
{
switch (op) { /* case on op */
case OP_SIO: /* start I/O */
*dvst = cr_tio_status (); /* get status */
if ((*dvst & DVS_AUTO) && !sim_is_active(&cr_unit)) {
cr_unit.UCMD = CRS_INIT; /* start dev thread */
cr_stkptr = &cr_stacker;
sim_activate (&cr_unit, 0);
}
break;
case OP_TIO: /* test status */
*dvst = cr_tio_status (); /* return status */
break;
case OP_TDV: /* test status */
*dvst = cr_tdv_status (); /* return status */
break;
case OP_HIO: /* halt I/O */
chan_clr_chi (cr_dib.dva); /* clear int */
*dvst = cr_tio_status ();
if ((*dvst & DVS_DST) != 0) { /* busy? */
sim_cancel (&cr_unit); /* stop dev thread */
chan_uen (cr_dib.dva); /* uend */
}
break;
case OP_AIO: /* acknowledge int */
chan_clr_chi (cr_dib.dva); /* clr int*/
*dvst = 0; /* no status */
break;
default:
*dvst = 0;
return SCPE_IERR;
}
return 0;
}
/* Service routine */
t_stat cr_svc (UNIT *uptr)
{
uint32 cmd = uptr->UCMD;
t_stat st;
char c;
if (cmd == CRS_INIT) { /* init state */
st = chan_get_cmd (cr_dib.dva, &cmd); /* get order */
if (CHS_IFERR (st)) /* bad device id, inactive state */
return cr_chan_err (st);
if ((cmd > 0x3e) || /* invalid order? */
(cr_ord[cmd] == 0)) {
chan_uen (cr_dib.dva);
return SCPE_OK;
}
uptr->UCMD = cmd; /* save order */
cr_blnt = 0; /* empty buffer */
cr_col = 0; /* initial column */
switch (cmd & 0x30) { /* note stacker */
case 0x10:
cr_stkptr = &cr_stacker1;
break;
case 0x30:
cr_stkptr = &cr_stacker2;
break;
default:
cr_stkptr = &cr_stacker;
break;
}
sim_activate (uptr, chan_ctl_time);
return SCPE_OK;
}
if (cmd == CRS_END) { /* end of card */
st = chan_end (cr_dib.dva); /* set channel end, inactive */
if (CHS_IFERR (st)) /* bad dev/inactive? */
return cr_chan_err (st);
++*cr_stkptr; /* add to stacker */
if (--cr_hopper == 0) /* remove from hopper */
cr_detach(uptr); /* end input deck */
if (st == CHS_CCH) { /* command chain? */
uptr->UCMD = CRS_INIT; /* restart thread */
sim_activate (uptr, chan_ctl_time);
}
return SCPE_OK;
}
if (cr_blnt == 0) { /* card arriving? */
if (cr_readrec (uptr) == 0) { /* unexpected EOF, inv reclnt? */
uptr->UCMD = CRS_END; /* end state */
sim_activate (uptr, chan_ctl_time); /* sched ctlr */
return SCPE_OK;
}
if ((cmd & 0x04) && /* mode change? */
((cr_buffer[0] & 0x180) == 0x180)) {
cmd &= ~0x04; /* automatic(EBCDIC) and row 1 2 */
uptr->UCMD = cmd; /* switch to binary mode */
}
}
if (cmd & 0x04) { /* mode? */
int i = 0; /* invalid punches? */
int n = cr_buffer[cr_bptr++] & 0x1fc;
c = (char) hol_to_ebcdic[cr_buffer[cr_bptr-1]]; /* automatic */
while (n) { /* Kerninghams bit count alg */
n &= (n-1); /* count bits in row 1-7 */
i++;
}
if (i > 1) { /* >2 punches? */
c = 0x00; /* return 0x00 */
uptr->UST |= CDR_DTE; /* Transmission Data Error*/
chan_set_chf (cr_dib.dva, CHF_XMDE); /* operational status byte */
}
}
else {
switch (cr_col % 3) { /* binary */
case 0:
c = ((cr_buffer[cr_bptr] >> 4) & 0xff);
break;
case 1:
c = ((cr_buffer[cr_bptr] & 0x0f) << 4);
cr_bptr++;
c |= ((cr_buffer[cr_bptr] & 0xf00) >> 8);
break;
case 2:
c = (cr_buffer[cr_bptr++] & 0xff);
break;
}
}
cr_col++;
st = chan_WrMemB (cr_dib.dva, c); /* write to memory */
if (CHS_IFERR (st)) /* channel error? */
return cr_chan_err (st);
if ((st != CHS_ZBC) && (cr_bptr != cr_blnt)) { /* not done? */
sim_activate (uptr, chan_ctl_time); /* continue */
return SCPE_OK;
}
if (((st == CHS_ZBC) ^ (cr_bptr == cr_blnt)) && /* length err? */
chan_set_chf (cr_dib.dva, CHF_LNTE)) /* Incorrect Length */
return SCPE_OK; /* to operational status byte */
uptr->UCMD = CRS_END; /* end state */
sim_activate (uptr, chan_ctl_time); /* sched ctlr */
return SCPE_OK;
}
/* get next record */
t_stat cr_readrec (UNIT *uptr) {
int col;
FILE *fp = uptr->fileref;
for (col = 0; col < 80; ) {
int16 i;
int c1, c2, c3;
c1 = fgetc (fp); /* read 3 bytes */
c2 = fgetc (fp);
c3 = fgetc (fp);
if (feof(fp) || (c1 == EOF) || (c2 == EOF) || (c3 == EOF)) {
cr_blnt = cr_bptr = 0;
chan_set_chf (cr_dib.dva, CHF_LNTE);
return 0;
}
i = ((c1 << 4) | ( c2 >> 4)) & 0xFFF; /* pack 1-1/2 bytes per column */
cr_buffer[col] = i;
col++;
i = (((c2 & 017) << 8) | c3) & 0xFFF;
cr_buffer[col] = i;
col++;
}
cr_bptr = 0;
cr_blnt = 80;
return 80;
}
/* CR status routine */
uint32 cr_tio_status (void)
{
uint32 st;
st = (cr_unit.flags & UNIT_ATT) ? DVS_AUTO: 0; /* AUTO : MANUAL */
if (sim_is_active (&cr_unit)) /* dev busy? */
st |= ( DVS_CBUSY | DVS_DBUSY | (CC2 << DVT_V_CC));
return st;
}
uint32 cr_tdv_status (void)
{
uint32 st;
if (cr_unit.flags & UNIT_ATT &&
(cr_hopper > 0)) /* rdr att? */
st = cr_unit.UST;
else
st = (CC2 << DVT_V_CC);
return st;
}
/* Channel error */
t_stat cr_chan_err (uint32 st)
{
chan_uen (cr_dib.dva);
if (st < CHS_ERR)
return st;
return SCPE_OK;
}
/* Reset routine */
t_stat cr_reset (DEVICE *dptr)
{
int i;
if (!cr_ebcdic_init) { /* initialize translate table */
for (i = 0; i < 4096; i++)
hol_to_ebcdic[i] = 0x100; /* a la sim_card */
for (i = 0; i < 256; i++) {
uint16 temp = ebcdic_to_hol[i];
if (hol_to_ebcdic[temp] != 0x100) {
fprintf(stderr, "Translation error %02x is %03x and %03x\n",
i, temp, hol_to_ebcdic[temp]);
} else {
hol_to_ebcdic[temp] = i;
}
}
cr_ebcdic_init = 1;
}
sim_cancel (&cr_unit); /* stop dev thread */
chan_reset_dev (cr_dib.dva); /* clr int, active */
return SCPE_OK;
}
/* Attach routine */
t_stat cr_attach (UNIT *uptr, CONST char *cptr)
{
char *saved_filename;
int r;
saved_filename = uptr->filename;
uptr->filename = NULL;
if ((r = attach_unit(uptr, cptr)) != SCPE_OK) {
uptr->filename = saved_filename;
return r;
}
r = sim_fsize(uptr->fileref);
if ((r % 120) != 0) { /* multiple of 120 byte cards? */
detach_unit(uptr);
fprintf(stderr,"CR file size error\n");
return SCPE_IOERR;
}
cr_hopper = r / 120;
return SCPE_OK;
}
/* Detach routine */
t_stat cr_detach (UNIT *uptr)
{
cr_hopper = 0;
return detach_unit(uptr);
}
t_stat cr_show_cap (FILE *st, UNIT *uptr, int32 val, CONST void *desc) {
if (cr_hopper == 0)
fprintf(st,"hopper empty");
else {
if (cr_hopper == 1)
fprintf(st,"1 card");
else
fprintf(st,"%d cards",cr_hopper);
fprintf(st," in hopper");
}
fprintf(st,"\nNormal Stacker %d\n",cr_stacker);
fprintf(st,"Alt Stacker 1 %d\n",cr_stacker1);
fprintf(st,"Alt Stacker 2 %d",cr_stacker2);
return SCPE_OK;
}

View file

@ -25,6 +25,7 @@
dk 7250/7251-7252 cartridge disk dk 7250/7251-7252 cartridge disk
17-Feb-24 RMS Zero delay from SIO to INIT state (Ken Rector)
11-Feb-24 RMS Report non-operational if not attached (Ken Rector) 11-Feb-24 RMS Report non-operational if not attached (Ken Rector)
01-Feb-24 RMS Fixed nx unit test (Ken Rector) 01-Feb-24 RMS Fixed nx unit test (Ken Rector)
15-Dec-22 RMS Moved SIO interrupt test to devices 15-Dec-22 RMS Moved SIO interrupt test to devices
@ -179,7 +180,7 @@ switch (op) { /* case on op */
*dvst |= (CC2 << DVT_V_CC); /* SIO fails */ *dvst |= (CC2 << DVT_V_CC); /* SIO fails */
else if ((*dvst & (DVS_CST|DVS_DST)) == 0) { /* ctrl + dev idle? */ else if ((*dvst & (DVS_CST|DVS_DST)) == 0) { /* ctrl + dev idle? */
dk_cmd = DKS_INIT; /* start dev thread */ dk_cmd = DKS_INIT; /* start dev thread */
sim_activate (&dk_unit[un], chan_ctl_time); sim_activate (&dk_unit[un], 0);
} }
break; break;

View file

@ -25,6 +25,8 @@
dp moving head disk pack controller dp moving head disk pack controller
05-Apr-24 RMS Added case points for RDEES, CRIOF (Ken Rector)
17-Feb-24 RMS Zero delay from SIO to INIT state (Ken Rector)
11-Feb-24 RMS Report non-operational if not attached (Ken Rector) 11-Feb-24 RMS Report non-operational if not attached (Ken Rector)
01-Feb-24 RMS Fixed nx unit test (Ken Rector) 01-Feb-24 RMS Fixed nx unit test (Ken Rector)
03-Jun-23 RMS Fixed SENSE length error detection (Ken Rector) 03-Jun-23 RMS Fixed SENSE length error detection (Ken Rector)
@ -623,7 +625,7 @@ switch (op) { /* case on op */
} }
if ((*dvst & (DVS_CST|DVS_DST)) == 0) { /* ctrl + dev idle? */ if ((*dvst & (DVS_CST|DVS_DST)) == 0) { /* ctrl + dev idle? */
uptr->UCMD = DPS_INIT; /* start dev thread */ uptr->UCMD = DPS_INIT; /* start dev thread */
sim_activate (uptr, chan_ctl_time); sim_activate (uptr, 0);
} }
break; break;
@ -883,6 +885,7 @@ switch (uptr->UCMD) {
return SCPE_OK; /* err or cont */ return SCPE_OK; /* err or cont */
break; break;
case DPS_RDEES: /* read */
case DPS_READ: /* read */ case DPS_READ: /* read */
if (dp_inv_ad (uptr, &da)) { /* invalid addr? */ if (dp_inv_ad (uptr, &da)) { /* invalid addr? */
ctx->dp_flags |= DPF_PGE; ctx->dp_flags |= DPF_PGE;
@ -934,6 +937,7 @@ switch (uptr->UCMD) {
return SCPE_OK; return SCPE_OK;
break; break;
case DPS_CRIOF: /* cond rls intr */
case DPS_RSRV: /* reserve */ case DPS_RSRV: /* reserve */
case DPS_RLS: /* release */ case DPS_RLS: /* release */
case DPS_RLSA: /* release */ case DPS_RLSA: /* release */

View file

@ -23,6 +23,7 @@
used in advertising or otherwise to promote the sale, use or other dealings used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Robert M Supnik. in this Software without prior written authorization from Robert M Supnik.
19-Mar-2024 RMS Added chaining modifier flag (Ken Rector)
11-Feb-2024 RMS Fixed false dispatch bug (Ken Rector) 11-Feb-2024 RMS Fixed false dispatch bug (Ken Rector)
04-May-2023 RMS Fixed location 21 usage in even register case (Ken Rector) 04-May-2023 RMS Fixed location 21 usage in even register case (Ken Rector)
15-Dec-2022 RMS Moved SIO interrupt test to devices 15-Dec-2022 RMS Moved SIO interrupt test to devices

View file

@ -23,6 +23,9 @@
used in advertising or otherwise to promote the sale, use or other dealings used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Robert M Supnik. in this Software without prior written authorization from Robert M Supnik.
19-Mar-24 RMS Added chaining modifier flag (Ken Rector)
01-Feb-24 RMS Fixed DVT_NODEV definition (Ken Rector)
15-Dec-22 RMS Added chan_chk_dvi definition
21-Jul-22 RMS Channel UEND flag in wrong bit position (Ken Rector) 21-Jul-22 RMS Channel UEND flag in wrong bit position (Ken Rector)
*/ */

View file

@ -1,6 +1,6 @@
/* sigma_lp.c: Sigma 7440/7450 line printer /* sigma_lp.c: Sigma 7440/7450 line printer
Copyright (c) 2007-2021, Robert M. Supnik Copyright (c) 2007-2024, Robert M. Supnik
Permission is hereby granted, free of charge, to any person obtaining a Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"), copy of this software and associated documentation files (the "Software"),
@ -25,6 +25,9 @@
lp 7440/7445 or 7450 line printer lp 7440/7445 or 7450 line printer
18-Feb-2024 RMS Zero delay from SIO to INIT state (Ken Rector)
Added INIT test for illegal command (Ken Rector)
15-Dec-2022 RMS Moved SIO interrupt test to devices
10-Jun-2021 RMS Removed use of ftell for pipe compatibility 10-Jun-2021 RMS Removed use of ftell for pipe compatibility
09-Mar-2017 RMS Fixed unclosed file returns in CCT load (COVERITY) 09-Mar-2017 RMS Fixed unclosed file returns in CCT load (COVERITY)
*/ */
@ -97,6 +100,24 @@ uint8 lp_to_ascii[64] = {
'0', '1', '2', '3', '4', '5', '6', '7', '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', '#', '@', '\'', '=', '"' '8', '9', ':', '#', '@', '\'', '=', '"'
}; };
static uint8 lp_valid_cmd[256] = {
0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0n */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x4n */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
extern uint32 chan_ctl_time; extern uint32 chan_ctl_time;
@ -184,7 +205,7 @@ switch (op) { /* case on op */
*dvst |= (CC2 << DVT_V_CC); /* SIO fails */ *dvst |= (CC2 << DVT_V_CC); /* SIO fails */
else if ((*dvst & DVS_DST) == 0) { /* idle? */ else if ((*dvst & DVS_DST) == 0) { /* idle? */
lp_cmd = LPS_INIT; /* start dev thread */ lp_cmd = LPS_INIT; /* start dev thread */
sim_activate (&lp_unit, chan_ctl_time); sim_activate (&lp_unit, 0);
} }
break; break;
@ -232,6 +253,10 @@ switch (lp_cmd) { /* case on state */
st = chan_get_cmd (lp_dib.dva, &cmd); /* get command */ st = chan_get_cmd (lp_dib.dva, &cmd); /* get command */
if (CHS_IFERR (st)) /* channel error? */ if (CHS_IFERR (st)) /* channel error? */
return lp_chan_err (st); return lp_chan_err (st);
if (lp_valid_cmd[cmd] == 0) { /* bad command? */
chan_uen (lp_dib.dva); /* uend */
return SCPE_OK;
}
lp_inh = 0; /* clear inhibit, */ lp_inh = 0; /* clear inhibit, */
lp_run = 0; /* runaway */ lp_run = 0; /* runaway */
lp_cmd = lp_lastcmd = cmd; /* save command */ lp_cmd = lp_lastcmd = cmd; /* save command */

View file

@ -25,6 +25,7 @@
mt 7320 and 7322/7323 magnetic tape mt 7320 and 7322/7323 magnetic tape
17-Feb-24 RMS Zero delay from SIO to INIT state (Ken Rector)
11-Feb-24 RMS Report non-operational if not attached (Ken Rector) 11-Feb-24 RMS Report non-operational if not attached (Ken Rector)
01-Feb-24 RMS Fixed nx unit test (Ken Rector) 01-Feb-24 RMS Fixed nx unit test (Ken Rector)
01-Nov-23 RMS Fixed reset not to clear BOT 01-Nov-23 RMS Fixed reset not to clear BOT
@ -248,7 +249,7 @@ switch (op) { /* case on op */
*dvst |= (CC2 << DVT_V_CC); /* SIO fails */ *dvst |= (CC2 << DVT_V_CC); /* SIO fails */
else if ((*dvst & (DVS_CST|DVS_DST)) == 0) { /* ctrl + dev idle? */ else if ((*dvst & (DVS_CST|DVS_DST)) == 0) { /* ctrl + dev idle? */
uptr->UCMD = MCM_INIT; /* start dev thread */ uptr->UCMD = MCM_INIT; /* start dev thread */
sim_activate (uptr, chan_ctl_time); sim_activate (uptr, 0);
} }
break; break;

View file

@ -1,6 +1,6 @@
/* sigma_pt.c: Sigma 7060 paper tape reader/punch /* sigma_pt.c: Sigma 7060 paper tape reader/punch
Copyright (c) 2007-2018, Robert M. Supnik Copyright (c) 2007-2024, Robert M. Supnik
Permission is hereby granted, free of charge, to any person obtaining a Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"), copy of this software and associated documentation files (the "Software"),
@ -25,6 +25,8 @@
pt 7060 paper-tape reader/punch pt 7060 paper-tape reader/punch
17-Feb-24 RMS Zero delay from SIO to INIT state (Ken Rector)
15-Dec-2022 RMS Moved SIO interrupt test to devices
02-Jun-2018 RMS Defanged clang signed/unsigned whining (Mark Pizzolato) 02-Jun-2018 RMS Defanged clang signed/unsigned whining (Mark Pizzolato)
*/ */
@ -123,7 +125,7 @@ switch (op) { /* case on op */
*dvst |= (CC2 << DVT_V_CC); /* SIO fails */ *dvst |= (CC2 << DVT_V_CC); /* SIO fails */
else if ((*dvst & DVS_DST) == 0) { /* idle? */ else if ((*dvst & DVS_DST) == 0) { /* idle? */
pt_cmd = PTS_INIT; /* start dev thread */ pt_cmd = PTS_INIT; /* start dev thread */
sim_activate (&pt_unit[PTR], chan_ctl_time); sim_activate (&pt_unit[PTR], 0);
} }
break; break;

View file

@ -1,6 +1,6 @@
/* sigma_rad.c: Sigma 7211/7212 or 7231/7232 fixed head disk simulator /* sigma_rad.c: Sigma 7211/7212 or 7231/7232 fixed head disk simulator
Copyright (c) 2007-2022, Robert M Supnik Copyright (c) 2007-2024, Robert M Supnik
Permission is hereby granted, free of charge, to any person obtaining a Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"), copy of this software and associated documentation files (the "Software"),
@ -25,6 +25,9 @@
rad 7211/7212 or 7231/7232 fixed head disk rad 7211/7212 or 7231/7232 fixed head disk
17-Feb-24 RMS Zero delay from SIO to INIT state (Ken Rector)
01-Feb-24 RMS Fixed nx unit test (Ken Rector)
22-Apr-23 RMS Fixed write protect test (Ken Rector)
02-Jul-22 RMS Fixed bugs in multi-unit operation 02-Jul-22 RMS Fixed bugs in multi-unit operation
The RAD is a head-per-track disk. To minimize overhead, the entire RAD The RAD is a head-per-track disk. To minimize overhead, the entire RAD
@ -206,8 +209,10 @@ int32 iu;
UNIT *uptr; UNIT *uptr;
if ((un >= RAD_NUMDR) || /* inv unit num? */ if ((un >= RAD_NUMDR) || /* inv unit num? */
(rad_unit[un].flags & UNIT_DIS)) /* disabled unit? */ (rad_unit[un].flags & UNIT_DIS)) { /* disabled unit? */
return DVT_NODEV; *dvst = DVT_NODEV;
return 0;
}
switch (op) { /* case on op */ switch (op) { /* case on op */
case OP_SIO: /* start I/O */ case OP_SIO: /* start I/O */
@ -216,7 +221,7 @@ switch (op) { /* case on op */
*dvst |= (CC2 << DVT_V_CC); /* SIO fails */ *dvst |= (CC2 << DVT_V_CC); /* SIO fails */
else if ((*dvst & (DVS_CST|DVS_DST)) == 0) { /* ctrl + dev idle? */ else if ((*dvst & (DVS_CST|DVS_DST)) == 0) { /* ctrl + dev idle? */
rad_cmd = RADS_INIT; /* start dev thread */ rad_cmd = RADS_INIT; /* start dev thread */
sim_activate (&rad_unit[un], chan_ctl_time); sim_activate (&rad_unit[un], 0);
} }
break; break;

View file

@ -1,6 +1,6 @@
/* sigma_sys.c: Sigma system interface /* sigma_sys.c: Sigma system interface
Copyright (c) 2007-2017, Robert M Supnik Copyright (c) 2007-2024, Robert M Supnik
Permission is hereby granted, free of charge, to any person obtaining a Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"), copy of this software and associated documentation files (the "Software"),
@ -23,6 +23,7 @@
used in advertising or otherwise to promote the sale, use or other dealings used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Robert M Supnik. in this Software without prior written authorization from Robert M Supnik.
03-Apr-2024 RMS Added CR, CP support (Ken Rector)
09-Mar-2017 RMS Added LOAD processor for CCT 09-Mar-2017 RMS Added LOAD processor for CCT
*/ */
@ -43,6 +44,8 @@ extern DEVICE rad_dev;
extern DEVICE dk_dev; extern DEVICE dk_dev;
extern DEVICE dp_dev[]; extern DEVICE dp_dev[];
extern DEVICE mt_dev; extern DEVICE mt_dev;
extern DEVICE cr_dev;
extern DEVICE cp_dev;
extern DEVICE mux_dev, muxl_dev; extern DEVICE mux_dev, muxl_dev;
extern REG cpu_reg[]; extern REG cpu_reg[];
extern uint32 *M; extern uint32 *M;
@ -93,6 +96,8 @@ DEVICE *sim_devices[] = {
&dp_dev[1], &dp_dev[1],
&mux_dev, &mux_dev,
&muxl_dev, &muxl_dev,
&cr_dev,
&cp_dev,
NULL NULL
}; };
@ -166,6 +171,73 @@ uint8 ebcdic_to_ascii[256] = {
'8', '9', 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, '8', '9', 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F,
}; };
uint16 ebcdic_to_hol[256] = {
/* T918 T91 T92 T93 T94 T95 T96 T97 0x0x */
0xB03, 0x901, 0x881, 0x841, 0x821, 0x811, 0x809, 0x805,
/* T98, T189 , T289, T389, T489, T589, T689, T789 */
0x803, 0x903, 0x883, 0x843, 0x823, 0x813, 0x80B, 0x807,
/* TE189 E91 E92 E93 E94 E95 E96 E97 0x1x */
0xD03, 0x501, 0x481, 0x441, 0x421, 0x411, 0x409, 0x405,
/* E98 E918 E928 E938 E948 E958 E968 E978 */
0x403, 0x503, 0x483, 0x443, 0x423, 0x413, 0x40B, 0x407,
/* E0918 091 092 093 094 095 096 097 0x2x */
0x703, 0x301, 0x281, 0x241, 0x221, 0x211, 0x209, 0x205,
/* 098 0918 0928 0938 0948 0958 0968 0978 */
0x203, 0x303, 0x283, 0x243, 0x223, 0x213, 0x20B, 0x207,
/* TE0918 91 92 93 94 95 96 97 0x3x */
0xF03, 0x101, 0x081, 0x041, 0x021, 0x011, 0x009, 0x005,
/* 98 189 289 389 489 589 689 789 */
0x003, 0x103, 0x083, 0x043, 0x023, 0x013, 0x00B, 0x007,
/* T091 T092 T093 T094 T095 T096 T097 0x4x */
0x000, 0xB01, 0xA81, 0xA41, 0xA21, 0xA11, 0xA09, 0xA05,
/* T098 T18 T28 T38 T48 T58 T68 T78 */
0xA03, 0x902, 0x882, 0x842, 0x822, 0x812, 0x80A, 0x806,
/* T TE91 TE92 TE93 TE94 TE95 TE96 TE97 0x5x */
0x800, 0xD01, 0xC81, 0xC41, 0xC21, 0xC11, 0xC09, 0xC05,
/* TE98 E18 E28 E38 E48 E58 E68 E78 */
0xC03, 0x502, 0x482, 0x442, 0x422, 0x412, 0x40A, 0x406,
/* E 01 E092 E093 E094 E095 E096 E097 0x6x */
0x400, 0x300, 0x681, 0x641, 0x621, 0x611, 0x609, 0x605,
/* E098 018 TE 038 048 68 068 078 */
0x603, 0x302, 0xC00, 0x242, 0x222, 0x212, 0x20A, 0x206,
/* TE0 TE091 TE092 TE093 TE094 TE095 TE096 TE097 0x7x */
0xE00, 0xF01, 0xE81, 0xE41, 0xE21, 0xE11, 0xE09, 0xE05,
/* TE098 18 28 38 48 58 68 78 */
0xE03, 0x102, 0x082, 0x042, 0x022, 0x012, 0x00A, 0x006,
/* T018 T01 T02 T03 T04 T05 T06 T07 0x8x */
0xB02, 0xB00, 0xA80, 0xA40, 0xA20, 0xA10, 0xA08, 0xA04,
/* T08 T09 T028 T038 T048 T058 T068 T078 */
0xA02, 0xA01, 0xA82, 0xA42, 0xA22, 0xA12, 0xA0A, 0xA06,
/* TE18 TE1 TE2 TE3 TE4 TE5 TE6 TE7 0x9x */
0xD02, 0xD00, 0xC80, 0xC40, 0xC20, 0xC10, 0xC08, 0xC04,
/* TE8 TE9 TE28 TE38 TE48 TE58 TE68 TE78 */
0xC02, 0xC01, 0xC82, 0xC42, 0xC22, 0xC12, 0xC0A, 0xC06,
/* E018 E01 E02 E03 E04 E05 E06 E07 0xax */
0x702, 0x700, 0x680, 0x640, 0x620, 0x610, 0x608, 0x604,
/* E08 E09 E028 E038 E048 E058 E068 E078 */
0x602, 0x601, 0x682, 0x642, 0x622, 0x612, 0x60A, 0x606,
/* TE018 TE01 TE02 TE03 TE04 TE05 TE06 TE07 0xbx */
0xF02, 0xF00, 0xE80, 0xE40, 0xE20, 0xE10, 0xE08, 0xE04,
/* TE08 TE09 TE028 TE038 TE048 TE058 TE068 TE078 */
0xE02, 0xE01, 0xE82, 0xE42, 0xE22, 0xE12, 0xE0A, 0xE06,
/* T0 T1 T2 T3 T4 T5 T6 T7 0xcx */
0xA00, 0x900, 0x880, 0x840, 0x820, 0x810, 0x808, 0x804,
/* T8 T9 T0928 T0938 T0948 T0958 T0968 T0978 */
0x802, 0x801, 0xA83, 0xA43, 0xA23, 0xA13, 0xA0B, 0xA07,
/* E0 E1 E2 E3 E4 E5 E6 E7 0xdx */
0x600, 0x500, 0x480, 0x440, 0x420, 0x410, 0x408, 0x404,
/* E8 E9 TE928 TE938 TE948 TE958 TE968 TE978 */
0x402, 0x401, 0xC83, 0xC43, 0xC23, 0xC13, 0xC0B, 0xC07,
/* 028 E091 02 03 04 05 06 07 0xex */
0x282, 0x701, 0x280, 0x240, 0x220, 0x210, 0x208, 0x204,
/* 08 09 E0928 E0938 E0948 E0958 E0968 E0978 */
0x202, 0x201, 0x683, 0x643, 0x623, 0x613, 0x60B, 0x607,
/* 0 1 2 3 4 5 6 7 0xfx */
0x200, 0x100, 0x080, 0x040, 0x020, 0x010, 0x008, 0x004,
/* 8 9 TE0928 TE0938 TE0948 TE0958 TE0968 TE0978 */
0x002, 0x001, 0xE83, 0xE43, 0xE23, 0xE13, 0xE0B, 0xE07
};
/* Binary loader */ /* Binary loader */
t_stat sim_load (FILE *fileref, CONST char *cptr, CONST char *fnam, int flag) t_stat sim_load (FILE *fileref, CONST char *cptr, CONST char *fnam, int flag)

View file

@ -1,6 +1,6 @@
/* sigma_tt.c: Sigma 7012 console teletype /* sigma_tt.c: Sigma 7012 console teletype
Copyright (c) 2007-2018, Robert M. Supnik Copyright (c) 2007-2024, Robert M. Supnik
Permission is hereby granted, free of charge, to any person obtaining a Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"), copy of this software and associated documentation files (the "Software"),
@ -31,6 +31,8 @@
^H input, mapped to EOM and not echoed ^H input, mapped to EOM and not echoed
HT input or output, simulates tabbing with fixed 8 character stops HT input or output, simulates tabbing with fixed 8 character stops
18-Feb-2024 RMS Zero delay from SIO to INIT state (Ken Rector)
15-Dec-2022 RMS Moved SIO int pending test to devices
02-Jun-2018 RMS Defanged clang signed/unsigned whining (Mark Pizzolato) 02-Jun-2018 RMS Defanged clang signed/unsigned whining (Mark Pizzolato)
*/ */
@ -138,7 +140,7 @@ switch (op) { /* case on op */
*dvst |= (CC2 << DVT_V_CC); /* SIO fails */ *dvst |= (CC2 << DVT_V_CC); /* SIO fails */
else if ((*dvst & DVS_DST) == 0) { /* idle? */ else if ((*dvst & DVS_DST) == 0) { /* idle? */
tt_cmd = TTS_INIT; /* start dev thread */ tt_cmd = TTS_INIT; /* start dev thread */
sim_activate (&tt_unit[TTO], chan_ctl_time); sim_activate (&tt_unit[TTO], 0);
} }
break; break;