There was a time before MATLAB when, if you wanted a graph, you wrote the plot code yourself. Here is a sample from my grandson's Algebra book that I coded up a few years back and have used in a discussion during his Calc I class in college:
// JOB
// DUP
*DELETE PLOTA
// FOR
**PLOT AREA
*NAME PLOTA
*LIST ALL
*ONE WORD INTEGERS
*IOCS(PLOTTER)
NPLOT = 7
1 FORMAT(I2)
2 FORMAT('SIDE X IN FEET')
3 FORMAT('AREA IN SQUARE FEET')
4 FORMAT('AREA')
5 FORMAT('X')
6 FORMAT('16 - X')
7 FORMAT('PERIMETER P = 32')
8 FORMAT('AREA A = 16X - X**2')
9 FORMAT('FENCING A RECTANGULAR AREA WITH 32 FEET OF FABRIC')
10 FORMAT('SLOPE S = ')
11 FORMAT('DA')
12 FORMAT('DX')
13 FORMAT(' = 16 - 2X')
14 FORMAT('SLOPE')
15 FORMAT(I3)
C
C PEN COMMANDS
C INC - No Change
C IDB - PEN DOWN BEFORE MOTION
C IDA - PEN DOWN AFTER MOTION
C IUB - PEN UP BEFORE MOTION
C IUA - PRN UP AFTER MOTION
C
INC = 0
IDB = 2
IDA = -2
IUB = 1
IUA = -1
C
C CHSZX - CHARACTER SIZE X IN INCHES
C CHSZY - CHARACTER SIZE Y IN INCHES
C
CHSZX = 0.1
CHSZY = 0.1
C
C SX IS X-AXIS SCALE FACTOR : 5.5 INCHES OF PAPER FOR 17 UNITS
C SY IS Y-AXIS SCALE FACTOR : 6.0 INCHES OF PAPER FOR 64 UNITS
C
SX = 5.5 / 17.0
SY = 6.0 / 64.0
C
C XORG - PHYSICAL LOCATION OF GRAPH X ORIGIN ON PAPER
C YORG - PHYSICAL LOCATION OF GRAPH Y ORIGIN ON PAPER
C
XORG = 4.4
YORG = 1.8
C
C INITIAL PEN POSITION
C
PX = -XORG / SX
PY = -YORG / SY
C
C SET SCALE, DRAW BOTH AXIS AND PLACE PEN DOWN AT 0.0, 0.0
C
CALL SCALF(SX, SY, PX, PY)
CALL FGRID(0, 0.0, 0.0, 1.0, 16)
CALL FGRID(1, 0.0, 0.0, 4.0, 16)
CALL FPLOT(IDA, 0.0, 0.0)
C
C DRAW THE CURVE AND RAISE PEN AFTER COMPLETION
C
CALL PEN(8)
DO 20 I = 1, 17
X = FLOAT(I) - 1.0
Y = X * (16 - X)
CALL FPLOT(INC, X, Y)
CALL POINT(1)
20 CONTINUE
CALL PEN(0)
CALL FPLOT(IUB, X, Y)
C
C LABEL Y GRID WITH 0.1 x 0.1 CHARACTERS
C
DO 30 I = 1, 17
J = 4 * (I - 1)
X = -(3.0 * CHSZX) / SX
Y = FLOAT(J) - ((CHSZY / 2.0) / SY)
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,1) J
30 CONTINUE
C
C LABEL X GRID 0.1 x 0.1 CHARACTERS
C
DO 70 I = 1, 17
J = I - 1
IF (J - 10) 40, 50, 50
40 X = FLOAT(J) - ((1.5 * CHSZX) / SX)
GOTO 60
50 X = FLOAT(J) - (CHSZX / SX)
60 Y = -(2.0 * CHSZY) / SY
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,1) J
70 CONTINUE
C
C LABEL Y AXIS 0.2 X 0.2 CHARACTERS ROTATED 90 DEGREES
C
CHSZX = 0.2
CHSZY = 0.2
X = -0.5 / SX
Y = 32.0 - ((9.5 * CHSZY) / SY)
CALL FCHAR(X, Y, CHSZX, CHSZY, 1.5708)
WRITE(NPLOT, 3)
C
C LABEL X AXIS 0.2 x 0.2 CHARACTERS
C
X = 8.0 - ((7.0 * CHSZX) / SX)
Y = -(3.0 * CHSZY) / SY
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,2)
C
C DRAW THE BOX
C
CALL FPLOT(IDA, 5.0, 16.0)
CALL FPLOT(INC, 11.0, 16.0)
CALL FPLOT(INC, 11.0, 24.0)
CALL FPLOT(INC, 5.0, 24.0)
CALL FPLOT(IUA, 5.0, 16.0)
C
C LABEL THE BOX AND EQUATION FOR AREA
C
CHSZX = 0.1
CHSZY = 0.1
X = 8.0 - ((2.0 * CHSZX) / SX)
Y = 20.0 - ((CHSZY / 2.0) / SY)
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,4)
X = 8.0 - ((3.0 * CHSZX) / SX)
Y = 16.0 - ((2.0 * CHSZY) / SY)
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,6)
X = 5.0 - ((2.0 * CHSZX) / SX)
Y = 20.0 - ((CHSZY / 2.0) / SY)
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,5)
X = 8.0 - ((8.0 * CHSZX) / SX)
Y = 12.0 - ((2.0 * CHSZY) / SY)
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,7)
X = 8.0 - ((9.5 * CHSZX) / SX)
Y = 12.0 - ((4.0 * CHSZY) / SY)
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,8)
C
C DRAW EQUATION FOR SLOPE
C
X = 8.0 - ((11.0 * CHSZX) / SX)
Y = 12.0 - ((7.0 * CHSZY) / SY)
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,10)
X = 8.0 - ((1.0 * CHSZX) / SX)
Y = 12.0 - ((6.0 * CHSZY) / SY)
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,11)
Y = 12.0 - ((8.0 * CHSZY) / SY)
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,12)
X = 8.0 + (5.5 * CHSZX)
Y = 12.0 - ((7.0 * CHSZY) / SY)
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,13)
X = 8.0 - ((1.0 * CHSZX) / SX)
Y = 12.0 - ((6.5 * CHSZY) / SY)
X1 = X + ((2.0 * CHSZX) / SX)
CALL FPLOT(IDA, X, Y)
CALL FPLOT(IUA, X1, Y)
C
C RESET ORIGIN AND SCALE
C
CALL FPLOT(INC, 0.0, 0.0)
CALL SCALF(1.0, 1.0, XORG, YORG)
C
C DRAW THE TABLE OF VALUES BOX
C
BXORG = 0.75
BYORG = 3.5
CALL FPLOT(IDA, BXORG, BYORG)
CALL SCALF( 1.0, 1.0, 0.0, 0.0)
HT = 2.75
WD = 1.7
COL1 = 0.375
COL2 = 1.0
CALL FPLOT(INC, WD, 0.0)
CALL FPLOT(INC, WD, HT)
CALL FPLOT(INC, 0.0, HT)
CALL FPLOT(IUA, 0.0, 0.0)
CALL FPLOT(IDA, 0.0, HT - 0.15)
CALL FPLOT(IUA, WD, HT - 0.15)
CALL FPLOT(IDA, COL1, HT)
CALL FPLOT(IUA, COL1, 0.0)
CALL FPLOT(IDA, COL2, HT)
CALL FPLOT(IUA, COL2, 0.0)
C
C LABEL THE COLUMNS
C
X = (COL1 / 2.0) - (CHSZX / 2.0)
Y = HT - 0.075 - (CHSZY / 2.0)
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,5)
X = COL1 + 0.15
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,4)
X = COL2 + 0.1
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,14)
C
C FILL IN THE TABLE
C
DO 80 I = 1, 17
J = I - 1
Y = (HT - 0.3) - (FLOAT(J) * (1.5 * CHSZY))
X = 0.075
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,1) J
X = COL1 + 0.2
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
IAREA = J * (16 - J)
WRITE(NPLOT,1) IAREA
X = COL2 + 0.15
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
ISLOP = 16 - (2 * J)
WRITE(NPLOT,15) ISLOP
80 CONTINUE
C
C TITLE THE PAGE
C
CHSZX = 0.2
CHSZY = 0.2
CALL FPLOT(INC, 0.0, 0.0)
CALL SCALF(1.0, 1.0, BXORG, BYORG)
Y = 0.50
X = 5.0 - (24.5 * CHSZX)
CALL FCHAR(X, Y, CHSZX, CHSZY, 0.0)
WRITE(NPLOT,9)
C
C EJECT PAGE AND EXIT
C
CALL PLTEJ
CALL EXIT
END
// DUP
*STORE WS UA PLOTA
// XEQ PLOTA
Maximum variable name length = 5, only upper case, and other restrictions...
The output is attached...
This was written for my FPGA implementation of the IBM 1130 which, in my case, had a Calcomp 1627 drum plotter. I currently send plotter output directly to a LaserJet using HPGL statements to draw the image.
The original plotter had 100 steps per inch and each line segment was created with a series of steps.
http://ibm1130.org/hw/io/Those were fun days '70-'72