      PROGRAM PDP8SIM (INPUT=201,OUTPUT=201,TAPE1=201,TAPE2=201,
     +        TAPE5=INPUT,TAPE6=OUTPUT) 
  
*  PDP-8 SIMULATOR
*  COPYRIGHT HOWARD CUNNINGHAM  02/25/75
  
      INTEGER KM(20),RIM(16),REPLTR,MSG(5)
      DATA KM/2LAC,2LLO,2LCL,2LCO,2LDE,2LEX,2LHA,2LMA,
     +   2LMD,2LST,2LSW,2LPC,2LPR,2LPP,2LTI,2LRI,2LPU,2LME,2*0/ 
      DATA RIM/6014B,6011B,5357B,6016B,7106B,7006B,7510B,5374B, 
     +         7006B,6011B,5367B,6016B,7420B,3776B,3376B,5357B/ 
      COMMON MEMORY(1024) 
      COMMON /REGS/ SR,MA,MD,PC,AC,LK,MQ,STEP 
      COMMON /MODE/ LSP 
      INTEGER SR,MA,MD,PC,AC,LK,MQ,STEP 
  
  
*  COMMAND PROCESSING LOOP
  
202   T1=RC(I1) 
      DO 204 I2=1,20
204   IF((I1.AND.7777 0000 0000 0000 0000B).EQ.KM(I2)) GOTO 208 
      PRINT 206, T1 
206   FORMAT(' ERR: ',A10)
      GOTO 202
208   GOTO (310,320,330,340,350,360,370,380,390,
     +       400,410,420,430,440,450,460,470,480), I2 
  
* AC - ACCUMULATOR
310   I2=AC 
312   PRINT 314,I1,I2 
314   FORMAT(XA2': 'O4) 
      GOTO 202
  
* LO - LOAD ADDRESS 
320   PC=MA=SR
      GOTO 202
  
* CL - CLEAR
330   AC=LK=0 
      GOTO202 
  
* CO - CONTINUE 
340   STEP=ISC
      CALL INTRPT 
      CALL FLSHTP 
      GOTO 202
  
* DE - DEPOSIT
350   MD=SR 
      CALL STORE
351   MA=PC=(MA+1).AND.7777B
      GOTO 202
  
* EX - EXAMINE
360   CALL FETCH
      PRINT 362,MA,MD 
362   FORMAT(' EX: 'O4XO4)
      GOTO 351
  
* HA - HALT 
370   CALL RI(ISC)
      IF(ISC.EQ.0) ISC=-1 
      ISC=MIN0(ISC,777777B) 
      GOTO 202
  
* MA - MEMORY ADDRESS 
380   I2=MA 
      GOTO 312
  
* MD - MEMORY DATA
390   I2=MD 
      GOTO 312
  
* ST - STATUS 
400   I2=4000B*LK 
      GOTO 312
  
* SW - SWITCH REGISTER
410   CALL RO(SR) 
      SR=SR.AND.7777B 
      GOTO 202
  
* PC - PROGRAM COUNTER
420   I2=PC 
      GOTO 312
  
* PR - PAPER TAPE READER
430   I1=1
      CALL FLSHPR 
432   CALL RC(I2) 
      CALL NEWNAME(I1,REPLTR(I2,1H ,0)) 
      REWIND I1 
      GOTO 202
  
* PP - PAPER TAPE PUNCH 
440   I1=2
      CALL FLSHPP 
      ENDFILE I1
      GOTO 432
  
* TI - CPU TIME 
450   CALL SECOND(T1) 
      PRINT 452,T1
452   FORMAT(' TI:'F8.3)
      GOTO 202
  
* RI - ENTER RIM LOADER 
460   DO 462 I1=1,16
      MA=7755B+I1 $ MD=RIM(I1)
462   CALL STORE
      GOTO 202
  
* PU - LOW SPEED PUNCH
470   CALL RI(LSP)
      IF(LSP.EQ.0) CALL FLSHPP
      GOTO 202
  
