%EXTERNALINTEGERFN TIME40(%INTEGER IN) %INTEGER S, D, SR, DR, BF, LEN, J, T, IND, EF %SWITCH PSW(0:7) %SWITCH EIS(0:3) !! %CONSTINTEGERARRAY MOVEA(0:10) = %C 90, 284, 368, 146, 242, 242, 318, 242, 318, 318, 402 %CONSTINTEGERARRAY MOVEB(0:10) = %C 180, 298, 382, 180, 256(2), 332, 256, 332, 332, 416 %CONSTINTEGERARRAY SOU(0:7) = 0, 78, 84, 174, 84, 174, 146, 236 %CONSTINTEGERARRAY SOUB(0:7) = %C 0, 95, 101, 191, 101, 191, 163, 253 %CONSTINTEGERARRAY CMPA(0:2) = 99, 160, 176 !! %CONSTINTEGERARRAY DST(0:7) = %C 0, 78, 84, 174, 84, 174, 146, 236 %CONSTINTEGERARRAY DSTF(0:7) = %C 0, 90, 90, 180, 90, 180, 174, 264 !! %CONSTINTEGER ODD TIME = 17; ! 1/2 THE ODD BYTE TIME !! %CONSTINTEGERARRAY SOP A(0:2) = 99, 125, 90 %CONSTINTEGERARRAY SOP B(0:2) = 177, 206, 177 !! %CONSTINTEGERARRAY JMP(0:7) = %C 0, 180, 210, 230, 190, 230, 236, 292 %CONSTINTEGERARRAY JSR(0:7) = %C 0, 294, 324, 344, 304, 344, 350, 406 %CONSTINTEGERARRAY EISA(0:7) = %C 28, 78, 98, 174, 98, 174, 174, 264 !! %INTEGERFN ZERO(%INTEGER IN, D, DR) %INTEGER J, X, I, MODE %SWITCH SW(0:56) !! J = IN>>6&X'3F' %IF J > 56 %THEN %RESULT = 0; ! NOT AN INSTR %IF J >= 40 %OR J <= 3 %THEN ->SW(J) !! %IF 32 <= J <= 39 %START %IF BF = 0 %THEN %RESULT = JSR(D); ! JSR %RESULT = 580; ! EMT, TRAP, IOT, BPT %FINISH %RESULT = (176+140)>>1; ! BRANCHES SW(48):SW(50): ! ROR, ASR MODE = 1; -> COM !! SW(55): ! SXT MODE = 2 -> COM !! SW(40): ! CLR SW(41): ! COM SW(42): ! INC SW(43): ! DEC SW(44): ! NEG SW(45): ! ADC SW(46): ! SBC SW(47): ! TST SW(49): ! ROL SW(51): ! ASL SW(3): ! SWAB MODE = 0 COM: %IF D=0 %START %RESULT = SOPA(MODE) %FINISH %ELSE %START T = SOP B(MODE)+DST(D) %IF BF # 0 %THEN T = T+24 %FINISH %RESULT = T !! SW(0): ! HALT AND ? %RESULT = 242 !! SW(56): ! ? %RESULT = 0 !! SW(1): ! JMP %RESULT = JMP(D) !! SW(2): ! RTS, CLC (240) SEC (260) X = (IN >> 3)&7 %IF X=0 %THEN %RESULT = 242 %IF X=4 %THEN %RESULT = 202 %RESULT = 172 !! SW(52): ! MARK %RESULT = 256 SW(53): SW(54): %RESULT = 0 %END !! J = (IN >> 12)&7; S = (IN>>9)&7; D=(IN>>3)&7 SR = (IN>>6)&7; DR = IN&7 BF = IN&X'8000'; ! BYTE FLAG -> PSW(J) !! PSW(0): ! NOT DOUBLE OPER %RESULT = ZERO(IN, D, DR) !! PSW(1): ! MOVE %UNLESS 1 <= D <= 5 %OR S # 0 %START %IF D = 0 %THEN IND = 0 %ELSE IND = D-5 %FINISH %ELSE %START IND = D+3 %FINISH !! %IF BF = 0 %THEN T = MOVEA(IND)+SOU(S) %ELSE %C T = MOVE B(IND)+SOUB(S) %RESULT = T !! PSW(2): ! CMP PSW(6): ! ADD (AND SUB) PSW(3): ! BIT PSW(4): ! BIC PSW(5): ! BIS %IF D = 0 %START %IF S=0 %THEN EF = 0 %ELSE EF = 1 %FINISH %ELSE %START EF = 2 %FINISH %IF S = 0 %THEN T = DSTF(D) %ELSE T = DST(D) T = T+SOU(S)+CMPA(EF); ! SOURCE TIME+EF %IF BF # 0 %AND J#6 %THEN T = T+2*ODD TIME %RESULT = T PSW(7): ->EIS(IN>>9&3) !! EIS(0): ! MUL %RESULT = EISA(D)+888 !! EIS(1): ! DIV %RESULT = EISA(D)+1130 !! EIS(2): ! ASH %RESULT = EISA(D)+388 !! EIS(3): ! ASHC %RESULT = EISA(D)+400 %END !! %EXTERNALINTEGERFN TIME03(%INTEGER IN) %INTEGER S, D, SR, DR, BF, LEN, J, T, IND, EF %SWITCH PSW(0:7) %SWITCH EIS(0:3) !! %CONSTINTEGERARRAY SOU(0:7) = %C 0, 140, 140, 350, 210, 420, 420, 630 %CONSTINTEGERARRAY SOUB(0:7) = %C 0, 105, 105, 315, 175, 385, 385, 595 !! %CONSTINTEGERARRAY DST(0:7) = %C 0, 210, 210, 420, 280, 490, 490, 665 %CONSTINTEGERARRAY DSTB(0:7) = %C 0, 175, 175, 420, 245, 490, 455, 700 !! %CONSTINTEGERARRAY DOPS0(2:25) = %C 350, 385, 350, 315, 350, 315, 350, 385, 350, 385, 350, 350, 245, 385, 315, 280, 315, 280, 420, 385, 420, 385, 420, 420 !! %CONSTINTEGERARRAY SOPS A(0:27) = %C 385, 385, 420, 385, 420, 385, 420, 385, 420, 385, 420, 385, 420, 385, 420, 385, 525, 385, 385, 385, 560, 455, 385, 385, 595, 595, 420, 420 !! %CONSTINTEGERARRAY SOPS B(0:27) = %C 420, 420, 455, 420, 490, 455, 490, 455, 455, 420, 490, 455, 490, 455, 385, 350, 595, 420, 455, 420, 630, 595, 455, 420, 665, 665, 385, 385 !! !! %CONSTINTEGERARRAY JSR(0:7) = %C 0, 70, 140, 175, 140, 245, 245, 420 !! %CONSTINTEGERARRAY EISA(0:7) = %C 35, 210, 280, 315, 280, 385, 385, 560 !! %INTEGERFN ZERO(%INTEGER IN, D, DR) %INTEGER J, X, I, MODE %SWITCH SW(0:56) !! J = IN>>6&X'3F' %IF J > 56 %THEN %RESULT = 0; ! NOT AN INSTR %IF J >= 40 %OR J <= 3 %THEN ->SW(J) !! %IF 32 <= J <= 39 %START %IF BF = 0 %START T = JSR(D) %IF IN>>9&7 = 7 %THEN T=T+525 %ELSE T=T+840 %FINISH %ELSE T=1680 %RESULT = T %FINISH %RESULT = 350; ! BRANCHES !! !! SW(55): ! SXT X = 24; -> COM !! SW(3): ! SWAB X = 26; -> COM !! SW(40): ! CLR SW(41): ! COM SW(42): ! INC SW(43): ! DEC SW(44): ! NEG SW(45): ! ADC SW(46): ! SBC SW(47): ! TST SW(48): ! ROR SW(49): ! ROL SW(50): ! ASR SW(51): ! ASL X = (J-40)*2 COM: %IF BF # 0 %THEN X = X+1 %IF D = 0 %THEN %C T = SOPS A(X) %ELSE %C T = SOPS B(X) %IF BF#0 %THEN %C T = T+DST B(D) %ELSE %C T = T+DST(D) %RESULT = T !! SW(0): ! HALT AND ? %RESULT = 560 !! SW(56): ! ? %RESULT = 0 !! SW(1): ! JMP %RESULT = JSR(D)+350 !! SW(2): ! RTS, CLC (240) SEC (260) X = (IN >> 3)&7 %IF X=0 %THEN %RESULT = 525 %RESULT = 350 !! SW(52): ! MARK %RESULT = 1155 SW(53): SW(54): %RESULT = 0 %END !! J = (IN >> 12)&7; S = (IN>>9)&7; D=(IN>>3)&7 SR = (IN>>6)&7; DR = IN&7 BF = IN&X'8000'; ! BYTE FLAG -> PSW(J) !! PSW(0): ! NOT DOUBLE OPER %RESULT = ZERO(IN, D, DR) !! PSW(1): ! MOVE PSW(2): ! CMP PSW(6): ! ADD (AND SUB) PSW(3): ! BIT PSW(4): ! BIC PSW(5): ! BIS EF = J*2 %IF BF # 0 %THEN EF = EF+1 %IF D # 0 %THEN EF = EF+12 T = DOPS 0(EF) %IF BF = 0 %THEN %C T = T+SOU(S)+DST(D) %ELSE %START T = T+SOUB(S) + DST B(D) %IF (S=2 %OR S=4) %AND SR>=6 %THEN T=T+35 %IF (D=2 %OR D=4) %AND DR>=6 %THEN T=T+70 %FINISH %RESULT = T PSW(7): ->EIS(IN>>9&3) !! EIS(0): ! MUL %RESULT = EISA(D)+4500 !! EIS(1): ! DIV %RESULT = EISA(D)+6000 !! EIS(2): ! ASH %RESULT = EISA(D)+2000 !! EIS(3): ! ASHC %RESULT = EISA(D)+2300 %END !! %EXTERNALINTEGERFN TIME45(%INTEGER IN) %INTEGER S, D, SR, DR, BF, LEN, J, T, EF, OP %SWITCH PSW(0:7) %SWITCH EIS(0:7) !! %CONSTINTEGER NOTEA=15 %CONSTINTEGER NOTEB=7 %CONSTINTEGER NOTEC=23 %CONSTINTEGER NOTEE1=23 %CONSTINTEGER NOTEE2=8 %CONSTINTEGER NOTEF=12 %CONSTINTEGER NOTEG=23 %CONSTINTEGER NOTEH=15 %CONSTINTEGER SHIFT=15 %CONSTINTEGERARRAY MOVA(0:8)=90, 200, 200, 298, 215, 313, 290, %C 388, 113 %CONSTINTEGERARRAY MOVB(0:8)=105, 195, 195, 305, 203, 313, 305 %C , 396, 128 %CONSTINTEGERARRAY SRC(0:7)=0, 83, 83, 181, 98, 196, 173, 271 %CONSTINTEGERARRAY CMPA(0:4)=90, 105, 200, 113, 200 !! %CONSTINTEGERARRAY DSTT(0:7)=0, 83, 83, 181, 98, 196, 173, 271 !! %CONSTINTEGERARRAY CLRA(0:4)=90, 128, 90, 90, 128 %CONSTINTEGERARRAY CLRB(0:4)=200, 218, 113, 200, 143 !! %CONSTINTEGERARRAY JMP(0:7)=0, 143, 143, 226, 143, 241, 218, 316 %CONSTINTEGERARRAY JSR(0:7)=0, 263, 263, 346, 263, 361, 338, 436 !! %INTEGERFN DST(%INTEGER D) %INTEGER T T=DSTT(D) %IF D#0 %AND BF#0 %THEN T=T+NOTEA>>1 %IF D&6#0 %AND D#5 %AND S#0 %THEN T=T+NOTEB %RESULT =T %END !! %INTEGERFN ZERO(%INTEGER IN, D, DR) %INTEGER J, X, I, GROUP %SWITCH SW(0:56) !! J=IN>>6&X'3F' %IF J>56 %THENRESULT =0; ! NOT AN INSTR %IF J>=40 %OR J<=3 %THEN ->SW(J) !! %IF 32<=J<=39 %START %IF BF=0 %THENRESULT =JSR(D) ! JSR %RESULT =526; ! EMT, TRAP, IOT, BPT %FINISH %RESULT =(113+90)>>1; ! BRANCHES SW(48):SW(50): ! ROR, ASR GROUP=4; ->COM SW(44): !NEG GROUP=2; ->COM SW(47): !TST GROUP=3; ->COM SW(3): !SWAB BF=0 SW(40): ! CLR SW(41): ! COM SW(42): ! INC SW(43): ! DEC SW(45): ! ADC SW(46): ! SBC SW(49): ! ROL SW(51): ! ASL SW(55): !SXT GROUP=1 COM: %IF D=0 %START T=CLRA(GROUP) %IF DR=7 %THEN T=T+NOTEG %FINISHELSESTART T=CLRB(GROUP) %IF BF#0 %THENSTART %IF GROUP=2 %THEN T=T+NOTEF>>1 %IF GROUP=4 %THEN T=T+NOTEH>>1 %FINISH %FINISH %RESULT =T+DST(D) !! SW(0): ! HALT AND ? %RESULT =0 !! SW(56): ! ? %RESULT =0 !! SW(1): ! JMP %RESULT =JMP(D) !! SW(2): ! RTS, CLC (240) SEC (260) %IF IN&X'38'=0 %THENRESULT =211 !RTS %RESULT =113 !! SW(52): ! MARK %RESULT =203 SW(53): !MFP,MTP SW(54): %RESULT =0 %END !! OP=(IN>>12)&7; S=(IN>>9)&7; D=(IN>>3)&7 SR=(IN>>6)&7; DR=IN&7 BF=IN&X'8000'; ! BYTE FLAG ->PSW(OP) !! PSW(0): ! NOT DOUBLE OPER S=0 %RESULT =ZERO(IN, D, DR) !! PSW(1): ! MOVE %IF D=0 %AND DR=7 %THEN D=8 %IF S=0 %THEN T=MOVA(D) %ELSE T=MOVB(D) %RESULT =T+SRC(S) !! PSW(6): !ADD AND SUB BF=0 EIS(4): !XOR PSW(2): ! CMP PSW(3): ! BIT PSW(4): ! BIC PSW(5): ! BIS %IF D=0 %START %IF S=0 %THEN EF=0 %ELSE EF=1 %FINISHELSESTART EF=2 %IF OP<=3 %THEN EF=3 %IF OP=7 %THEN EF=4 %FINISH T=SRC(S)+DST(D)+CMPA(EF) %IF EF=0 %AND DR=7 %THEN T=T+NOTEC %IF EF=1 %THENSTART %IF DR=7 %THEN T=T+NOTEE1 %ELSESTART %IF BF#0 %THEN T=T+NOTEE2>>1 %FINISH %FINISH %RESULT =T PSW(7): S=0 ->EIS(IN>>9&3) !! EIS(0): ! MUL %RESULT =SRC(D)+383 !! EIS(1): ! DIV %RESULT =SRC(D)+(783+908)>>1 !! EIS(2): ! ASH EIS(3): ! ASHC %IF D=0 %THEN T=CLRA(5) %ELSE T=CLRB(5) T=T+DST(D)+8*SHIFT %RESULT =T EIS(7): !SOB %RESULT =(113+128)>>1 %END !! %ENDOFFILE %ENDOFFILE