blob: e01a97df00cc33b87e3bee8a65103587061737d8 [file] [log] [blame] [raw]
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