1. New Features 1.1 Directory and documentation - Only common files (SCP and libraries) are in the top level directory. Individual simulator files are in their individual directories. - simh_doc.txt has been split up. simh_doc.txt now documents only SCP. The individual simulators are documented in separate text files in their own directories. - mingw_build.bat is a batch file for the MINGW/gcc environment that will build all the simulators, assuming the root directory structure is at c:\sim. - Makefile is a UNIX make file for the gcc environment that will build all the simulators, assuming the root directory is at c:\sim. 1.2 SCP - DO <file name> executes the SCP commands in the specified file. - Replicated registers in unit structures can now be declared as arrays for examine, modify, save, and restore. Most replicated unit registers (for example, mag tape position registers) have been changed to arrays. - The ADD/REMOVE commands have been replaced by SET unit ONLINE and SET unit OFFLINE, respectively. - Register names that are unique within an entire simulator do not have to be prefaced with the device name. - The ATTACH command can attach files read only, either under user option (-r), or because the attached file is ready only. - The SET/SHOW capabilities have been extended. New forms include: SET <dev> param{=value}{ param ...} SET <unit> param{=value}{ param ...} SHOW <dev> {param param ...} SHOW <unit> {param param ...} - Multiple breakpoints have been implemented. Breakpoints are set/cleared/displayed by: BREAK addr_list{[count]} NOBREAK addr_list SHOW BREAK addr_list 1.3 PDP-11 simulator - Unibus map implemented, with 22b RP controller (URH70) or 18b RP controller (URH11) (in debug). - All DMA peripherals rewritten to use map. - Many peripherals modified for source sharing with VAX. - RQDX3 implemented. - Bugs fixed in RK11 and RL11 write check. 1.4 PDP-10 simulator - ITS 1-proceed implemented. - Bugs fixed in ITS PC sampling and LPMR 1.5 18b PDP simulator - Interrupts split out to multiple levels to allow easier expansion. 1.5 IBM System 3 Simulator - Written by Charles (Dutch) Owen. 1.6 VAX Simulator (in debug) - Simulates MicroVAX 3800 (KA655) with 16MB-64MB memory, RQDX3, RLV12, TSV11, DZV11, LPV11, PCV11. - CDROM capability has been added to the RQDX3, to allow testing with VMS hobbyist images. 1.7 SDS 940 Simulator (not tested) - Simulates SDS 940, 16K-64K memory, fixed and moving head disk, magtape, line printer, console. 1.8 Altair Z80 - Revised from Charles (Dutch) Owen's original by Peter Schorn. - MITS 8080 with full Z80 simulation. - 4K and 8K BASIC packages, Prolog package. 1.9 Interdata The I4 simulator has been withdrawn for major rework. Look for a complete 16b/32b Interdata simulator sometime next year. 2. Release Notes 2.1 SCP SCP now allows replicated registers in unit structures to be modelled as arrays. All replicated register declarations have been replaced by register array declarations. As a result, save files from prior revisions will generate errors after restoring main memory. 2.2 PDP-11 The Unibus map code is in debug. The map was implemented primarily to allow source sharing with the VAX, which requires a DMA map. DMA devices work correctly with the Unibus map disabled. The RQDX3 simulator has run a complete RSTS/E SYSGEN, with multiple drives, and booted the completed system from scratch. 2.3 VAX The VAX simulator will run the boot code up to the >>> prompt. It can successfully process a SHOW DEVICE command. It runs the HCORE instruction diagnostic. It can boot the hobbyist CD through SYSBOOT and through the date/time dialog and restore the hobbyist CD, using standalone backup. On the boot of the restored disk, it gets to the date/time dialog, and then crashes. 2.4 SDS 940 The SDS 940 is untested, awaiting real code. 2.5 GCC Optimization At -O2 and above, GCC does not correctly compile the simulators which use setjmp-longjmp (PDP-11, PDP-10, VAX). A working hypothesis is that optimized state maintained in registers is being used in the setjmp processing routine. On the PDP-11 and PDP-10, all of this state has been either made global, or volatile, to encourage GCC to keep the state up to date in memory. The VAX is still vulnerable. 3. Work list 3.1 SCP - Better ENABLE/DISABLE. 3.2 PDP-11 RQDX3 Software mapped mode, RCT read simulation, VMS debug.
472 lines
16 KiB
Text
472 lines
16 KiB
Text
The IBM System/3 simulator is configured as follows:
|
|
|
|
CPU 5410 (Model 10) CPU with 64KB of memory.
|
|
PKB 5471 Printer/Keyboard console.
|
|
CDR 1442 Card Reader
|
|
CDP 1442 Card Punch
|
|
CDP2 1442 2nd stacker
|
|
LPT 1403 Line Printer
|
|
R1 5444 Top Drive (removeable)
|
|
F1 5444 Top Drive (fixed)
|
|
R2 5444 Bottom Drive (removeable)
|
|
F2 5444 Bottom Drive (fixed
|
|
|
|
The only CPU options are to set Model 15 mode (not implemented), DPF
|
|
(Dual Programming Facility, not implemented), and the memory size 8K, 16K,
|
|
32K, 48K, or 64K.
|
|
|
|
CPU registers are the standard System/3 set:
|
|
|
|
name size Description
|
|
|
|
IAR-P1 16 Instruction Address Register for Program Level 1
|
|
ARR-P2 16 Address Recall Register for Program Level 1
|
|
IAR-P2 16 IAR for Program Level 2 (not implemented)
|
|
ARR-P2 16 ARR for Program Level 2 (not implemented)
|
|
AAR 16 A-Address Register
|
|
BAR 16 B-Address Register
|
|
PSR 16 Program Status Register
|
|
XR1 16 Index Register 1
|
|
XR2 16 Index Register 2
|
|
IAR<0:7> 16 IAR for interrupt level 0 thru 7
|
|
ARR<0:7> 16 ARR for interrupt level 0 thru 7
|
|
|
|
Plus these simulator registers:
|
|
|
|
IAR 16 Value of last IAR used.
|
|
LEVEL 8 Current operating level (8=P1, 9=P2,
|
|
0 thru 7 = Interrupt level)
|
|
SR 16 Front Panel switches
|
|
INT 16 Interrupt Request Flags
|
|
WRU 8 Simulator Interrupt Character
|
|
BREAK 17 Breakpoint Address
|
|
DEBUG 16 Debugging bits:
|
|
0x01: Write all instructions executed to
|
|
file trace.log.
|
|
0x02: Write details of all Disk I/O
|
|
requests to trace.log.
|
|
0x80: Breakpoint on first character
|
|
written to 5471 printer.
|
|
|
|
1 5471 Printer/Keyboard
|
|
|
|
This is the operator console. It has the following registers:
|
|
|
|
FLAG 5471 Flag Bytes
|
|
IBUF: Input character from keyboard
|
|
OBUF: Output character to printer
|
|
POS: Number of characters printed
|
|
TIME: Delay for device operation
|
|
REQKEY: ASCII value of key mapped to 5471 REQUEST key
|
|
RTNKEY: ASCII value of key mapped to 5471 RETURN key
|
|
ENDKEY: ASCII value of key mapped to 5471 END key
|
|
CANKEY: ASCII value of key mapped to 5471 CANCEL key
|
|
|
|
|
|
2 1442 Card Reader. This reader reads 80-column cards; the input
|
|
is usually an ASCII file which is translated to EBCDIC when read,
|
|
but optionally can be a binary file in EBCDIC format (such as an
|
|
object program).
|
|
|
|
LAST Last card switch
|
|
ERR Card Reader Error
|
|
NOTRDY 1442 reader not ready (not attached or past EOF)
|
|
DAR Data Address Register (shared with punch)
|
|
LCR Length Count Register (shared with punch)
|
|
EBCDIC EBCDIC mode flag: if 1, input is 80-col EBCDIC binary.
|
|
(IPL from 1442 automatically sets this to 1).
|
|
S2 Stacker 2 is selected when this is 1
|
|
POS Number of cards read
|
|
TIME Device Delay
|
|
|
|
The real hardware 1442 had only 1 hopper for cards, whether
|
|
these were used for blank cards for punching, or cards to be
|
|
read. Cards could be read without a feed cycle, then
|
|
punched. When punching cards, the SCP does a read of a card,
|
|
makes sure it is blank, and then punches it. To simulate
|
|
this without requiring that a stack of blank lines be attached
|
|
to the card reader device, a special feature of the simulator
|
|
is this: if no file is attached to the cdr device, but a file
|
|
is attached to the cdp or the cdp2 devices, any read from the
|
|
reader will return a blank card -- i.e. when punching, an
|
|
unattached cdr device is assumed to be loaded with an unlimited
|
|
supply of blank cards.
|
|
|
|
|
|
3 1442 Card Punch. Normally cards are written to the attached
|
|
disk file as ASCII with newline/cr delimiters. But an optional
|
|
flag allows writing as 80-column binary EBCDIC.
|
|
|
|
ERR Card Punch Error
|
|
EBCDIC When this is 1, output will be 80-col EBCDIC.
|
|
S2 When this is 1, output is placed in stacker 2
|
|
NOTRDY 1442 punch not ready (not attached)
|
|
DAR Data Address Register (shared with reader)
|
|
LCR Length Count Register (shared with reader)
|
|
POS Number of cards punched
|
|
TIME Device Delay
|
|
|
|
4 1442 Stacker 2. When cards are to be punched in stacker 2,
|
|
attach a disk file to this device (cdp2) to hold that output.
|
|
Note: When SCP punches cards, the default is to punch in
|
|
stacker 2.
|
|
|
|
POS0 Number of cards punched.
|
|
|
|
5 1403 Printer. This is a 132-column output device, emulating
|
|
the famous IBM 1403, models 2, 6, and N1. Output is always
|
|
translated to ASCII with newline/CR delimiters. Page advance
|
|
is output as a form feed.
|
|
|
|
ERR 1403 error flags
|
|
LPDAR Data Address Register
|
|
LPFLR Forms Length Register
|
|
LPIAR Image Address Register
|
|
LINECT Current Line on form
|
|
POS Number of lines printed
|
|
|
|
6 5444 Disk Drives (R1, R2, F1, F2)
|
|
|
|
The 5444 came as a set of two drives, each with two disks. The
|
|
top disk in a drive was removable, the bottom fixed. The first
|
|
drive consists of disks R1 and F1, the second drive R2 and F2.
|
|
Each disk holds 2,467,600 bytes of user data, plus 3 alternate
|
|
tracks and a CE track. Flagging of alternate tracks is not
|
|
supported in this version of the simulator.
|
|
|
|
NOTRDY Drive not ready (not attached)
|
|
SEEK Drive is busy with a seek operation
|
|
DAR Data Address Register
|
|
CAR Control Address Register
|
|
ERR Error Flags (16 bits)
|
|
CYL Current Cylinder (0 thru 203)
|
|
HEAD Current head (0 or 1)
|
|
POS Current position in attached disk file
|
|
TIME Device Delay
|
|
|
|
7 Symbolic Display and Input
|
|
|
|
The System/3 Simulator supports symbolic display and input.
|
|
Display is controlled by command line switches:
|
|
|
|
(none) display as hex EBCDIC
|
|
-c display bytes as characters
|
|
-m display instruction mnemonics.
|
|
-a display a 256-byte block of memory in both hex and ASCII.
|
|
|
|
The symbolic format contains the same elements as the machine
|
|
language operation, but not always in the same order. The
|
|
operation code frequently specifies both the opcode and the Q byte,
|
|
and the top nybble of the opcode is determined by the format of the
|
|
addresses.
|
|
|
|
Addresses take two forms: the direct address in hex, or a relative
|
|
address specified thusly: (byte,XRx) where 'byte' is a 1-byte
|
|
offset, and XRx is either XR1 or XR2 for the two index registers.
|
|
Use these formats when 'address' is indicated below:
|
|
|
|
When 'reg' is mentioned, a mnemonic may be used for the register,
|
|
thusly:
|
|
|
|
IAR Instruction Address Register for the current program level
|
|
ARR Address Recall Register for the current program level
|
|
P1IAR IAR for Program Level 1
|
|
P2IAR IAR for Program Level 2
|
|
PSR Program Status Register
|
|
XR1 Index Register 1
|
|
XR2 Index Register 2
|
|
IARx IAR for the interrupt level x (x = 0 thru 7)
|
|
|
|
All other operands mentioned below are single-byte hex, except for
|
|
the length (len) operand of the two-address instructions, which is a
|
|
decimal length in the range 1-256.
|
|
|
|
In operations where there is a source and a destination, the
|
|
destination is always operand 1, the source is operand 2.
|
|
|
|
No-address formats:
|
|
------------------
|
|
|
|
HPL hex,hex Halt Program Level, the operands are the
|
|
Q and R bytes.
|
|
|
|
|
|
One-address formats:
|
|
-------------------
|
|
|
|
A reg,address Add to register
|
|
CLI address,byte Compare Logical Immediate
|
|
MVI address,byte Move Immediate
|
|
TBF address,mask Test Bits Off
|
|
TBN address,mask Test Bits On
|
|
SBF address,mask Set Bits Off
|
|
SBN address,mask Set Bits On
|
|
ST reg,address Store Register
|
|
L reg,address Load Register
|
|
LA reg,address Load Address (reg can only be XR1 or XR2)
|
|
JC address,cond Jump on Condition
|
|
BC address,cond Branch on Condition
|
|
|
|
These operations do not specify a qbyte, it is implicit in the
|
|
opcode:
|
|
|
|
B address Unconditional branch to address
|
|
BE address Branch Equal
|
|
BNE address Branch Not Equal
|
|
BH address Branch High
|
|
BNH address Branch Not High
|
|
BL address Branch Low
|
|
BNL address Branch Not Low
|
|
BT address Branch True
|
|
BF address Branch False
|
|
BP address Branch Plus
|
|
BM address Branch Minus
|
|
BNP address Branch Not Plus
|
|
BNM address Branch Not Minus
|
|
BZ address Branch Zero
|
|
BNZ address Branch Not Zero
|
|
BOZ address Branch Overflow Zoned
|
|
BOL address Branch Overflow Logical
|
|
BNOZ address Branch No Overflow Zoned
|
|
BNOL address Branch No Overflow Logical
|
|
NOPB address No - never branch
|
|
|
|
(substitute J for B above for a set of Jumps -- 1-byte operand (not
|
|
2), always jumps forward up to 255 bytes from the address following
|
|
the Jump instruction. In this case, 'address' cannot be less than
|
|
the current address, nor greater than the current address + 255)
|
|
|
|
Two-address formats (first address is destination, len is decimal 1-256):
|
|
-------------------
|
|
|
|
MVC address,address,len Move Characters
|
|
CLC address,address,len Compare Logical Characters
|
|
ALC address,address,len Add Logical Characters
|
|
SLC address,address,len Subtract Logical Characters
|
|
ED address,address,len Edit
|
|
ITC address,address,len Insert and Test Characters
|
|
AZ address,address,len Add Zoned Decimal
|
|
SZ address,address,len Subtract Zoned Decimal
|
|
|
|
MNN address,address Move Numeric to Numeric
|
|
MNZ address,address Move Numeric to Zone
|
|
MZZ address,address Move Zone to Zone
|
|
MZN address,address Move Zone to Numeric
|
|
|
|
I/O Format
|
|
----------
|
|
|
|
In the I/O format, there are always 3 fields:
|
|
|
|
da - Device Address 0-15 (decimal)
|
|
m - Modifier 0-1
|
|
n - Function 0-7
|
|
|
|
The meaning of these is entirely defined by the device addressed.
|
|
|
|
There may be an optional control byte, or an optional address (based
|
|
on the type of instruction).
|
|
|
|
SNS da,m,n,address Sense I/O
|
|
LIO da,m,n,address Load I/O
|
|
TIO da,m,n,address Test I/O
|
|
|
|
SIO da,m,n,cc Start I/O -- cc is a control byte
|
|
|
|
APL da,m,n Advance Program Level
|
|
|
|
|
|
8 Device Programming.
|
|
|
|
Note: On a model 15, interrupts are used for all devices. On
|
|
other models, interrupts are only used for the printer/keyboard.
|
|
|
|
This is a summary of the DA, M, N, and CC codes for all supported
|
|
devices:
|
|
|
|
5471 Printer Keyboard
|
|
---------------------
|
|
|
|
The PKB has 2 visible indicators: Proceed and Request
|
|
Pending. It has a normal keyboard and 4 special keys:
|
|
Request, Return, End, and Cancel.
|
|
|
|
SIO 1,0,0,XX Start Keyboard Operation, bit masks for XX are:
|
|
X'20': Request Pending Indicator On
|
|
X'10': Proceed Indicator On
|
|
X'04': Request Key Interrupts Enable (1) Disable (0)
|
|
X'02': Other Key Interrupts Enable (1) Disable (0)
|
|
X'01': Reset request key and other key interrupts
|
|
|
|
SIO 1,1,0,XX Start Printer Operation, bit masks for XX are:
|
|
X'80': Start Printing
|
|
X'40': Start Carrier Return
|
|
X'04': Printer Interrupt Enable(1) or Disable (0)
|
|
X'01': Reset Printer Interrupt
|
|
|
|
LIO 1,1,0,addr Load Printer Output Character
|
|
addr is address of low-order (highest numbered)
|
|
byte of two-byte field, and high-order byte
|
|
(that is, addr - 1) is loaded into output
|
|
register to print. Printing is done one character
|
|
at a time.
|
|
|
|
SNS 1,0,1,addr Sense Status Bytes 0 and 1:
|
|
Byte 0 (leftmost) is the character typed in
|
|
in EBCDIC.
|
|
Byte 1 is status:
|
|
X'80': Request key interrupt pending
|
|
X'40': End or Cancel key interrupt pending
|
|
X'20': Cancel key pressed
|
|
X'10': End Key Pressed
|
|
X'08': Return or data key interrupt pending
|
|
X'04': Return key pressed
|
|
|
|
SNS 1,0,3,addr Sense Status Bytes 2 and 3: returns 0000 in
|
|
this sim.
|
|
|
|
1442 Reader/Punch
|
|
-----------------
|
|
|
|
SIO 5,0,0,XX Feed Card without reading/punching
|
|
XX is stacker select for all functions: 0 = stacker
|
|
1 (normal), 1 = stacker 2.
|
|
|
|
SIO 5,0,1,XX Read Card
|
|
SIO 5,0,2,XX Punch and Feed
|
|
SIO 5,0,3,XX Read Column Binary
|
|
SIO 5,0,4,XX Punch with no feed
|
|
|
|
TIO 5,0,0,addr Branch to addr if not ready or busy
|
|
TIO 5,0,2,addr Branch to addr if busy
|
|
TIO 5,0,5,addr (mod 15 only) branch if interrupt pending
|
|
|
|
APL 5,0,0 Loop (or switch prog levels) if not ready/busy
|
|
APL 5,0,2 Loop (or switch) if busy
|
|
APL 5,0,5 Loop (or switch) if interrupt pending (mod 15 only)
|
|
|
|
LIO 5,0,0,addr Load 2-byte field to Length Count Register
|
|
LIO 5,0,4,addr Load 2-byte field to Data Address Register
|
|
(DAR is incremented by a read/punch operation and must
|
|
be reset every card)
|
|
|
|
SNS 5,0,1,addr Sense CE indicators (0000 returned in this sim)
|
|
SNS 5,0,2,addr Sense CE indicators (0000 returned in this sim)
|
|
SNS 5,0,3,addr Sense Status Indicators: (only simulated bits shown)
|
|
X'8000': Read Check
|
|
X'4000': Last Card
|
|
X'2000': Punch Check
|
|
X'1000': Data Overrun
|
|
X'0800': Not Ready
|
|
|
|
|
|
1403 Printer
|
|
------------
|
|
|
|
SIO 14,0,0,XX Line space XX lines (0-3 valid in XX)
|
|
SIO 14,0,2,XX Print a line space (0-3 valid in XX)
|
|
SIO 14,0,4,XX Skip Only (line number 1-112 in XX)
|
|
|
|
SIO 14,0,6,XX Print and Skip (line number 0-112 in XX)
|
|
|
|
TIO 14,0,0,addr Branch to addr if not ready
|
|
TIO 14,0,2,addr Branch to addr if buffer busy
|
|
TIO 14,0,3,addr Branch to addr if interrupt pending (mod 15 only)
|
|
TIO 14,0,4,addr Branch if carriage busy
|
|
TIO 14,0,6,addr Branch if printer busy
|
|
|
|
APL 14,0,0 Loop (or switch prog levels) if not ready/check
|
|
APL 14,0,2 Loop (or switch) if buffer busy
|
|
APL 14,0,3 Loop (or switch) if interrupt pending (mod 15 only)
|
|
APL 14,0,4 Loop (or switch) if carriage busy
|
|
APL 14,0,6 Loop (or switch) if printer busy
|
|
|
|
LIO 14,0,0,addr Load 1 byte to Forms Length Reg at addr-1
|
|
LIO 14,0,4,addr Load 2 bytes to Chain Image Address Register
|
|
LIO 14,0,6,addr Load 2 bytes to Data Address Register
|
|
|
|
SNS 14,0,0,addr Sense Character Count
|
|
SNS 14,0,4,addr Sense LPIAR (Image Address Register)
|
|
SNS 14,0,6,addr Sense LPDAR (data addres register)
|
|
|
|
|
|
5444 Disk Drives
|
|
----------------
|
|
|
|
Each drive has two disks (upper and lower), each disk
|
|
has two surfaces (upper and lower), each surface has
|
|
24 256-byte sectors, sectors are number 0 thru 23 on
|
|
upper surface, 32 thru 55 on lower.
|
|
|
|
d = drive, 0 is R1/F1, 1 is R2/F2
|
|
s = surface, 0 = upper (removable), 1 = lower (fixed)
|
|
|
|
The Control register points to the leftmost byte of a 4-byte
|
|
control field in memory with these bytes:
|
|
|
|
F - Flag byte (not supported in this sim)
|
|
C - Cylinder Address (0-203)
|
|
S - Sector Number (0-23, or 32-55) in top 6 bits
|
|
N - Number of sectors minus 1
|
|
|
|
These have meaning for all operations except seek, seek uses
|
|
the fields differently.
|
|
|
|
SIO 1d,s,0,XX Seek, XX not used, control field is used:
|
|
|
|
F - not used
|
|
C - not used
|
|
S - high bit is head to be used 0-upper 1-lower
|
|
low bit is direction to move 0-back 1-forward
|
|
N - number of cylinders to move
|
|
|
|
SIO 1d,s,1,XX Read, values of XX are as follows:
|
|
X'00': Read Data
|
|
X'01': Read Identifier (updates control field, no
|
|
data is read)
|
|
X'02': Read Data Diagnostic
|
|
X'03': Verify (does not read, but checks)
|
|
|
|
SIO 1d,s,2,XX Write, values of XX are as follows:
|
|
X'00': Write Data
|
|
X'01': Write Identifier (24 sectors with byte at
|
|
data address register)
|
|
|
|
SIO 1d,s,3,XX Scan. All 256 bytes in memory at data
|
|
address register are compared to disk
|
|
sectors on current track, except those
|
|
bytes of X'FF' are not compared. Values of
|
|
XX are:
|
|
|
|
X'00': Scan Equal
|
|
X'01': Scan Low or Equal
|
|
X'02': Scan High or Equal
|
|
|
|
LIO 1d,0,4,addr Load Data Address Register
|
|
LIO 1d,0,6,addr Load Disk Control Address Register
|
|
|
|
TIO 1d,0,0,addr Branch if not ready/unit check
|
|
TIO 1d,0,2,addr Branch if busy
|
|
TIO 1d,0,4,addr Branch if Scan Found
|
|
|
|
APL 1d,0,0 Loop if not ready/unit check
|
|
APL 1d,0,2 Loop if busy
|
|
APL 1d,0,4 Loop if scan found
|
|
|
|
SNS 1d,0,2,addr Sense Status Bytes 0 and 1: (simulated
|
|
bits only are shown, otehrs are 0):
|
|
X'1000': equipment check
|
|
X'0800': data check
|
|
X'0400': No record found
|
|
X'0100': Seek Check (past cyl 203)
|
|
X'0080': Scan equal Hit
|
|
X'0040': Cylinder 0
|
|
X'0020': End of Cylinder
|
|
X'0010': Seek Busy
|
|
SNS 1d,0,3,addr Sense bytes 2 and 3 (0000 in this sim)
|
|
SNS 1d,0,4,addr Sense Data Address Register
|
|
SNS 1d,0,6,addr Sense Control Address Register
|
|
|
|
|
|
|
|
|