* ME - CONSOLE MESSAGE
480   CALL RS(MSG,5)
      CALL MESSAGE(MSG) 
      GOTO 202
  
      END 
      SUBROUTINE PDP8IOT
  
      COMMON /REGS/ SR,MA,MD,PC,AC,LK,MQ,STEP 
      COMMON /MODE/ LSP 
      INTEGER SR,MA,MD,PC,AC,LK,MQ,STEP 
      DIMENSION LIB(5),LOB(5),LTB(80),ITR(64) 
      DATA NIP,NOP,NTP/6,0,0/ 
      DATA ITR/1R?,1RA,1RB,1RC,1RD,1RE,1RF,1RG, 
     +         1RH,1RI,1RJ,1RK,1RL,1RM,1RN,1RO, 
     +         1RP,1RQ,1RR,1RS,1RT,1RU,1RV,1RW, 
     +         1RX,1RY,1RZ,1R[,1R/,1R],1R^,1R", 
     +         1R ,1R#,1R1R&,1R$,1R$,1R
,1R', 
     +         1R(,1R),1R*,1R+,1R,,1R-,1R.,1R/, 
     +         1R0,1R1,1R2,1R3,1R4,1R5,1R6,1R7, 
     +         1R8,1R9,1R:,77B,1R<,1R=,1R>,1R 
  
      ID=(ISHIFT(MD,-3).AND.77B)+1
      IO=(MD.AND.7B)+1
      IF(ID.LE.5) GOTO (200,210,220,230,240),ID 
      IF(MD.EQ.6214B) GOTO 302
      IF(MD.EQ.6201B) GOTO 106
      GOTO 404
  
108   PC=(PC+1).AND.7777B 
106   RETURN
  
*  PROGRAM DATA TRANSFER
  
200   CONTINUE
      GOTO 404
  
*  PAPER TAPE READER
  
210   GOTO(404,108,212,404,106,404,212,404),IO
212   IF(NIP.NE.6) GOTO 216 
      CALL READBYT(1,LIB,5,IS)
      NIP=1 
      IF(IS.EQ.0) GOTO 216
      PRINT 214,IS
214   FORMAT(' READ ERR: 'I2) 
      GOTO 404
216   AC=LIB(NIP).OR.AC 
      NIP=NIP+1 
      GOTO 106
  
*  FLUSH PAPER TAPE READER BUFFER 
  
      ENTRY FLSHPR
      NIP=6 
      RETURN
  
*  PAPER TAPE PUNCH 
  
220   GOTO (404,108,106,404,224,404,224,404),IO 
224   NOP=NOP+1 
      LOB(NOP)=AC 
      IF(NOP.LT.5) GOTO 106 
  
*  FLUSH PAPER TAPE BUFFER
  
      ENTRY FLSHPP
      IF(NOP.NE.0) CALL WRITBYT(2,LOB,NOP,IS) 
      NOP=0 
      RETURN
  
*  TELEPRINTER KEYBOARD 
  
230   IF(MD.EQ.6032B) GOTO 106
      GOTO 404
  
*  TELEPRINTER PRINTER
  
240   GOTO (106,108,106,404,243,108,243,404),IO 
243   IF(LSP.EQ.0) GOTO 244 
      NOP=NOP+1 
      LOB(NOP)=AC 
      IF(NOP.LT.5) GOTO 244 
      CALL WRITBYT(2,LOB,NOP,IS)
      NOP=0 
244   IC=AC.AND.177B
      IF(IC.EQ.15B) GOTO 246
      IF(IC.LT.40B.OR.IC.EQ.177B) GOTO 106
      IF(IC.GT.140B) IC=IC-40B
      NTP=NTP+1 
      LTB(NTP)=ITR((IC.AND.77B)+1)
      IF(NTP.LT.80) GOTO 106
  
*  FLUSH TELEPRINTER BUFFER 
  
      ENTRY FLSHTP
      IF(NTP.EQ.0) RETURN 
246   PRINT 245,(LTB(I1),I1=1,NTP)
245   FORMAT(X80R1) 
      LTB=NTP=0 
      RETURN
  
*  SPECIAL IOTS 
  
302   AC=0 $ GOTO 106 
  
*  BAD OPERATOR 
  
      ENTRY BADOPR
404   PRINT 406, PC 
406   FORMAT(' BAD OPERATION, PC: 'O4)
      STEP=0
      RETURN
  
      END 
          IDENT  PDP8INT - PDP-8 INTERPRETER
          SPACE  4
