Actions

Papertapes

From Trammell Hudson's Projects


DEC papertape library

PDP8 Paper tapes

We recently acquired a library of PDP8 paper tapes dating from 1965 to 1970 and have read them with the ASR33 teletype. Many of the tapes are in ok shape and have fed through the reader without any problems so far. The ones that are in ASCII source code are reading fine. The binary tapes have been read with an optical papertape reader, designed by Adam Mayer.

Papertape formats

The PDP-8 Family Paper Tape System User's Guide (DEC-08-NGCC-D) has a table on page INTRO-14 defining the formats, and another table on page A-1 that shows the encoding of 8-bit and 6-bit ASCII. Since the PDP was a 12-bit machine, two 6-bit ASCII characters can be packed into a single word.

Single precision

PDP8 Single precision signed multiply and divide

Signed floating-point multiply

Label

DEC-08-FMBA-PA    7/28/66
SINGLE PRECISION  SIGNED
MULTIPLY SUBROUTINE

Source

/TWO'S COMPLEMENT SINGLE PRECISION MULTIPLY ROUTINE
/RETURN HIGH ORDER PRODUCT IN AC, LOW IN MP1

MULT,     0
          CLL
          SPA                 /TEST FOR NEGATIVE MULTIPLIER
	CMA CML IAC
          DCA MP1             /STORE MULTIPLIER
          DCA MP5
          TAD I MULT
          SNA                 /TEST FOR ZERO MULTIPLICAND
	JMP MPSN+2
          SPA                 /TEST FOR NEGATIVE MULTIPLICAND
          CMA CML IAC
          DCA MP2             /STORE MULTIPLICAND
          TAD THIR
          DCA MP3
MP4,	TAD MP1		/MULTIPLY LOOP PROPER
          RAR
          DCA MP1
          TAD MP5
          SZL                 /TEST IF MULTIPLICAND SHOULD BE ADDED
          TAD MP2
          CLL RAR
          DCA MP5
          ISZ MP3             /TEST FOR END OF LOOP
          JMP MP4
          TAD MP1
          RAR
MPSN,     SZL
          JMP COMP
          DCA MP1
          TAD MP5
MPZ,      ISZ MULT            /EXIT
          JMP I MULT
COMP,     CMA CLL IAC         /COMPLEMENT PRODUCT
          DCA MP1
          TAD MP5
          CMA
          SZL
          IAC
          JMP MPZ
THIR,     7764                /ELEVEN IN DECIMAL
MP1,      0
MP5,      0
MP2,      0
MP3,      0

          $

Signed floating-point divide

Label

DEC-08-FMCA-PA   7/65
SINGLE PRECISION SIGNED
DIVIDED SUBROUTINE

Source

/DIGITAL-8-12-F
/SIGNED SINGLE PRECISION DIVIDE SUBROUTINE
/CALLING SEQUENCE:
/         C(AC) CONTAINS HIGH ORDER DIVIDEND
/         JMS DIVIDE
/         LOW ORDER DIVIDEND
/         DIVISOR
/         RETURN: C(AC)=QUOTIENT; REMAINDER IN  HDIVND
/IF HIGH ORDER DIVIDEND IS EQUAL TO OR GREATER
/THAN THE DIVISOR; NO DIVISION TAKES PLACE AND C(L)=1

/PAGE 1

DIVIDE,   0
          CLL
          SPA                   /DIVIDEND<0?
          CMA CML               /YES COMPLEMENT AND SET C(L)
          DCA HDIVND            /HIGH ORDER DIVIDEND
          SNL
          CMA
          DCA SDVND             /SET DIVIDEND SIGN SWITCH
          TAD I DIVIDE          /FETCH LOW ORDER DIVIDEND
          SZL
          CMA CLL IAC           /YES: COMPLEMENT
          DCA LDIVND            /LOW ORDER DIVIDEND
          SZL                   /CARRY?
          ISZ HDIVND            /YES
          ISZ DIVIDE
          TAD I DIVIDE          /FETCH DIVISOR
          CLL
          SMA
          CMA CML IAC           /NEGATE IT
          DCA DIVSOR            /SAVE DIVISOR
          SNL                   /WAS IT <0?
          CMA                   /YES: AC=-1
          TAD SDVND
          DCA SNSWER            /ANSWER SIGN SWITCH
          CLL
          TAD DIVSOR            /COMPARE DIVISOR
          TAD HDIVND            /WITH DIVIDEND
          ISZ DIVIDE
          SZL CLA               /OVER FLOW?
          JMP I DIVIDE          /YES: DIVISOR<DIVIDEND





