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