1
0
mirror of https://github.com/simh/simh.git synced 2026-04-13 15:34:35 +00:00

Notes For V2.9-11

1. New Features

1.1 GRI-909

- This is a new simulator for the GRI-909.
- It has been hand-tested; so far, no software has been discovered.

1.2 VAX

- SET CPU CONHALT will cause a HALT instruction to return to the
  boot ROM console rather than to SIMH.  SET CPU SIMHALT restores
  the default behavior.
- BRB/W self at IPL 1F stops the simulator.  This is the default
  behavior of VMS at exit.

1.3 PDP-18b

- ATTACH -A PTR/PTP attaches the reader and punch in ASCII mode.
  In ASCII mode, the reader automatically sets the high order bit
  of incoming alphabetic data, and the punch clears the high order
  bit of outgoing data.

1.4 SCP

- DO -V echoes commands from the file as they are executed.
- Under Windows, execution priority is set BELOW_NORMAL when the
  simulator is running.

2. Release Notes

2.1 Bugs Fixed

- PDP-11 CPU: fixed updating of MMR0 on a memory management error.
- VAX FPA: changed function names to avoid conflict with C math library.
- 1401 MT: read end of record generates group mark without word mark.
- 1401 DP: fixed address generation and checking.
- SCP: an EXIT within a DO command will cause the simulator to exit.

3. In Progress

- Interdata 16b/32b: coded, not tested.
- SDS 940: coded, not tested.
- IBM 1620: coded, not tested.

If you would like to help with the debugging of the untested simulators,
they can be made available by special request.
This commit is contained in:
Bob Supnik
2002-07-14 15:20:00 -07:00
committed by Mark Pizzolato
parent 701f0fe028
commit df6475181c
179 changed files with 36441 additions and 4464 deletions

View File