/DIGITAL-8-12-F
/PAGE 2

          TAD M13               /13 SHIFTS
          DCA DIVCNT
          JMP DV2

/DIVIDE LOOP

DV3,      TAD HDIVND
          RAL
          DCA HDIVND            /DIVIDEND LEFT SHIFT
          TAD HDIVND
          TAD DIVSOR            /COMPARE DIVISOR;DIVIDEND
          SZL
          DCA HDIVND            /REMAINDER AFTER SUBTRACT
          CLA
DV2,      TAD LDIVND            /QUOTIENT BITS 
          RAL                   /ENTER HERE
          DCA LDIVND
          ISZ DIVCNT            /DONE 12?
          JMP DV3               /NO: CONTINUE
          TAD HDIVND            /REMAINDER
          ISZ SDVND             /DIVIDEND<0?
          CMA IAC               /YES
          DCA HDIVND
          TAD LDIVND            /QUOTIENT 
          ISZ SNSWER            /ANSWER<0?
          CMA IAC               /YES: NEGATE
          CLL
          JMP I DIVIDE          /EXIT

HDIVND,   0
LDIVND,   0
DIVSOR,   0
SDVND,    0
SNSWER,   0
DIVCNT,   0
M13,      -15                   /-13(10)
$

Single Precision Square Root Routine

DEC-08-FMAA-PA 7/10/65

/DIGITAL-8-9-F
/SQUARE ROOT ....... ENTER WITH SQUARE IN AC
/                    EXITS WITH ROOT IN AC
/          ODD INTEGER METHOD
SQRT,     0
          DCA SQR1              /SAVE INPUT
          DCA ROOT              /0 TO ANSWER
          TAD SQR2              /-1; FIRST ATTEMPT
SQX,      DCA SQRD
          TAD SQR1              /COMPARE INPUT
          CLL                   /WITH THIS TRY
          TAD SQRD
          SNL
          JMP SQRF              /TEST>INPUT; ALL DONE
          ISZ ROOT              /ADD +1 TO ANSWER
          DCA SQR1              /INPUT=INPUT-TEST
          TAD SQRD
          TAD SQR3              /TEST=TEST-2
          JMP SQX               /CONTINUE
SQRF,     CLA
          TAD ROOT              /FETCH ANSWER
          JMP I SQRT            /EXIT
SQR1,     0
SQR2,     -1
SQR3,     -2
SQRD,     0
ROOT,     0

$

Double Precision

PDP8 paper tapes

Cosine

This one is short -- it calls sin(x-Pi/2).

Label

DEC-08-FMGA-PA   7/10/65
DOUBLE PRECISION COSINE
SUBROUTINE

Source

/DIGITAL-8-18-F
/DOUBLE PRECISION COSINE SUBROUTINE
/CALLS DIGITAL-8-16-F
/POINTERS TO DIGITAL-8-16-F
ARG=741
DSIN=400

*1000
DCOS,     0
          TAD I DCOS            /FETCH ADDRESS OF
          DCA ADDRSS            /ARGUMENT
          TAD I ADDRSS          /FETCH HIGH ORDER
          DCA X                 /ARGUMENT
          ISZ ADDRSS            /INCREMENT ADDRESS POINTER
          TAD I ADDRSS          /FETCH LOW ORDER
          DCA X+1               /ARGUMENT
          TAD X                 /IS ARGUMENT EQUAL
          SZA CLA               /TO ZERO
          JMP TSIGN             /NO: TEST THE SIGN
          TAD X+1               /TEST LOW ORDER BITS
          SZA CLA               /FOR ZERO
          JMP TSIGN             /NOT EQUAL TO ZERO
          CMA
          RAR
          DCA I ARGPNT
          CMA
          DCA I ARGPNT+1        /SET ANSWER TO 1
          JMP EXIT
TSIGN,    TAD X                 /SEE IF X>0
          SMA CLA
          JMP ARGPOS            /ARGUMENT IS >0
          TAD X+1               /ARGUMENT IS <0
          CLL CMA IAC           /NEGATE IT
          DCA X+1
          TAD X
          CMA
          SZL
          IAC
          DCA X

/DIGITAL-8-18-F
/PAGE 2
ARGPOS,   CLL CLA
          TAD X+1
          CMA IAC
          TAD PIOT+1            /SUBTRACT X FROM
          DCA X+1               /PI/2
          TAD X
          CMA
          SZL
          IAC
          TAD PIOT
          DCA X
          JMS I DSINPT          /CALL SINE SUBROUTINE
          X                     /ARGUMENT ADDRESS
