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