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 | |