EXIT,     ISZ DCOS              /RETURN TO CALL+1
          JMP I DCOS            /ANSWER IN ARG,ARG+1
X,        0
          0
ARGPNT,   ARG
          ARG+1
ADDRSS,   0
DSINPT,   DSIN
PIOT,     1444
          1767
$

Sine

Label

DEC-08-FMFA-PA   7/7/65
DOUBLE PRECISION SINE
SUBROUTINE

Source

/DIGITAL-8-16-F
/DOUBLE PRECISION SINE
/POINTERS TO DIGITAL-8-13-F
DMUL=0200
B=0341
C=0342
*400

DSIN,     0
          TAD I DSIN          /ADDRESS OF ARGUMENT
          DCA TEMP
          TAD I TEMP          /HIGH ORDER
          DCA X2
          ISZ TEMP
          TAD I TEMP          /LOW ORDER
          DCA X2+1
          ISZ DSIN            /FIX EXIT
          TAD DSIN            /SAVE ON PUSHDOWN LIST
          DCA I PUSH
          ISZ PUSH
          TAD X2              /CHECK FOR ZERO
          SZA CLA
          JMP NEG
          TAD X2+1
          SZA CLA
          JMP NEG             /NO
          CLA
          DCA I PNT3          /SIN(0)=0
          DCA I PNT3+1
XIT1,     CLA CMA             /EXIT
          TAD PUSH
          DCA PUSH
          TAD I PUSH
          DCA TEMP
          JMP I TEMP
NEG,      TAD X2              /CHECK FOR NEGATIVE X
          SMA CLA
          JMP POS
          TAD X2+1            /SIN(-X)=-SIN(X)
          CLL CMA IAC
          DCA X2+1
          TAD X2
          CMA
          SZL
          IAC
          DCA X2

/DIGITAL-8-16-F
/PAGE 2
          JMS DSIN            /RECURSIVE CALL FOR SINE
          X2
XIT2,     TAD I PNT3+1        /NEGATE THE ANSWER
          CLL CMA IAC
          DCA I PNT3+1
          TAD I PNT3
          CMA
          SZL
          IAC
          DCA I PNT3
          JMP XIT1
POS,      CLL                 /IS X<PI?
          TAD X2+1
          TAD MPI+1
          DCA TEMP
          RAL                 /CARRY
          TAD X2
          TAD MPI
          SPA
          JMP PCHK
          DCA X2              /SIN(X)=-SIN(X-PI)
          TAD TEMP
          DCA X2+1
          JMS DSIN
          X2
          JMP XIT2
PCHK,     CLA CLL             /IS X<PI/2?
          TAD X2+1
          TAD MPIO+1
          DCA TEMP
          RAL
          TAD X2
          TAD MPIO
          SPA
          JMP ALG
          SZA
          JMP P2NG
          TAD TEMP
          SZA
          JMP P2NG
          CMA CLL             /SIN(PI/2)=1
          RAR
          DCA I PNT3
          CMA
          DCA I PNT3+1
          JMP XIT1

/DIGITAL-8-16-F
/PAGE 3
P2NG,     CLL CLA
          TAD X2+1
          TAD MPI+1           /SIN(X)=-SIN(X-PI)
          DCA X2+1
          RAL
          TAD X2
          TAD MPI
          DCA X2
          JMS DSIN            /RECURSIVE CALL FOR SINE
          X2
          JMP XIT2
ALG,      CLA                 /ALIGN SCALING FOR ALGORITHM
          TAD X2+1
          CLL RAL
          DCA I PNT2+1
          TAD X2
          RAL
          DCA I PNT2
          JMP I PNT4
/SYMBOLS AND CONSTANTS FOR THIS PAGE
X2,       0
          0
TEMP,     0
PNT2,     X
          X+1
PNT3,     ARG
          ARG+1
PNT4,     DALG
MPI,      4667                /-(PI)
          4023
MPIO,     6333                /-(PI/2)
          6012
PUSH,     PUSH+1              / POINTER FOR PUSHDOWN LIST

/DIGITAL-8-16-F
/PAGE 4
*DSIN+200
DALG,     JMS I DMTG          /FORM (2/PI)*ARG
          X
          TOPI
          JMS SCAL            /GET RID OF EXTRA SIGN BIT
          JMS SCAL            /SCALING = 0 NOW
          JMS ROUND
          X
          JMS I DMTG          /GET X*X
          X
          X
          JMS SCAL            /GET RID OF EXTRA SIGN BIT
          JMS ROUND
          XSQR
          TAD FYX             /INI
          DCA PNT             /   T
          TAD FOUR            /    I
          DCA CHK             /     A
          DCA ARG             /      L
          DCA ARG+1           /       IZE
