Storage Speed
| |||||
Storage Size | 3.6-microsec. storage cycle | 3.6-microsec. storage cycle plus disks | 3.6-microsec. storage cycle (70% performance) single disk | 2.2-microsec. storage cycle plus disks | 2.2-microsec. storage cycle (no internal disk) |
| 4096 words | Model 1A | Model 2A | Model 4A | --- | --- |
| 8192 words | Model 1B | Model 2B | Model 4B | Model 3B | Model 5B |
| 16,384 words | Model 1C | Model 2C | --- | Model 3C | Model 5C |
| 32,768 words | Model 1D | Model 2D | --- | Model 3D | Model 5D |
... I pounded the doors at the local IBM sales office until a salesman took pity on me. After we chatted for a while, he handed me a Fortran [manual]. I'm sure he gave it to me thinking, "I'll never hear from this kid again." I returned the following week saying, "This is really cool. I've read the whole thing and have written a small program. Where can I find a computer?" The fellow, to my delight, found me programming time on an IBM 1130 on weekends and late-evening hours. That was my first programming experience, and I must thank that anonymous IBM salesman for launching my career. Thank you, IBM.
The system was an IBM 1130 computer, a machine the size of a desk with 8KB (sic!) of main memory, a 512KB disk drive, a Teletype CX paper tape reader and BRPE paper tape punch, and a Photon 713 photomechanical typesetter. The assignment was my first experience with managing a machine-readable document database: I learned to roll the punched paper tape carefully so that it could be stored neatly in cylindrical waste paper baskets.
In the meantime, though I didn't know about it, the roots of generalized markup were being planted. Historically, electronic manuscripts contained control codes or macros that caused the document to be formatted in a particular way ("specific coding"). In contrast, generic coding, which began in the late 1960s, uses descriptive tags (for example, "heading", rather than "format-17").
>
Main Registers:
IAR = Instruction Address Register
ACC = Accumulator
EXT = Extension Register
XRx = Index Registers x = 1,2,3
1130 Instruction Set Mnemonics:
LD = Load ACC STO = Store ACC
LDD = Load Double (ACC & EXT) STD = Store Double (ACC & EXT)
LDX = Load Index STX = Store Index
LDS = Load Status STS = Store Status
A = Add ACC AD = Add Double
S = Subtract ACC SD = Subtract Double
M = Multiply D = Divide
AND = Boolean And OR = Boolean Or
XOR = Boolean Exclusive Or
SLA = Shift Left ACC SLT = Shift Left ACC & EXT
SLCA = Shift Left and Count ACC SLC = Shift Left and Count ACC & EXT
SRA = Shift Right ACC SRT = Shift Right ACC & EXT
RTE = Rotate Right ACC & EXT XCH = Exchange ACC and EXT
MDM = Modify Memory
B = Branch
BSC = Branch or Skip on Condition (Modifier dependent)
i.e. BP BNP BN BNN BZ BNZ BC BO BOD
BSI = Branch and Store IAR
MDX = Modify Index and Skip
WAIT = Halt NOP = No Operation
XIO = Execute I/O
1800 Additional Instruction Mnemonics:
CMP = Compare ACC DCM = Double Compare ACC & EXT
Short instruction format (one 16 bit word):
1
Bits 0...45678......5
OP---FTTDisp----
OP is Operation
F is format 0 = Short
TT is Tag
Disp is Displacement
Long instruction format (two 16 bit words):
1 1
Bits 0...456789.....50..............5
OP---FTTIMod----Address---------
OP is Operation
F is format 1 = Long
TT is Tag
I is Indirect bit
Mod is Modifier
Effective Address Calulation (EA):
F = 0 | F = 1, I = 0 | F = 1, I = 1
Direct Addressing| Direct Addressing| Indirect Addressing
-------------------------------------------------------------------
TT = 00 | EA = Displ + IAR | EA = Add | EA = C/Add
TT = 01 | EA = Displ + XR1 | EA = Add + XR1 | EA = C/Add + XR1
TT = 10 | EA = Displ + XR2 | EA = Add + XR2 | EA = C/Add + XR2
TT = 11 | EA = Displ + XR3 | EA = Add + XR2 | EA = C/Add + XR3
-------------------------------------------------------------------
Disp = Contents of displacement field
Add = Contents of address field of instruction
C = Contents of location specified by Add or Add + XR
>
// JOB
// ASM
*LIST
* LCARD.ASM - LIST A DECK OF CARDS TO LINE PRINTER
*
* COPYRIGHT (C) 2006 KYM FARNIK.
* CODE PUBLISHED UNDER MIT LICENSE.
*
* PROGRAM
* NEW PAGE ON PRINTER
* A READ A CARD
* CONVERT FORMAT
* PRINT A LINE ON PRINTER
* GOTO A
*
START LIBF PRNT1 GOTO NEW PAGE ON 1132
DC /3100 PRINTER CHANNEL 1-NEW PAGE
*
NEXTC LIBF CARD0 READ FROM 1442 CARD READER
DC /1000 CONTROL TO READ
DC CBUFF STORE 80 COLUMNS
CINP LIBF CARD0
DC 0
B CINP LOOP UNTIL CARD IS READ
*
LIBF ZIPCO CONVERT CARD TO PRINTER
DC /1100 UNPACKED IN, PACKED OUT
DC CBUFF+1 INPUT BUFFER
DC PBUFF+1 OUTPUT BUFFER
DC 80 CHARACTER COUNT
CALL HLEBC HOLLERITH TO EBCDIC
*
LIBF PRNT1 PRINT 80 CHARACTERS
DC /2000 CONTROL CODE TO PRINT
DC PBUFF PRINT BUFFER
DC PERR PRINT ERROR
POUT LIBF PRNT1 CHECK FOR PRINT COMPLETE
DC 0
B POUT LOOP UNTIL COMPLETE
*
B NEXTC READ NEXT CARD
*
* DATA
*
CBUFF DC 80 80 COLUMNS PER CARD
BSS 80
*
PBUFF DC 40 40 WORDS 80 CHARACTERS
BSS 40
*
PERR DC 0
B I PERR THIS RETURNS TO THE
* PRINTER ERROR HANDLER
* WHICH WILL TERMINATE THE PROGRAM
*
END START PROGRAM ENTRY POINT
// XEQ
TEST DATA 1
HELLO WORLD
TEST DATA 2
>
// JOB
// FOR
*LIST SOURCE PROGRAM
*ONE WORD INTEGERS
C-------------------------------------------------------
C COMPUTE THE CRITICAL VALUES FOR A QUADRATIC EQN
C 0=A*X**2+B*X+C
C RETURNS DISCRIMINANT, ROOTS, VERTEX, FOCAL LENGTH, FOCAL POINT
C X1 AND X2 ARE THE ROOTS
C-------------------------------------------------------
SUBROUTINE QUADR(A,B,C,DISCR,X1,X2,VX,VY,FL,FPY)
REAL A,B,C,DISCR,X1,X2,VX,VY,FL,FPY
C DISCRIMINANT, VERTEX, FOCAL LENGTH, FOCAL POINT Y
DISCR = B**2.0 - 4.0*A*C
VX = -B / (2.0*A)
VY = A*VX**2.0 + B*VX + C
FL = 1.0 / (A * 4.0)
FPY = VY + FL
FL = ABS(FL)
C COMPUTE THE ROOTS BASED ON THE DISCRIMINANT
IF(DISCR) 110,120,130
C -VE DISCRIMINANT, TWO COMPLEX ROOTS, REAL=X1, IMG=+/-X2
110 X1 = -B / (2.0*A)
X2 = SQRT(-DISCR) / (2.0*A)
RETURN
C ZERO DISCRIMINANT, ONE REAL ROOT
120 X1 = -B / (2.0*A)
X2 = X1
RETURN
C +VE DISCRIMINANT, TWO REAL ROOTS
130 X1 = (-B + SQRT(DISCR)) / (2.0*A)
X2 = (-B - SQRT(DISCR)) / (2.0*A)
RETURN
C
C NEXT STORE SUBROUTINE ON DISK USING DUP
END
// DUP
*DELETE QUADR
*STORE WS UA QUADR
// JOB
// FOR
*LIST SOURCE PROGRAM
*IOCS(CARD,1132 PRINTER)
*ONE WORD INTEGERS
C-------------------------------------------------------
C PROCESS DATA CARDS WITH A,B,C
C UNTIL A=0
C-------------------------------------------------------
DATA ICARD,IPRT /2,3/
REAL A,B,C
REAL DISCR,XR1,XR2,VX,VY,FL,FPY
WRITE(IPRT,901)
901 FORMAT(' ------------------------------------------------------')
C READ A B C, IF A=0 THEN EXIT
100 READ(ICARD,801)A,B,C
801 FORMAT(3F8.3)
C EXIT WHEN A IS ZERO
IF (A) 110,9000,110
C PRINT A B C
110 WRITE(IPRT,902)A,B,C
902 FORMAT(' QUADRATIC A=',F8.3,' B=',F8.3,' C=',F8.3)
C COMPUTE AND PRINT THE CRITICAL VALUES
CALL QUADR(A,B,C,DISCR,XR1,XR2,VX,VY,FL,FPY)
WRITE(IPRT,903) DISCR
903 FORMAT(' DISCRIMINANT=',F9.4)
WRITE(IPRT,904) VX,VY
904 FORMAT(' VERTEX X=',F9.4,' Y=',F9.4)
WRITE(IPRT,905) FL
905 FORMAT(' FOCAL LENGTH=',F9.4)
WRITE(IPRT,906) VX,FPY
906 FORMAT(' FOCAL POINT X=',F9.4,' Y='F9.4)
IF (DISCR) 120,130,140
C -VE DISCRIMINANT, TWO COMPLEX ROOTS
120 WRITE(IPRT,913) XR1, XR2
913 FORMAT(' COMPLEX ROOTS =(',F9.4,' +/-',F9.4,'I)')
GO TO 200
C ZERO DISCRIMINANT, ONE REAL ROOT
130 WRITE(IPRT,912) XR1
912 FORMAT(' ROOT X =',F9.4)
GO TO 200
C +VE DISCRIMINANT, TWO REAL ROOTS
140 WRITE(IPRT,911) XR1, XR2
911 FORMAT(' ROOTS X1=',F9.4,' X2=',F9.4)
C --- GO TO 200
C END OF QUAD
200 WRITE(IPRT,901)
GO TO 100
C END OF PROGRAM
C DATA FOLLOWS XEQ CARD
9000 CALL EXIT
END
// XEQ
+001.000+000.000+000.000
+001.000+002.000+003.000
+002.000+002.000+000.000
+002.000+000.000-004.000
+000.500+000.000-004.000
+000.250+002.000-002.000
-004.000+000.000-004.000
+002.730-007.200-003.750
+000.000+000.000+000.000