***       PDP8INT - PDP-8 INTERPRETER 
*         HOWARD G. CUNNINGHAM
  
  
**        REGISTER ASSIGNMENTS
* 
*                (X0) = 7777B 
*                (X2) = LINK AND AC 
*                (X3) = MA AT MOST TIMES
*                (X4) = MD AT MOST TIMES
*                (X5) = PC
*                (B1) = 1 
*                (B2) = REMAINING STEP COUNTER
          SPACE  4
 FETCH    MACRO  MA,MB       FETCH FROM MEMORY
          MX6    -10
          BX1    X6*MA
          AX1    6
          SB6    X1 
          BX1    -X6*MA 
          SA1    X1+MEMORY
          A&MB   X1,B6
          B&MB   X0*MB
          ENDM
  
 STORE    MACRO  MA,MB       STORE INTO MEMORY
          IFC    NE,$MA$$ 
          MX6    -10
          BX1    X6*MA
          AX1    6
          SB6    X1 
          BX1    -X6*MA 
          SA1    X1+MEMORY
          ELSE   1
          SA1    A1 
          LX6    X0,B6
          BX6    -X6*X1 
          LX1    MB,B6
          BX6    X6+X1
          SA6    A1 
          ENDM
          EJECT 
          ENTRY  INTRPT 
  
 INT0     RJ     SAVREG 
  
 INTRPT   PS
          RJ     RESREG 
  
 INT1     ZR     B2,INT0
          NG     B2,INT1.1
          SB2    B2-B1
 INT1.1   FETCH  X5,X7       GET INSTRUCTION
          SX6    X7-6000B 
          PL     X6,INT4     IF OPR OR IOT
          MX6    -7 
          BX3    -X6*X7      EXTRACT PAGE ADDR
          LX7    59-7 
          PL     X7,INT2     IF PAGE ZERO 
          BX1    X6*X5
          BX3    X3+X1       INSERT CURRENT PAGE ADDR 
 INT2     LX7    7-8
          PL     X7,INT3     IF DIRECT REFERENCE
          BX4    X3 
          FETCH  X4,X3
          MX1    -3 
          BX1    X1*X4
          SX1    X1-10B 
          NZ     X1,INT3     IF NOT AUTO-INDEX REG
          SX3    X3+B1       PRE INDEX
          BX3    X0*X3
          STORE  ,X3
 INT3     LX7    8-59 
 INT4     LX7    59-8 
          SB6    X7 
          SX5    X5+B1       BUMP PC
          BX5    X0*X5
          JP     B6+INT5
  
 INT5     NULL
          ECHO   1,OPR=(AND,TAD,ISZ,DCA,JMS,JMP,IOT,OPR)
+         EQ     OPR
  
 AND      FETCH  X3,X4
          BX2    X2*X4
          EQ     INT1 
  
 TAD      FETCH  X3,X4
          MX6    -13
          IX2    X2+X4
          BX2    -X6*X2 
          EQ     INT1 
  
 ISZ      FETCH  X3,X4
          SX4    X4+B1
          BX4    X0*X4
          STORE  ,X4
          NZ     X4,INT1
          SX5    X5+B1
          BX5    X0*X5
          EQ     INT1 
  
 DCA      BX4    X0*X2
          STORE  X3,X4
          BX2    -X0*X2 
          EQ     INT1 
  
 JMS      STORE  X3,X5
          SX5    X3+B1
          BX5    X0*X5
          EQ     INT1 
  
 JMP      BX5    X3 
          EQ     INT1 
  
 IOT      LX7    8-59 
          BX4    X7 
          RJ     SAVREG 
          RJ     =XPDP8IOT
          RJ     RESREG 
          EQ     INT1 
  
 OPR      PL     X7,GP1 
          LX7    8-0
          PL     X7,GP2 
          EQ     GP3
  
 GP1      LX7    8-7
          PL     X7,GP1.1 
          BX2    -X0*X2      CLA
 GP1.1    LX7    7-6
          PL     X7,GP1.2 
          BX2    X0*X2       CLL
 GP1.2    LX7    6-5
          PL     X7,GP1.3 
          BX2    X0-X2       CMA
 GP1.3    LX7    5-4
          PL     X7,GP1.4 
          BX2    -X0-X2      CML
          MX6    -13
          BX2    -X6*X2 
 GP1.4    LX7    4-0
          PL     X7,GP1.5 
          SX2    X2+B1       IAC
          MX6    -13
          BX2    -X6*X2 
 GP1.5    MX6    -3 
          BX6    -X6*X7 
          SB6    X6 
          JP     GP1.6+B6 
  
 GP1.6    NULL
          ECHO   1,OPR=(INT1,BSW,RAL,RTL,RAR,RTR,ERR,ERR) 