LOOP,     CLL
          TAD I PNT
          TAD ARG+1
          DCA ARG+1
          ISZ PNT
          RAL
          TAD ARG
          TAD I PNT
          DCA ARG
          ISZ PNT             /INCREMENT POINTER FOR NEXT
          JMS I DMTG
          ARG
          XSQR
          JMS SCAL            /GET RID OF SIGN BIT
          JMS ROUND
          ARG
          ISZ CHK
          JMP LOOP
          CLL
          TAD ARG             /SHIFT ARG 1 PLACE
          SPA
          CML
          RAR
          DCA ARG
          TAD ARG+1
          RAR
          DCA ARG+1

/DIGITAL-8-16-F
/PAGE 5

          CLL                 /ADD IN LAST CONSTANT
          TAD C1+1
          TAD ARG+1
          DCA ARG+1
          RAL                 /CARRY
          TAD ARG
          TAD C1
          DCA ARG
          JMS I DMTG
          ARG
          X
          JMS SCAL            /PUT SCALING BACK TO ZERO
          JMS SCAL            /GET RID OF SIGN BIT
          JMS ROUND
          ARG
          JMP I OUT
OUT,      XIT1
SCAL,     0                   /ROUTINE TO ADJUST SCALING
          DCA TEM2
          TAD I CTG
          CLL RAL
          DCA I CTG
          TAD I BTG
          RAL
          DCA I BTG
          TAD TEM2
          RAL
          JMP I SCAL
ROUND,    0
          DCA TEM1
          TAD I ROUND         /ADDRESS OF HIGH ORDER
          ISZ ROUND
          DCA TEM2
          TAD TEM1
          DCA I TEM2
          TAD TEM2
          IAC
          DCA TEM1
          TAD I BTG
          DCA I TEM1
          TAD I CTG
          SPA CLA               /BIT 0=1??
          JMP I ROUND           /NO; EXIT
          ISZ I TEM1            /YES: ROUND
          JMP I ROUND
          ISZ I TEM2            /CARRY
          JMP I ROUND

/DIGITAL-8-16-F
/PAGE 6
/SYMBOLS AND CONSTANTS
X,        0
          0
XSQR,     0
          0
ARG,      0
          0
PNT,      0
CHK,      0
TEM1,     0
TEM2,     0
DMTG,     DMUL
BTG,      B
CTG,      C
FYX,      C9
FOUR,     -4
TOPI,     2427                /2/PI
          6303
C1,       3110
          3755
C9,       2367                /C3-C9 STORED IN BACKWARDS ORDER
          0000
C7,       3331
          7766
C5,       1505
          0243
C3,       0420
          5325
          $

FORTRAN

This is a sample FORTRAN program that is an interactive calculator. The comment refers to a PDP-5, the first 12-bit machine.

Label

SAMPLE PROGRAM FORTRAN SYM
DESK CALCULATOR

Source

  1;FORMAT(/,/,/,"THIS IS A DEMONSTRATION OF PDP FORTRAN.",/)
  2;FORMAT("THIS PROGRAM WAS COMPILED IN ONE PASS ON A 4-K PDP-5
EQUIPPED WITH AN ASR-33 TELETYPE.",/)
  3;FORMAT(/,/,"BY TYPING IN AN INTEGER FROM ONE TO FOUR TO INDICATE
THE FUNCTION, YOU MAY SIMULATE A DESK CALCULATOR.")
  4;FORMAT(/,"TO ADD TYPE A 1, TO SUBTRACT TYPE A 2, TO MULTIPLY
TYPE A 3, TO DIVIDE TYPE A 4.",/)
  5;FORMAT(/,"OK, TELL ME WHAT TO DO!",/)
  6;FORMAT(E,E)
  9;FORMAT(I)
100;TYPE 1
200;TYPE 2
300;TYPE 3
400;TYPE 4
500;TYPE 5
   ;ACCEPT 9,M
   ;ACCEPT 6,A,B
   ;GO TO(1000, 2000, 3000, 4000),M
   ;TYPE 7
   ;GO TO 500
1000;ANS=A+B
   ;GO TO 1500
2000;ANS=A-B
   ;GO TO 1500
3000;ANS=A*B
   ;GO TO 1500
4000;ANS=A/B
1500;TYPE 8,ANS
   ;GO TO 500
  8;FORMAT("YOUR ANSWER IS ",E,)
  7;FORMAT("PARDON MY HESITATION, LET'S TRY AGAIN.",/)
   ;END