pdp1 := Begin {oct} !One's Complement ** Processor.State ** AC\Accumulator<0:17>, IO\Input.Output.Register<0:17>, PC\Program.Counter<6:17>, OV\Overflow<>, PF\Program.Flags<1:6>, RUN<>, ** Memory.State ** M\Memory[0:4095]<0:17>, ** Console.State ** TWS\Test.Word.Switches<0:17>, SS\Sense.Switches<1:6>, AS\Address.Switches<0:15>, ** Instruction.Format ** i\instruction<0:17>, op<0:4> :=i<0:4>, !Operation.Code ib<> :=i<5>, !Indirect Bit y<6:17> :=i<6:17>, !Address cli<> :=i<6>, !Clear IO lat<> :=i<7>, !OR AC and Test.Switches cma<> :=i<8>, !Complement AC hlt<> :=i<9>, !Halt cla<> :=i<10>, !Clear AC lap<> :=i<11>, !Load PC stf<0:3> :=i<14:17>, !Set Program.Flags clf<0:3> :=i<14:17>, !Clear Program.Flags spi<> :=i<7>, !Skip if Positive IO szo<> :=i<8>, !Skip if Zero OV sza<> :=i<9>, !Skip if Zero AC spa<> :=i<10>, !Skip if Positive AC sma<> :=i<11>, !Skip if Negative AC szs<0:2> :=i<12:14>, !Skip if Zero Switches szf<0:2> :=i<15:17>, !Skip if Zero Flags ** Effective.Address ** z<6:17> := Begin z = y Next Repeat Begin !Indefinite indirect If Not ib => Leave z Next z = ib@y = M[y]<5:17> End End, ** Instruction.Interpretation ** interp := Begin Repeat Begin If Not RUN => Stop() Next i = M[PC] Next PC = PC + 1 Next execute() End End, execute := Begin Decode op => Begin !Load and Store Group lac := AC = M[z()], !Load Accumulator lio := IO = M[z()], !Load I/O Register law := AC <- ib@y, !Load Immediate (sign extension) dac := M[z()] = AC, !Deposit Accumulator dio := M[z()] = IO, !Deposit I/O Register dap := M[z()]<6:17> = AC<6:17>, !Deposit Address Part dip := M[z()]<0:5> = AC<0:5>, !Deposit Instruction Part dzm := M[z()] = 0, !Deposit 0 in Memory !Arithmetic and Logical Group add := Begin OV@AC = AC + M[z()] Next If AC Eqv #777777 => AC = 0 End, sub := Begin OV@AC = AC -M[z()] Next If AC Eqv #777777 => AC = 0 End, mus := Begin !Multiplication Step If IO<17> => AC = AC + {us} M[z()] Next AC@IO = (AC@IO) Sr0 1 Next If AC Eqv #777777 => AC =0 End, dis := Begin !Division Step AC@IO = AC<1:17>@IO@(Not AC<0>) Next If IO<17> => AC = AC - {us} M[z()] Next If Not IO<17> => AC = AC + {us} M[z()] + 1 Next If AC Eqv #7777777 => AC = 0 End, and := AC = AC And M[z()], ior := AC = AC Or M[z()], xor := AC = AC Xor M[z()], !Program Control Group jmp := PC = z(), !Jump jsp := Begin !Jump and Save PC AC = OV@'00000@PC Next PC = y End, cal.jda := Begin Decode ib => Begin cal := Begin !Subroutine Call M[#100] = AC Next AC = OV@'00000@PC Next PC = #101 End, jda := Begin !Jump and Save AC M[z()] = AC Next AC = OV@'00000@PC Next PC = y + 1 End End End, idx := Begin !Index AC = M[z()] + 1 Next If AC Eqv #777777 => AC = 0 Next M[z] = AC End, isp := Begin !Increment and Skip If Positive AC = M[z()] + 1 Next If AC Eqv #7777777 => AC = 0 Next M[z] = AC; If AC Geq 0 => PC = PC + 1 End, sad := If AC Neq M[z()] => PC = PC + 1, !Skip if AC Differs sas := If AC Eql M[z()] => PC = PC + 1, !Skip if AC Same xct := Begin !Execute i = M[z()] Next Restart exec End, iot := Undefined(), sft := shift.rotate.group(), skp := skip.group(), opr := operate.group(), Otherwise := RUN = 0 !Undefined Operations End End, skip<>, !Result of Condition Tests skip.group := Begin skip = 0 Next Decode ib => Begin 0 := Begin !True Test If szo And (OV Eqv 0) => (skip = 1; OV = 0); If sza And (AC Eql 0) => skip = 1; If spa And (AC Geq 0) => skip = 1; If sma And (AC Lss 0) => skip = 1; If spi And (IO Geq 0) => skip = 1; Decode szs => !Test Sense Switches Begin #0 := No.Op(), #7 := If SS Eql 0 => skip = 1, Otherwise := If SS Eqv 0 => skip = 1 End; Decode szf => !Test Program Flags Begin #0 := No.Op(), #7 := If PF Eql 0 => skip = 1, Otherwise := If PF Eqv 0 => skip = 1 End End, 1 := Begin !Reverse Test If szo And (OV Xor 0) => (skip = 1; OV = 0); If sza And (AC Neq 0) => skip = 1; If spa And (AC Lss 0) => skip = 1; If sma And (AC Geq 0) => skip = 1; If spi And (IO Lss 0) => skip = 1; Decode szs => !Test Sense Switches Begin #0 := No.Op(), #7 := If SS Neq 0 => skip = 1, Otherwise := If SS Xor 0 => skip = 1 End; Decode szf => !Test Program Flags Begin #0 := No.Op(), #7 := If PF Neq 0 => skip = 1, Otherwise := If PF Xor 0 => skip = 1 End End, End Next if skip => PC = PC + 1 !Skip End, operate.group := Begin If hlt => Run = 0; If cla => AC = 0; If cli => IO = 0; Decode clf => Begin #01:#06 := PF> = 0, #07 := PF = #00, Otherwise := No.Op() End; Decode stf => Begin #11:#16 := PF> = 1, #17 := PF = #77, Otherwise := No.Op() End Next If lat => AC = AC Or TWS Next If lap => Begin AC<0> = AC<0> Or OV; AC<1:5> = 0; AC<6:17> = PC End Next If cma => AC = Not AC End, !Shift and Rotate Operations hardware function ones(x<0:8>)<0:3>, !Count Number of 1's in x shift.op<0:3> := i<5:8>, !Shift Conditions shift.n<0:8> := i<9:17>, !Shift Count shift.rotate.group := Begin Decode.shift.op := Begin !Rotates #01\ral := AC = AC Slr Ones(shift.n), !AC Left #11\rar := AC = AC Srr Ones(shift.n), !AC Right #02\ril := IO = IO Slr Ones(shift.n), !IO Left #12\rir := IO = IO Srr Ones(shift.n), !IO Right #03\rcl := AC@IO = (AC@IO) Slr Ones(shift.n) !AC@IO Left #13\rcr := AC@IO = (AC@IO) Srr Ones(shift.n) !AC@IO Right !Shifts #05\sal := Decode AC<0> => Begin !AC Left 0 := AC = AC S10 Ones(shift.n), 1 := AC = AC S11 Ones(shift.n) End, #15\sar := AC = AC Srd Ones(shift.n), !AC Right #06\sil := Decode IO<0> => !IO Left 0 := IO = IO S10 Ones(shift.n), 1 := IO = IO S11 Ones(shift.n) End, #16\sir := IO = IO Srd Ones(shift.n), !IO Right #07\scl := Decode AC<0> => Begin !AC@IO Left 0 := AC@IO = AC@IO S10 Ones(shift.n), 1 := AC@IO = AC@IO S11 Ones(shift.n) End, #17\scr := AC@IO = AC@IO Srd Ones(shift.n), !A@IOC Right Otherwise := Undefined() End End End !End of Description