@@ -1,6 +1,6 @@
/* pdp10_cpu.c: PDP-10 CPU simulator
Copyright (c) 1993-2001, Robert M. Supnik
Copyright (c) 1993-2002, 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 @@
cpu KS10 central processor
30-Dec-01 RMS Added old PC queue
25-Dec-01 RMS Cleaned up sim_inst declarations
07-Dec-01 RMS Revised to use new breakpoint package
21-Nov-01 RMS Implemented ITS 1-proceed hack
@@ -128,6 +129,9 @@
#include "pdp10_defs.h"
#include <setjmp.h>
#define PCQ_SIZE 64 /* must be 2**n */
#define PCQ_MASK (PCQ_SIZE - 1)
#define PCQ_ENTRY pcq[pcq_p = (pcq_p - 1) & PCQ_MASK] = PC
#define UNIT_V_MSIZE (UNIT_V_T20V41 + 1) /* dummy mask */
#define UNIT_MSIZE (1 << UNIT_V_MSIZE)
@@ -169,7 +173,9 @@ int32 stop_op0 = 0; /* stop on 0 */
int32 rlog = 0; /* extend fixup log */
int32 ind_max = 32; /* nested ind limit */
int32 xct_max = 32; /* nested XCT limit */
a10 old_PC = 0; /* old PC */
a10 pcq[PCQ_SIZE] = { 0 }; /* PC queue */
int32 pcq_p = 0; /* PC queue ptr */
REG *pcq_r = NULL; /* PC queue reg ptr */
jmp_buf save_env;
extern int32 sim_int_char;
@@ -351,7 +357,8 @@ REG cpu_reg[] = {
{ ORDATA (APRLVL, apr_lvl, 3) },
{ ORDATA (RLOG, rlog, 10) },
{ FLDATA (F1PR, its_1pr, 0) },
{ ORDATA (OLDPC, old_PC, VASIZE), REG_RO },
{ BRDATA (PCQ, pcq, 8, VASIZE, PCQ_SIZE), REG_RO+REG_CIRC },
{ ORDATA (PCQP, pcq_p, 6), REG_HRO },
{ DRDATA (INDMAX, ind_max, 8), PV_LEFT + REG_NZ },
{ DRDATA (XCTMAX, xct_max, 8), PV_LEFT + REG_NZ },
{ FLDATA (ITS, cpu_unit.flags, UNIT_V_ITS), REG_HRO },
@@ -434,7 +441,7 @@ static t_stat jrst_tab[16] = {
#define IM ((d10) ea)
#define IMS (((d10) ea) << 18)
#define JUMP(x) old_PC = PC, PC = ((a10) (x)) & AMASK
#define JUMP(x) PCQ_ENTRY, PC = ((a10) (x)) & AMASK
#define SUBJ(x) CLRF (F_AFI | F_FPD | F_TR); JUMP (x)
#define INCPC PC = INCA (PC)
@@ -572,7 +579,7 @@ static t_stat jrst_tab[16] = {
t_stat sim_instr (void)
{
a10 PC;
a10 PC; /* set by setjmp */
int abortval = 0; /* abort value */
/* Restore register state */
@@ -598,6 +605,7 @@ if ((abortval > 0) || pager_pi) { /* stop or pi err? */
abortval = STOP_PAGINT; /* stop for pi err */
saved_PC = pager_PC & AMASK; /* failing instr PC */
set_ac_display (ac_cur); /* set up AC display */
pcq_r -> qptr = pcq_p; /* update pc q ptr */
return abortval; } /* return to SCP */
/* Page fail - checked against KS10 ucode
@@ -2035,6 +2043,9 @@ set_ac_display (ac_cur);
pi_eval ();
if (M == NULL) M = calloc (MAXMEMSIZE, sizeof (d10));
if (M == NULL) return SCPE_MEM;
pcq_r = find_reg ("PCQ", NULL, dptr);
if (pcq_r) pcq_r -> qptr = 0;
else return SCPE_IERR;
sim_brk_types = sim_brk_dflt = SWMASK ('E');
return SCPE_OK;
}

View File

@@ -1,6 +1,6 @@
/* pdp10_defs.h: PDP-10 simulator definitions
Copyright (c) 1993-2001, Robert M Supnik
Copyright (c) 1993-2002, 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,8 +23,10 @@
be used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Robert M Supnik.
22-Apr-02 RMS Removed magtape record length error
20-Jan-02 RMS Added multiboard DZ11 support
23-Oct-01 RMS New IO page address constants
19-Oct-01 RMS Added DZ definitions
19-Oct-01 RMS Added DZ11 definitions
07-Sep-01 RMS Revised for PDP-11 multi-level interrupts
31-Aug-01 RMS Changed int64 to t_int64 for Windoze
29-Aug-01 RMS Corrected models and dates (found by Lars Brinkhoff)
@@ -93,9 +95,8 @@ typedef t_int64 d10; /* PDP-10 data (36b) */
#define STOP_IND 8 /* indirection loop */
#define STOP_XCT 9 /* XCT loop */
#define STOP_ILLIOC 10 /* invalid UBA num */
#define STOP_MTRLNT 11 /* invalid mt rec lnt */
#define STOP_ASTOP 12 /* address stop */
#define STOP_UNKNOWN 13 /* unknown stop */
#define STOP_ASTOP 11 /* address stop */
#define STOP_UNKNOWN 12 /* unknown stop */
#define PAGE_FAIL -1 /* page fail */
#define INTERRUPT -2 /* interrupt */
#define ABORT(x) longjmp (save_env, (x)) /* abort */
@@ -573,30 +574,51 @@ typedef t_int64 d10; /* PDP-10 data (36b) */
#define IO_UBA3 (3 << IO_V_UBA)
#define GET_IOUBA(x) (((x) >> IO_V_UBA) & IO_M_UBA)
/* Device information block */
struct pdp_dib {
uint32 enb; /* enabled */
uint32 ba; /* base addr */
uint32 lnt; /* length */
t_stat (*rd)(int32 *dat, int32 ad, int32 md);
t_stat (*wr)(int32 dat, int32 ad, int32 md); };
typedef struct pdp_dib DIB;
/* DZ11 parameters */
#define DZ_MUXES 1 /* # of muxes */
#define DZ_MUXES 4 /* max # of muxes */
#define DZ_LINES 8 /* lines per mux */
/* I/O page layout */
#define IOBA_DZ 0760010 /* DZ11 */
#define IOLN_DZ (010 * DZ_MUXES)
#define IOBA_TCU 0760770 /* TCU150 */
#define IOLN_TCU 006
#define IOBA_UBMAP 0763000 /* Unibus map */
#define IOLN_UBMAP 0100
#define IOBA_UBCS 0763100 /* Unibus c/s reg */
#define IOLN_UBCS 001
#define IOBA_UBMNT 0763101 /* Unibus maint reg */
#define IOLN_UBMNT 001
#define IOBA_TU 0772440 /* RH11/tape */
#define IOLN_TU 034
#define IOBA_RP 0776700 /* RH11/disk */
#define IOPAGEBASE 0760000 /* I/O page base */
#define IOBA_UBMAP 0763000
#define IOBA_UBMAP1 (IO_UBA1 + IOBA_UBMAP) /* Unibus 1 map */
#define IOLN_UBMAP1 0100
#define IOBA_UBCS1 (IO_UBA1 + 0763100) /* Unibus 1 c/s reg */
#define IOLN_UBCS1 001
#define IOBA_UBMNT1 (IO_UBA1 + 0763101) /* Unibus 1 maint reg */
#define IOLN_UBMNT1 001
#define IOBA_RP (IO_UBA1 + 0776700) /* RH11/disk */
#define IOLN_RP 050
#define IOBA_LP20 0775400 /* LP20 */
#define IOBA_DZ (IO_UBA3 + 0760010) /* DZ11 */
#define IOLN_DZ 010
#define IOBA_TCU (IO_UBA3 + 0760770) /* TCU150 */
#define IOLN_TCU 006
#define IOBA_UBMAP3 (IO_UBA3 + IOBA_UBMAP) /* Unibus 3 map */
#define IOLN_UBMAP3 0100
#define IOBA_UBCS3 (IO_UBA3 + 0763100) /* Unibus 3 c/s reg */
#define IOLN_UBCS3 001
#define IOBA_UBMNT3 (IO_UBA3 + 0763101) /* Unibus 3 maint reg */
#define IOLN_UBMNT3 001
#define IOBA_TU (IO_UBA3 + 0772440) /* RH11/tape */
#define IOLN_TU 034
#define IOBA_LP20 (IO_UBA3 + 0775400) /* LP20 */
#define IOLN_LP20 020
#define IOBA_PT 0777550 /* PC11 */
#define IOBA_PT (IO_UBA3 + 0777550) /* PC11 */
#define IOLN_PT 010
/* Common Unibus CSR flags */
@@ -664,3 +686,10 @@ typedef t_int64 d10; /* PDP-10 data (36b) */
#define IREQ(dv) int_req
#define SET_INT(dv) IREQ(dv) = IREQ(dv) | (INT_##dv)
#define CLR_INT(dv) IREQ(dv) = IREQ(dv) & ~(INT_##dv)
/* Function prototypes */
t_stat set_addr (UNIT *uptr, int32 val, char *cptr, void *desc);
t_stat show_addr (FILE *st, UNIT *uptr, int32 val, void *desc);
t_stat set_enbdis (UNIT *uptr, int32 val, char *cptr, void *desc);
t_bool dev_conflict (uint32 nba, DIB *curr);

View File

@@ -1,14 +1,14 @@
To: Users
From: Bob Supnik
Subj: PDP-10 Simulator Usage
Date: 1-Dec-01
Date: 15-Jun-2002
COPYRIGHT NOTICE
The following copyright notice applies to both the SIMH source and binary:
Original code published in 1993-2001, written by Robert M Supnik
Copyright (c) 1993-2001, Robert M Supnik
Original code published in 1993-2002, written by Robert M Supnik
Copyright (c) 1993-2002, 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"),
@@ -76,13 +76,14 @@ UBA Unibus adapters (translation maps)
FE console
TIM timer
PTR,PTP PC11 paper tape reader/punch
DZ DZ11 8-line terminal multiplexor
DZ DZ11 8-line terminal multiplexor (up to 4)
LP20 LP20 line printer
RP RH11/RP04/RP05/RP06/RP07/RM03/RM05/RM80 controller with
eight drives
TU RH11/TM02/TU45 controller with eight drives
The PTR/PTP are initially DISABLEd. The DZ11 can also be DISABLEd.
The PTR/PTP are initially set DISABLED. The DZ11 and LP20 can also be
set DISABLED.
The PDP-10 simulator implements several unique stop condition:
@@ -99,7 +100,7 @@ The PDP-10 loader supports RIM10B format paper tapes, SAV binary files, and
EXE binary files. LOAD switches -r, -s, -e specify RIM10, SAV, EXE format,
respectively. If no switch is specified, the LOAD command checks the file
extension; .RIM, .SAV, .EXE specify RIM10, SAV, EXE format, respectively.
If no switch specified, and no extension matches, the LOAD command checks
If no switch is specified, and no extension matches, the LOAD command checks
the file format to try to determine the file type.
2.1 CPU
@@ -146,7 +147,8 @@ control registers for the interrupt system.
APRLVL 3 PI level for APR interrupt
IND_MAX 8 indirect address nesting limit
XCT_MAX 8 execute chaining limit
OLDPC 18 PC prior to last transfer instruction
PCQ[0:63] 18 PC prior to last jump or interrupt;
most recent PC change first
WRU 8 interrupt character
REG[0:127] 36 fast memory blocks
@@ -173,7 +175,7 @@ The Unibus adapters link the system I/O devices to the CPU. Unibus
adapter 1 (UBA1) is unit 0, and Unibus adapter 3 is unit 1. The
adapter's Unibus map is the memory space of the corresponding unit.
The Unibus Adapter has the following registers:
The Unibus adapter has the following registers:
name size comments
@@ -194,10 +196,10 @@ The front end has the following registers:
name size comments
IBUF 8 input buffer
ICOUNT 31 count of input characters
ICOUNT 32 count of input characters
ITIME 24 keyboard polling interval
OBUF 8 output buffer
OCOUNT 31 count of output characters
OCOUNT 32 count of output characters
OTIME 24 console output response time
2.5 Timer (TIM)
@@ -205,7 +207,7 @@ The front end has the following registers:
The timer (TIM) implements the system timer, the interval timer, and
the time of day clock used to get the date and time at system startup.
Because most PDP-10 software is not Y2K compliant, the timer implements
one option
one option:
SET TIM NOY2K software not Y2K compliant, limit time
of day clock to 1999 (default)
@@ -243,7 +245,7 @@ The paper tape reader implements these registers:
BUSY 1 busy flag (CSR<11>)
DONE 1 device done flag (CSR<7>)
IE 1 interrupt enable flag (CSR<6>)
POS 31 position in the input file
POS 32 position in the input file
TIME 24 time from I/O initiation to interrupt
STOP_IOE 1 stop on I/O error
@@ -276,7 +278,7 @@ The paper tape punch implements these registers:
ERR 1 error flag (CSR<15>)
DONE 1 device done flag (CSR<7>)
IE 1 interrupt enable flag (CSR<6>)
POS 31 position in the input or output file
POS 32 position in the input or output file
TIME 24 time from I/O initiation to interrupt
STOP_IOE 1 stop on I/O error
@@ -291,11 +293,18 @@ Error handling is as follows:
2.8 DZ11 Terminal Multiplexor (DZ)
The DZ11 is an 8-line terminal multiplexor. The terminal lines perform
input and output through Telnet sessions connected to a user-specified
port. The ATTACH command specifies the port to be used:
The DZ11 is an 8-line terminal multiplexor. Up to 4 DZ11's (32 lines)
are supported. The number of lines can be changed with the command
ATTACH {-am} DZ <port>(cr) -- set up listening port
SET DZ LINES=n set line count to n
The line count must be a multiple of 8, with a maximum of 32.
The terminal lines perform input and output through Telnet sessions
connected to a user-specified port. The ATTACH command specifies
the port to be used:
ATTACH {-am} DZ <port> set up listening port
where port is a decimal number between 1 and 65535 that is not being used
for other TCP/IP activities. The optional switch -m turns on the DZ11's
@@ -305,25 +314,28 @@ modem controls; the optional switch -a turns on active disconnects
Once the DZ is attached and the simulator is running, the DZ will listen
for connections on the specified port. It assumes that the incoming
connections are Telnet connections. The connection remains open until
disconnected either by the simulated program or by the Telnet client.
disconnected by the simulated program, the Telnet client, a SET DZ
DISCONNECT command, or a DETACH DZ command.
The SHOW DZ LINESTATUS command displays the current connections to the DZ.
The SHOW DZ CONNECTIONS command displays the current connections to the DZ.
The SHOW DZ STATISTICS command displays statistics for active connections.
The SET DZ DISCONNECT=linenumber disconnects the specified line.
The DZ11 implements these registers:
name size comments
CSR 16 control/status register
RBUF 16 receive buffer
LPR 16 line parameter register
TCR 16 transmission control register
MSR 16 modem status register
TDR 16 transmit data register
SAENB 1 silo alarm enabled
CSR[0:3] 16 control/status register, boards 0-3
RBUF[0:3] 16 receive buffer, boards 0-3
LPR[0:3] 16 line parameter register, boards 0-3
TCR[0:3] 16 transmission control register, boards 0-3
MSR[0:3] 16 modem status register, boards 0-3
TDR[0:3] 16 transmit data register, boards 0-3
SAENB[0:3] 1 silo alarm enabled, boards 0-3
RXINT 4 receive interrupts, boards 3..0
TXINT 4 transmit interrupts, boards 3..0
MDMTCL 1 modem control enabled
AUTODS 1 autodisconnect enabled
RPOS0..7 32 count of characters received
TPOS0..7 32 count of characters transmitted
The DZ11 does not support save and restore. All open connections are
lost when the simulator shuts down or the DZ is detached.
@@ -340,7 +352,7 @@ RP options include the ability to set units write enabled or write locked,
to set the drive type to one of six disk types, or autosize:
SET RPn LOCKED set unit n write locked
SET RPn ENABLED set unit n write enabled
SET RPn WRITEENABLED set unit n write enabled
SET RPn RM03 set type to RM03
SET RPn RM05 set type to RM05
SET RPn RM80 set type to RM80
@@ -350,8 +362,9 @@ to set the drive type to one of six disk types, or autosize:
SET RPn AUTOSIZE set type based on file size at attach
The type options can be used only when a unit is not attached to a file.
Note that TOPS-10 V7.03 only supported the RP06 and RM03; V7.04 added
support for the RP07. Units can be REMOVEd or ADDed to the configuration.
Note that TOPS-10 V7.03 supported only the RP06 and RM03; V7.04 added
support for the RP07. TOPS-20 V4.1 also supported only the RP06 and
RM03. Units can be set ONLINE or OFFLINE.
The RP controller implements these registers:
@@ -399,9 +412,9 @@ TM02 formatter and up to eight TU45 drives. Magnetic tape options include
the ability to make units write enabled or locked.
SET TUn LOCKED set unit n write locked
SET TUn ENABLED set unit n write enabled
SET TUn WRITEENABLED set unit n write enabled
Units can also be REMOVEd or ADDed to the configuration.
Units can also be set ONLINE or OFFLINE.
The magnetic tape controller implements these registers:
@@ -424,7 +437,7 @@ The magnetic tape controller implements these registers:
STOP_IOE 1 stop on I/O error
TIME 24 delay
UST[0:7] 16 unit status, units 0-7
POS[0:7] 31 position, units 0-7
POS[0:7] 32 position, units 0-7
Error handling is as follows:
@@ -440,7 +453,7 @@ Error handling is as follows:
2.11 LP20 DMA Line Printer (LP20)
The LP20 is a DMA-based line printer controller. There is one
line printer option to clear the vertical forms unit (VFU).
line printer option to clear the vertical forms unit (VFU):
SET LP20 VFUCLEAR clear the vertical forms unit
@@ -464,7 +477,7 @@ The LP20 implements these registers:
ERR 1 error flag
DONE 1 done flag
IE 1 interrupt enable flag
POS 31 position in output file
POS 32 position in output file
TIME 24 response time
STOP_IOE 1 stop on I/O error
TXRAM[0:255] 12 translation RAM

View File

@@ -1,6 +1,6 @@
/* pdp10_dz.c: DZ11 terminal multiplexor simulator
Copyright (c) 1993-2001, Robert M Supnik
Copyright (c) 1993-2002, 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"),

View File

@@ -1,6 +1,6 @@
/* pdp10_fe.c: PDP-10 front end (console terminal) simulator
Copyright (c) 1993-2001, Robert M Supnik
Copyright (c) 1993-2002, 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 @@
fe KS10 console front end
30-May-02 RMS Widened COUNT to 32b
30-Nov-01 RMS Added extended SET/SHOW support
23-Oct-01 RMS New IO page address constants
07-Sep-01 RMS Moved function prototypes
@@ -57,10 +58,10 @@ UNIT fe_unit[] = {
REG fe_reg[] = {
{ ORDATA (IBUF, fei_unit.buf, 8) },
{ DRDATA (ICOUNT, fei_unit.pos, 31), REG_RO + PV_LEFT },
{ DRDATA (ICOUNT, fei_unit.pos, 32), REG_RO + PV_LEFT },
{ DRDATA (ITIME, fei_unit.wait, 24), REG_NZ + PV_LEFT },
{ ORDATA (OBUF, feo_unit.buf, 8) },
{ DRDATA (OCOUNT, feo_unit.pos, 31), REG_RO + PV_LEFT },
{ DRDATA (OCOUNT, feo_unit.pos, 32), REG_RO + PV_LEFT },
{ DRDATA (OTIME, feo_unit.wait, 24), REG_NZ + PV_LEFT },
{ NULL } };

View File

@@ -1,6 +1,6 @@
/* pdp10_ksio.c: PDP-10 KS10 I/O subsystem simulator
Copyright (c) 1993-2001, Robert M Supnik
Copyright (c) 1993-2002, 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 @@
uba Unibus adapters
25-Jan-02 RMS Revised for multiple DZ11's
06-Jan-02 RMS Revised enable/disable support
23-Sep-01 RMS New IO page address constants
07-Sep-01 RMS Revised device disable mechanism
25-Aug-01 RMS Enabled DZ11
@@ -94,26 +96,17 @@ extern d10 *ac_cur;
extern d10 pager_word;
extern int32 flags, pi_l2bit[8];
extern UNIT cpu_unit;
extern FILE *sim_log;
extern jmp_buf save_env;
extern d10 Read (a10 ea);
extern void pi_eval ();
extern t_stat dz_rd (int32 *data, int32 addr, int32 access);
extern t_stat dz_wr (int32 data, int32 addr, int32 access);
extern int32 dz_enb;
extern t_stat pt_rd (int32 *data, int32 addr, int32 access);
extern t_stat pt_wr (int32 data, int32 addr, int32 access);
extern int32 pt_enb;
extern t_stat lp20_rd (int32 *data, int32 addr, int32 access);
extern t_stat lp20_wr (int32 data, int32 addr, int32 access);
extern int32 lp20_inta (void);
extern t_stat rp_rd (int32 *data, int32 addr, int32 access);
extern t_stat rp_wr (int32 data, int32 addr, int32 access);
extern DIB dz_dib, pt_dib, lp20_dib, rp_dib, tu_dib, tcu_dib;
extern int32 rp_inta (void);
extern t_stat tu_rd (int32 *data, int32 addr, int32 access);
extern t_stat tu_wr (int32 data, int32 addr, int32 access);
extern int32 tu_inta (void);
extern t_stat tcu_rd (int32 *data, int32 addr, int32 access);
extern int32 lp20_inta (void);
extern int32 dz_rxinta (void);
extern int32 dz_txinta (void);
t_stat ubmap_rd (int32 *data, int32 addr, int32 access);
t_stat ubmap_wr (int32 data, int32 addr, int32 access);
t_stat ubs_rd (int32 *data, int32 addr, int32 access);
@@ -125,6 +118,7 @@ t_stat uba_dep (t_value val, t_addr addr, UNIT *uptr, int32 sw);
t_stat uba_reset (DEVICE *dptr);
d10 ReadIO (a10 ea);
void WriteIO (a10 ea, d10 val, int32 mode);
t_bool dev_conflict (uint32 nba, DIB *curr);
/* Unibus adapter data structures
@@ -133,6 +127,14 @@ void WriteIO (a10 ea, d10 val, int32 mode);
uba_reg UBA register list
*/
DIB ubmp1_dib = { 1, IOBA_UBMAP1, IOLN_UBMAP1, &ubmap_rd, &ubmap_wr };
DIB ubmp3_dib = { 1, IOBA_UBMAP3, IOLN_UBMAP3, &ubmap_rd, &ubmap_wr };
DIB ubcs1_dib = { 1, IOBA_UBCS1, IOLN_UBCS1, &ubs_rd, &ubs_wr };
DIB ubcs3_dib = { 1, IOBA_UBCS3, IOLN_UBCS3, &ubs_rd, &ubs_wr };
DIB ubmn1_dib = { 1, IOBA_UBMNT1, IOLN_UBMNT1, &rd_zro, &wr_nop };
DIB ubmn3_dib = { 1, IOBA_UBMNT3, IOLN_UBMNT3, &rd_zro, &wr_nop };
DIB msys_dib = { 1, 00100000, 00100001, &rd_zro, &wr_nop };
UNIT uba_unit[] = {
{ UDATA (NULL, UNIT_FIX, UMAP_MEMSIZE) },
{ UDATA (NULL, UNIT_FIX, UMAP_MEMSIZE) } };
@@ -151,50 +153,28 @@ DEVICE uba_dev = {
/* PDP-11 I/O structures */
struct iolink { /* I/O page linkage */
int32 low; /* low I/O addr */
int32 high; /* high I/O addr */
int32 *enb; /* enable flag */
t_stat (*read)(); /* read routine */
t_stat (*write)(); }; /* write routine */
/* Table of I/O devices and corresponding read/write routines
The expected Unibus adapter number is included as the high 2 bits */
struct iolink iotable[] = {
{ IO_UBA1+IOBA_RP, IO_UBA1+IOBA_RP+IOLN_RP,
NULL, &rp_rd, &rp_wr }, /* disk */
{ IO_UBA3+IOBA_TU, IO_UBA3+IOBA_TU+IOLN_TU,
NULL, &tu_rd, &tu_wr }, /* mag tape */
{ IO_UBA3+IOBA_DZ, IO_UBA3+IOBA_DZ+IOLN_DZ,
&dz_enb, &dz_rd, &dz_wr }, /* terminal mux */
{ IO_UBA3+IOBA_LP20, IO_UBA3+IOBA_LP20+IOLN_LP20,
NULL, &lp20_rd, &lp20_wr }, /* line printer */
{ IO_UBA3+IOBA_PT, IO_UBA3+IOBA_PT+IOLN_PT,
&pt_enb, &pt_rd, &pt_wr }, /* paper tape */
{ IO_UBA1+IOBA_UBMAP, IO_UBA1+IOBA_UBMAP+IOLN_UBMAP,
NULL, &ubmap_rd, &ubmap_wr }, /* Unibus 1 map */
{ IO_UBA3+IOBA_UBMAP, IO_UBA3+IOBA_UBMAP+IOLN_UBMAP,
NULL, &ubmap_rd, &ubmap_wr }, /* Unibus 3 map */
{ IO_UBA1+IOBA_UBCS, IO_UBA1+IOBA_UBCS+IOLN_UBCS,
NULL, &ubs_rd, &ubs_wr }, /* Unibus 1 c/s */
{ IO_UBA3+IOBA_UBCS, IO_UBA3+IOBA_UBCS+IOLN_UBCS,
NULL, &ubs_rd, &ubs_wr }, /* Unibus 3 c/s */
{ IO_UBA1+IOBA_UBMNT, IO_UBA1+IOBA_UBMNT+IOLN_UBMNT,
NULL, &rd_zro, &wr_nop }, /* Unibus 1 maint */
{ IO_UBA3+IOBA_UBMNT, IO_UBA3+IOBA_UBMNT+IOLN_UBMNT,
NULL, &rd_zro, &wr_nop }, /* Unibus 3 maint */
{ IO_UBA3+IOBA_TCU, IO_UBA3+IOBA_TCU+IOLN_TCU,
NULL, &tcu_rd, &wr_nop }, /* TCU150 */
{ 00100000, 00100000, NULL, &rd_zro, &wr_nop }, /* Mem sys stat */
{ 0, 0, 0, NULL, NULL } };
DIB *dib_tab[] = {
&rp_dib,
&tu_dib,
&dz_dib,
&lp20_dib,
&pt_dib,
&tcu_dib,
&ubmp1_dib,
&ubmp3_dib,
&ubcs1_dib,
&ubcs3_dib,
&ubmn1_dib,
&ubmn3_dib,
&msys_dib,
NULL };
/* Interrupt request to interrupt action map */
int32 (*int_ack[32])() = { /* int ack routines */
NULL, NULL, NULL, NULL, NULL, NULL, &rp_inta, &tu_inta,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
&dz_rxinta, &dz_txinta, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, &lp20_inta, NULL, NULL, NULL, NULL, NULL };
/* Interrupt request to vector map */
@@ -393,14 +373,14 @@ return;
d10 ReadIO (a10 ea)
{
int32 n, pa, val;
struct iolink *p;
uint32 pa = (uint32) ea;
int32 i, n, val;
DIB *dibp;
pa = (int32) ea; /* cvt addr to 32b */
for (p = &iotable[0]; p -> low != 0; p++ ) {
if ((pa >= p -> low) && (pa < p -> high) &&
((p -> enb == NULL) || *p -> enb)) {
p -> read (&val, pa, READ);
for (i = 0; dibp = dib_tab[i]; i++ ) {
if (dibp -> enb && (pa >= dibp -> ba) &&
(pa < (dibp -> ba + dibp -> lnt))) {
dibp -> rd (&val, pa, READ);
pi_eval ();
return ((d10) val); } }
UBNXM_FAIL (pa, READ);
@@ -408,14 +388,14 @@ UBNXM_FAIL (pa, READ);
void WriteIO (a10 ea, d10 val, int32 mode)
{
int32 n, pa;
struct iolink *p;
uint32 pa = (uint32) ea;
int32 i, n;
DIB *dibp;
pa = (int32) ea; /* cvt addr to 32b */
for (p = &iotable[0]; p -> low != 0; p++ ) {
if ((pa >= p -> low) && (pa < p -> high) &&
((p -> enb == NULL) || *p -> enb)) {
p -> write ((int32) val, pa, mode);
for (i = 0; dibp = dib_tab[i]; i++ ) {
if (dibp -> enb && (pa >= dibp -> ba) &&
(pa < (dibp -> ba + dibp -> lnt))) {
dibp -> wr ((int32) val, pa, mode);
pi_eval ();
return; } }
UBNXM_FAIL (pa, mode);
@@ -549,3 +529,87 @@ for (uba = 0; uba < UBANUM; uba++) {
pi_eval ();
return SCPE_OK;
}
/* Change device number for a device */
t_stat set_addr (UNIT *uptr, int32 val, char *cptr, void *desc)
{
DIB *dibp;
uint32 newba;
t_stat r;
if (cptr == NULL) return SCPE_ARG;
if ((val == 0) || (desc == NULL)) return SCPE_IERR;
dibp = (DIB *) desc;
newba = (uint32) get_uint (cptr, 8, PAMASK, &r); /* get new */
if ((r != SCPE_OK) || (newba == dibp -> ba)) return r;
if ((newba & AMASK) <= IOPAGEBASE) return SCPE_ARG; /* must be > 0 */
if (newba % ((uint32) val)) return SCPE_ARG; /* check modulus */
if (GET_IOUBA (newba) != GET_IOUBA (dibp -> ba)) return SCPE_ARG;
if (dev_conflict (newba, dibp)) return SCPE_OK;
dibp -> ba = newba; /* store */
return SCPE_OK;
}
/* Show device address */
t_stat show_addr (FILE *st, UNIT *uptr, int32 val, void *desc)
{
DIB *dibp;
if (desc == NULL) return SCPE_IERR;
dibp = (DIB *) desc;
if (dibp -> ba <= IOPAGEBASE) return SCPE_IERR;
fprintf (st, "address=%07o", dibp -> ba);
if (dibp -> lnt > 1)
fprintf (st, "-%07o", dibp -> ba + dibp -> lnt - 1);
return SCPE_OK;
}
/* Enable or disable a device */
t_stat set_enbdis (UNIT *uptr, int32 val, char *cptr, void *desc)
{
int32 i;
DEVICE *dptr;
DIB *dibp;
UNIT *up;
if (cptr != NULL) return SCPE_ARG;
if ((uptr == NULL) || (desc == NULL)) return SCPE_IERR;
dptr = find_dev_from_unit (uptr); /* find device */
if (dptr == NULL) return SCPE_IERR;
dibp = (DIB *) desc;
if ((val ^ dibp -> enb) == 0) return SCPE_OK; /* enable chg? */
if (val) { /* enable? */
if (dev_conflict (dibp -> ba, dibp)) return SCPE_OK; }
else { /* disable */
for (i = 0; i < dptr -> numunits; i++) { /* check units */
up = (dptr -> units) + i;
if ((up -> flags & UNIT_ATT) || sim_is_active (up))
return SCPE_NOFNC; } }
dibp -> enb = val;
if (dptr -> reset) return dptr -> reset (dptr);
else return SCPE_OK;
}
/* Test for conflict in device addresses */
t_bool dev_conflict (uint32 nba, DIB *curr)
{
uint32 i, end;
DIB *dibp;
end = nba + curr -> lnt - 1; /* get end */
for (i = 0; dibp = dib_tab[i]; i++) { /* loop thru dev */
if (!dibp -> enb || (dibp == curr)) continue; /* skip disabled */
if (((nba >= dibp -> ba) &&
(nba < (dibp -> ba + dibp -> lnt))) ||
((end >= dibp -> ba) &&
(end < (dibp -> ba + dibp -> lnt)))) {
printf ("Device address conflict at %07o\n", dibp -> ba);
if (sim_log) fprintf (sim_log,
"Device number conflict at %07o\n", dibp -> ba);
return TRUE; } }
return FALSE;
}

View File

@@ -1,6 +1,6 @@
/* pdp10_lp20.c: PDP-10 LP20 line printer simulator
Copyright (c) 1993-2001, Robert M Supnik
Copyright (c) 1993-2002, 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 @@
lp20 line printer
30-May-02 RMS Widened POS to 32b
06-Jan-02 RMS Added enable/disable support
30-Nov-01 RMS Added extended SET/SHOW support
*/
@@ -150,6 +152,9 @@ int32 lp20_irq = 0; /* int request */
int32 lp20_stopioe = 0; /* stop on error */
int16 txram[TX_SIZE] = { 0 }; /* translation RAM */
int16 davfu[DV_SIZE] = { 0 }; /* DAVFU */
t_stat lp20_rd (int32 *data, int32 pa, int32 access);
t_stat lp20_wr (int32 data, int32 pa, int32 access);
t_stat lp20_svc (UNIT *uptr);
t_stat lp20_reset (DEVICE *dptr);
t_stat lp20_attach (UNIT *uptr, char *ptr);
@@ -167,6 +172,8 @@ void update_lpcs (int32 flg);
lp20_reg LPT register list
*/
DIB lp20_dib = { 1, IOBA_LP20, IOLN_LP20, &lp20_rd, &lp20_wr };
UNIT lp20_unit = {
UDATA (&lp20_svc, UNIT_SEQ+UNIT_ATTABLE, 0), SERIAL_OUT_WAIT };
@@ -188,7 +195,7 @@ REG lp20_reg[] = {
{ FLDATA (ERR, lpcsa, CSR_V_ERR) },
{ FLDATA (DONE, lpcsa, CSR_V_DONE) },
{ FLDATA (IE, lpcsa, CSR_V_IE) },
{ DRDATA (POS, lp20_unit.pos, 31), PV_LEFT },
{ DRDATA (POS, lp20_unit.pos, 32), PV_LEFT },
{ DRDATA (TIME, lp20_unit.wait, 24), PV_LEFT },
{ FLDATA (STOP_IOE, lp20_stopioe, 0) },
{ BRDATA (TXRAM, txram, 8, 12, TX_SIZE) },
@@ -197,6 +204,12 @@ REG lp20_reg[] = {
MTAB lp20_mod[] = {
{ UNIT_DUMMY, 0, NULL, "VFUCLEAR", &lp20_clear_vfu },
{ MTAB_XTD|MTAB_VDV, 004, "ADDRESS", "ADDRESS",
&set_addr, &show_addr, &lp20_dib },
{ MTAB_XTD|MTAB_VDV, 1, NULL, "ENABLED",
&set_enbdis, NULL, &lp20_dib },
{ MTAB_XTD|MTAB_VDV, 0, NULL, "DISABLED",
&set_enbdis, NULL, &lp20_dib },
{ 0 } };
DEVICE lp20_dev = {

View File

@@ -1,6 +1,6 @@
/* pdp10_mdfp.c: PDP-10 multiply/divide and floating point simulator
Copyright (c) 1993-2001, Robert M Supnik
Copyright (c) 1993-2002, 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"),

View File

@@ -1,6 +1,6 @@
/* pdp10_pag.c: PDP-10 paging subsystem simulator
Copyright (c) 1993-2001, Robert M Supnik
Copyright (c) 1993-2002, 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"),

View File

@@ -1,6 +1,6 @@
/* pdp10_pt.c: PDP-10 Unibus paper tape reader/punch simulator
Copyright (c) 1993-2001, Robert M Supnik
Copyright (c) 1993-2002, 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 @@
ptr paper tape reader
ptp paper tape punch
30-May-02 RMS Widened POS to 32b
06-Jan-02 RMS Revised enable/disable support
29-Nov-01 RMS Added read only unit support
07-Sep-01 RMS Revised disable mechanism
*/
@@ -42,7 +44,9 @@ int32 ptr_csr = 0; /* control/status */
int32 ptr_stopioe = 0; /* stop on error */
int32 ptp_csr = 0; /* control/status */
int32 ptp_stopioe = 0; /* stop on error */
int32 pt_enb = 0; /* device enable */
t_stat pt_rd (int32 *data, int32 PA, int32 access);
t_stat pt_wr (int32 data, int32 PA, int32 access);
t_stat ptr_svc (UNIT *uptr);
t_stat ptp_svc (UNIT *uptr);
t_stat ptr_reset (DEVICE *dptr);
@@ -59,6 +63,8 @@ t_stat ptp_detach (UNIT *uptr);
ptr_reg PTR register list
*/
DIB pt_dib = { 0, IOBA_PT, IOLN_PT, &pt_rd, &pt_wr };
UNIT ptr_unit = {
UDATA (&ptr_svc, UNIT_SEQ+UNIT_ATTABLE+UNIT_ROABLE, 0),
SERIAL_IN_WAIT };
@@ -71,14 +77,23 @@ REG ptr_reg[] = {
{ FLDATA (BUSY, ptr_csr, CSR_V_BUSY) },
{ FLDATA (DONE, ptr_csr, CSR_V_DONE) },
{ FLDATA (IE, ptr_csr, CSR_V_IE) },
{ DRDATA (POS, ptr_unit.pos, 31), PV_LEFT },
{ DRDATA (POS, ptr_unit.pos, 32), PV_LEFT },
{ DRDATA (TIME, ptr_unit.wait, 24), PV_LEFT },
{ FLDATA (STOP_IOE, ptr_stopioe, 0) },
{ FLDATA (*DEVENB, pt_enb, 0), REG_HRO },
{ FLDATA (*DEVENB, pt_dib.enb, 0), REG_HRO },
{ NULL } };
MTAB ptr_mod[] = {
{ MTAB_XTD|MTAB_VDV, 0, "ADDRESS", NULL,
NULL, &show_addr, &pt_dib },
{ MTAB_XTD|MTAB_VDV, 1, NULL, "ENABLED",
&set_enbdis, NULL, &pt_dib },
{ MTAB_XTD|MTAB_VDV, 0, NULL, "DISABLED",
&set_enbdis, NULL, &pt_dib },
{ 0 } };
DEVICE ptr_dev = {
"PTR", &ptr_unit, ptr_reg, NULL,
"PTR", &ptr_unit, ptr_reg, ptr_mod,
1, 10, 31, 1, 8, 8,
NULL, NULL, &ptr_reset,
NULL, &ptr_attach, &ptr_detach };
@@ -100,14 +115,23 @@ REG ptp_reg[] = {
{ FLDATA (ERR, ptp_csr, CSR_V_ERR) },
{ FLDATA (DONE, ptp_csr, CSR_V_DONE) },
{ FLDATA (IE, ptp_csr, CSR_V_IE) },
{ DRDATA (POS, ptp_unit.pos, 31), PV_LEFT },
{ DRDATA (POS, ptp_unit.pos, 32), PV_LEFT },
{ DRDATA (TIME, ptp_unit.wait, 24), PV_LEFT },
{ FLDATA (STOP_IOE, ptp_stopioe, 0) },
{ FLDATA (*DEVENB, pt_enb, 0), REG_HRO },
{ FLDATA (*DEVENB, pt_dib.enb, 0), REG_HRO },
{ NULL } };
MTAB ptp_mod[] = {
{ MTAB_XTD|MTAB_VDV, 0, "ADDRESS", NULL,
NULL, &show_addr, &pt_dib },
{ MTAB_XTD|MTAB_VDV, 1, NULL, "ENABLED",
&set_enbdis, NULL, &pt_dib },
{ MTAB_XTD|MTAB_VDV, 0, NULL, "DISABLED",
&set_enbdis, NULL, &pt_dib },
{ 0 } };
DEVICE ptp_dev = {
"PTP", &ptp_unit, ptp_reg, NULL,
"PTP", &ptp_unit, ptp_reg, ptp_mod,
1, 10, 31, 1, 8, 8,
NULL, NULL, &ptp_reset,
NULL, &ptp_attach, &ptp_detach };

View File

@@ -1,6 +1,6 @@
/* pdp10_rp.c - RH11/RP04/05/06/07 RM02/03/05/80 "Massbus" disk controller
Copyright (c) 1993-2001, Robert M Supnik
Copyright (c) 1993-2002, 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"),
@@ -339,14 +339,16 @@ int reg_in_drive[32] = {
0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1,
1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
void update_rpcs (int32 flags, int32 drv);
void rp_go (int32 drv, int32 fnc);
t_stat rp_set_size (UNIT *uptr, int32 val, char *cptr, void *desc);
t_stat rp_rd (int32 *data, int32 PA, int32 access);
t_stat rp_wr (int32 data, int32 PA, int32 access);
t_stat rp_svc (UNIT *uptr);
t_stat rp_reset (DEVICE *dptr);
t_stat rp_boot (int32 unitno);
t_stat rp_attach (UNIT *uptr, char *cptr);
t_stat rp_detach (UNIT *uptr);
void update_rpcs (int32 flags, int32 drv);
void rp_go (int32 drv, int32 fnc);
t_stat rp_set_size (UNIT *uptr, int32 val, char *cptr, void *desc);
/* RP data structures
@@ -356,6 +358,8 @@ t_stat rp_detach (UNIT *uptr);
rp_mod RP modifier list
*/
DIB rp_dib = { 1, IOBA_RP, IOLN_RP, &rp_rd, &rp_wr };
UNIT rp_unit[] = {
{ UDATA (&rp_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE+
UNIT_ROABLE+(RP06_DTYPE << UNIT_V_DTYPE), RP06_SIZE) },
@@ -406,7 +410,7 @@ REG rp_reg[] = {
{ NULL } };
MTAB rp_mod[] = {
{ UNIT_WLK, 0, "write enabled", "ENABLED", NULL },
{ UNIT_WLK, 0, "write enabled", "WRITEENABLED", NULL },
{ UNIT_WLK, UNIT_WLK, "write locked", "LOCKED", NULL },
{ (UNIT_DTYPE+UNIT_ATT), (RM03_DTYPE << UNIT_V_DTYPE) + UNIT_ATT,
"RM03", NULL, NULL },
@@ -446,6 +450,8 @@ MTAB rp_mod[] = {
NULL, "RM05", &rp_set_size },
{ (UNIT_AUTO+UNIT_DTYPE), (RP07_DTYPE << UNIT_V_DTYPE),
NULL, "RP07", &rp_set_size },
{ MTAB_XTD|MTAB_VDV, 0, "ADDRESS", NULL,
NULL, &show_addr, &rp_dib },
{ 0 } };
DEVICE rp_dev = {

View File

@@ -1,6 +1,6 @@
/* pdp10_sys.c: PDP-10 simulator interface
Copyright (c) 1993-2001, Robert M Supnik
Copyright (c) 1993-2002, 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,6 +23,7 @@
be used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from Robert M Supnik.
22-Apr-02 RMS Removed magtape record length error
17-Sep-01 RMS Removed multiconsole support
25-Aug-01 RMS Enabled DZ11
27-May-01 RMS Added multiconsole support
@@ -72,9 +73,9 @@ DEVICE *sim_devices[] = {
&ptr_dev,
&ptp_dev,
&lp20_dev,
&dz_dev,
&rp_dev,
&tu_dev,
&dz_dev,
NULL };
const char *sim_stop_messages[] = {
@@ -89,7 +90,6 @@ const char *sim_stop_messages[] = {
"Nested indirect address limit exceeded",
"Nested XCT limit exceeded",
"Invalid I/O controller",
"Invalid magtape record length",
"Address stop",
"Panic stop" };

View File

@@ -1,6 +1,6 @@
/* pdp10_tim.c: PDP-10 tim subsystem simulator
Copyright (c) 1993-2001, Robert M Supnik
Copyright (c) 1993-2002, 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 @@
tim timer subsystem
06-Jan-02 RMS Added enable/disable support
02-Dec-01 RMS Fixed bug in ITS PC sampling (found by Dave Conroy)
31-Aug-01 RMS Changed int64 to t_int64 for Windoze
17-Jul-01 RMS Moved function prototype
@@ -54,6 +55,8 @@ d10 quant = 0; /* ITS quantum */
int32 diagflg = 0; /* diagnostics? */
int32 tmxr_poll = TIM_DELAY * DZ_MULT; /* term mux poll */
t_stat tcu_rd (int32 *data, int32 PA, int32 access);
extern t_stat wr_nop (int32 data, int32 PA, int32 access);
t_stat tim_svc (UNIT *uptr);
t_stat tim_reset (DEVICE *dptr);
extern d10 Read (a10 ea, int32 prv);
@@ -69,6 +72,8 @@ extern int32 pi_eval (void);
tim_reg TIM register list
*/
DIB tcu_dib = { 1, IOBA_TCU, IOLN_TCU, &tcu_rd, &wr_nop };
UNIT tim_unit = { UDATA (&tim_svc, 0, 0), TIM_DELAY };
REG tim_reg[] = {
@@ -84,6 +89,12 @@ REG tim_reg[] = {
MTAB tim_mod[] = {
{ UNIT_Y2K, 0, "non Y2K OS", "NOY2K", NULL },
{ UNIT_Y2K, UNIT_Y2K, "Y2K OS", "Y2K", NULL },
{ MTAB_XTD|MTAB_VDV, 000, "ADDRESS", NULL,
NULL, &show_addr, &tcu_dib },
{ MTAB_XTD|MTAB_VDV, 1, NULL, "ENABLED",
&set_enbdis, NULL, &tcu_dib },
{ MTAB_XTD|MTAB_VDV, 0, NULL, "DISABLED",
&set_enbdis, NULL, &tcu_dib },
{ 0 } };
DEVICE tim_dev = {

View File

@@ -1,6 +1,6 @@
/* pdp10_tu.c - PDP-10 RH11/TM03/TU45 magnetic tape simulator
Copyright (c) 1993-2001, Robert M Supnik
Copyright (c) 1993-2002, 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,9 @@
tu RH11/TM03/TU45 magtape
30-May-02 RMS Widened POS to 32b
22-Apr-02 RMS Changed record length error code
06-Jan-02 RMS Revised enable/disable support
30-Nov-01 RMS Added read only unit, extended SET/SHOW support
24-Nov-01 RMS Changed POS, FLG, UST to arrays
23-Oct-01 RMS Fixed bug in error interrupts
@@ -296,6 +299,8 @@ int fmt_test[16] = { /* fmt bytes/10 wd */
int den_test[8] = { /* valid densities */
0, 0, 0, 1, 1, 0, 0, 0 };
t_stat tu_rd (int32 *data, int32 PA, int32 access);
t_stat tu_wr (int32 data, int32 PA, int32 access);
t_stat tu_svc (UNIT *uptr);
t_stat tu_reset (DEVICE *dptr);
t_stat tu_attach (UNIT *uptr, char *cptr);
@@ -313,6 +318,8 @@ t_stat tu_vlock (UNIT *uptr, int32 val, char *cptr, void *desc);
tu_mod TU modifier list
*/
DIB tu_dib = { 1, IOBA_TU, IOLN_TU, &tu_rd, &tu_wr };
UNIT tu_unit[] = {
{ UDATA (&tu_svc, UNIT_ATTABLE+UNIT_DISABLE+UNIT_ROABLE, 0) },
{ UDATA (&tu_svc, UNIT_ATTABLE+UNIT_DISABLE+UNIT_ROABLE, 0) },
@@ -342,7 +349,7 @@ REG tu_reg[] = {
{ FLDATA (STOP_IOE, tu_stopioe, 0) },
{ DRDATA (TIME, tu_time, 24), PV_LEFT },
{ URDATA (UST, tu_unit[0].USTAT, 8, 17, 0, TU_NUMDR, 0) },
{ URDATA (POS, tu_unit[0].pos, 8, 31, 0,
{ URDATA (POS, tu_unit[0].pos, 8, 32, 0,
TU_NUMDR, PV_LEFT | REG_RO) },
{ URDATA (FLG, tu_unit[0].flags, 8, UNIT_W_UF, UNIT_V_UF - 1,
TU_NUMDR, REG_HRO) },
@@ -350,8 +357,10 @@ REG tu_reg[] = {
{ NULL } };
MTAB tu_mod[] = {
{ UNIT_WLK, 0, "write enabled", "ENABLED", &tu_vlock },
{ UNIT_WLK, 0, "write enabled", "WRITEENABLED", &tu_vlock },
{ UNIT_WLK, UNIT_WLK, "write locked", "LOCKED", &tu_vlock },
{ MTAB_XTD|MTAB_VDV, 0, "ADDRESS", NULL,
NULL, &show_addr, &tu_dib },
{ 0 } };
DEVICE tu_dev = {
@@ -763,7 +772,7 @@ case FNC_WCHKF: /* wcheck = read */
tufs = tufs | FS_TMK;
uptr -> pos = uptr -> pos + sizeof (t_mtrlnt);
break; }
if (tbc > XBUFLNT) return STOP_MTRLNT; /* bad rec length? */
if (tbc > XBUFLNT) return SCPE_MTRLNT; /* bad rec length? */
i = fxread (xbuf, sizeof (int8), tbc, uptr -> fileref);
for ( ; i < tbc + 4; i++) xbuf[i] = 0; /* fill/pad with 0's */
err = ferror (uptr -> fileref);
@@ -825,7 +834,7 @@ case FNC_WCHKR: /* wcheck = read */
tufs = tufs | FS_TMK;
uptr -> pos = uptr -> pos - sizeof (t_mtrlnt);
break; }
if (tbc > XBUFLNT) return STOP_MTRLNT; /* bad rec length? */
if (tbc > XBUFLNT) return SCPE_MTRLNT; /* bad rec length? */
fseek (uptr -> fileref, uptr -> pos - sizeof (t_mtrlnt)
- ((tbc + 1) & ~1), SEEK_SET);
fxread (xbuf + 4, sizeof (int8), tbc, uptr -> fileref);

View File

@@ -1,6 +1,6 @@
/* pdp10_xtnd.c: PDP-10 extended instruction simulator
Copyright (c) 1993-2001, Robert M Supnik
Copyright (c) 1993-2002, 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"),