+         EQ     OPR
  
 BSW      BX6    -X0*X2 
          BX1    X0*X2
          LX1    6
          BX2    X0*X1
          AX1    12 
          BX2    X2+X1
          BX2    X2+X6
          EQ     INT1 
  
          ECHO   ,OPR=(RAL,RTL,RAR,RTR),SFT=(1,2,13-1,13-2) 
 OPR      MX1    -13
          LX2    SFT
          BX6    X1*X2
          BX2    -X1*X2 
          AX6    13 
          BX2    X2+X6
          EQ     INT1 
          ENDD
  
 GP2      LX7    0-6         SMA
          BX6    X2 
          LX6    59-11
          BX1    X7*X6
          LX7    6-4         SNL
          LX6    11-12
          BX6    X6*X7
          BX1    X1+X6
          LX7    4-5         SZA
          BX6    X0*X2
          NZ     X6,GP2.1 
          BX1    X1+X7
 GP2.1    LX7    5-3         SENSE OF TEST
          BX1    X7-X1
          LX1    1
          MX6    -1 
          BX1    -X6*X1 
          IX5    X5+X1       INCR PC IF TRUE
          BX5    X0*X5
          LX7    3-7         CLA
          PL     X7,GP2.2 
          BX2    -X0*X2 
 GP2.2    LX7    7-2         OSR
          PL     X7,GP2.3 
          SA1    SR 
          BX2    X2+X1
 GP2.3    LX7    2-1         HLT
          PL     X7,INT1
          EQ     INT0 
  
 GP3      EQ     ERR
          SPACE  4
          USE    // 
 MEMORY   BSS    1024 
          USE    *
  
          USE    /REGS/ 
 SR       BSS    1
 MA       BSS    1
 MD       BSS    1
 PC       BSS    1
 AC       BSS    1
 LK       BSS    1
 MQ       BSS    1
 STEP     BSS    1
          USE    *
          SPACE  4
 SAVREG   PS
          BX6    X3 
          BX7    X4 
          SA6    MA 
          SA7    A6+B1
          BX6    X5 
          BX7    X0*X2
          SA6    A7+B1
          SA7    A6+B1
          BX6    X2 
          AX6    12 
          SA6    A7+B1
          SX6    B2 
          SA6    STEP 
          EQ     SAVREG 
          SPACE  4
 RESREG   PS
          SA1    MA 
          SB1    1
          BX3    X1 
          SA1    A1+B1
          BX4    X1 
          SA1    A1+B1
          BX5    X1 
          SA1    A1+B1
          SA2    A1+B1
          LX2    12 
          BX2    X2+X1
          SA1    STEP 
          SB2    X1 
          SX0    7777B
          EQ     RESREG 
          SPACE  4
          ENTRY  FETCH
 FETCH    PS
          RJ     RESREG 
          FETCH  X3,X4
          RJ     SAVREG 
          EQ     FETCH
          SPACE  4
          ENTRY  STORE
 STORE    PS
          RJ     RESREG 
          STORE  X3,X4
          EQ     STORE
          SPACE  4
 ERR      RJ     SAVREG 
          RJ     =XBADOPR 
          EQ     INTRPT 
          SPACE  4
          ENTRY  NEWNAME     (UNIT,NAME)
 NEWNAME  PS
          SA5    B2 
          SA2    B1          FIND FET 
          SA2    X2+3 
          SX2    X2 
          RECALL X2 
          MX6    -1          INSERT STATUS
          BX6    -X6+X5 
          SA6    X2 
          EQ     NEWNAME
          SPACE  4
          END 
