BEGIN CONSTINTEGER EOT = 4 INTEGER LNUM, CURRENT LINE, ADDR, CA, S INTEGERFN ITEM OWNINTEGERARRAY BUF(1:64) INTEGER S, L1, L2 ROUTINE GET(INTEGERNAME N) INTEGER S READSYMBOL(N); READSYMBOL(S) N = N+S<<8 END OWNINTEGER BP, LEFT BP = BP+1; LEFT = LEFT-1; ADDR = ADDR+2 IF LEFT <= 0 START READSYMBOL(S) UNTIL S = 1; SKIPSYMBOL GET(LEFT); GET(ADDR) LEFT = (LEFT-6)//2 STOP IF LEFT <= 0 GET(BUF(S)) FOR S = 1, 1, LEFT SKIPSYMBOL READSYMBOL(L1); READSYMBOL(L2) CURRENT LINE = L2<<6+L1>>1 BP = 1 FINISH RESULT = BUF(BP) END ROUTINE DECODE(INTEGER NN) CONSTINTEGER PC = 7 CONSTINTEGER REG = 0 CONSTINTEGER INDEX = 6 CONSTINTEGER AUTO I = 2 CONSTINTEGER AUTO D = 4 INTEGER SM, SR, SD, DM, DR, DD CONSTSTRING (3)ARRAY RX(0:7) = C 'R0', 'R1', 'R2', 'R3', 'GLA', 'LNB', 'SP', 'PC' INTEGER A, V, SPAC SWITCH TT(-1 : 12) STRINGNAME OP INTEGER T OWNINTEGER HERE = 0, LINE = 0 OWNINTEGERARRAY CUR LINE(0:3) = 0(4) OWNINTEGERARRAY PEND(0:3) = 0(4) OWNINTEGER P, Q, N ROUTINE POCT(INTEGER N) INTEGER J PRINTSYMBOL(N>>J&7+'0') FOR J = 15, -3, 0 END ROUTINE SPOCT(INTEGER N) ROUTINE P(INTEGER N) P(N>>3) IF N&(¬7) # 0 PRINTSYMBOL(N&7+'0') END IF N < 0 START N = -N; PRINTSYMBOL('-') IF N > 0 FINISH P(N) END INTEGERFN NEXT INTEGER A N = N-1; Q = Q+1; A = PEND(Q&3) SPACE; POCT(A) SPAC = SPAC-7 RESULT = A END ROUTINE ADDR(INTEGER V, INTEGERNAME REG, MODE, DISP) MODE = V>>3; REG = V&7 DISP = NEXT IF MODE >= INDEX OR (REG = PC AND MODE >= 2) END ROUTINE OPERAND(INTEGER MODE, BASE, DISP) INTEGER M IF BASE = PC AND MODE > 1 START PRINTSYMBOL('@') IF MODE&1 # 0 PRINTSYMBOL('#') IF MODE < AUTO D SPOCT(DISP) ELSE PRINTSYMBOL('@') IF MODE&1 # 0 AND MODE # 1 M = MODE&6 PRINTSYMBOL('-') IF M = AUTO D SPOCT(DISP) IF M = INDEX PRINTSYMBOL('(') UNLESS MODE = REG PRINTSTRING(RX(BASE)) PRINTSYMBOL(')') UNLESS MODE = REG PRINTSYMBOL('+') IF M = AUTO I FINISH END ROUTINE GET LINE INTEGER S OWNINTEGER EOF = 0 LNUM = LNUM + 1 IF EOF = 1 THEN RETURN SELECTINPUT(2) IF NEXTSYMBOL = EOT THEN START EOF = 1 ; SELECTINPUT(1) ; RETURN FINISH WRITE(LNUM, 4); SPACE; SPACE UNTIL S = NL CYCLE READSYMBOL(S); PRINTSYMBOL(S) IF S = EOT THEN START EOF = 1 ; EXIT FINISH REPEAT SELECTINPUT(1) END ROUTINE FIND(INTEGER V) CONSTSTRING (4)ARRAY TEXT(1:84) = C 'HALT', 'WAIT', 'RTI ', 'BPT ', 'IOT ', 'RSET', 'RTT ', 'NOP ', 'CC ', 'JMP ', 'RTS ', 'SPL ', 'SWAB', 'BR ', 'BNE ', 'BEQ ', 'BGE ', 'BLT ', 'BGT ', 'BLE ', 'JSR ', 'CLR ', 'COM ', 'INC ', 'DEC ', 'NEG ', 'ADC ', 'SBC ', 'TST ', 'ROR ', 'ROL ', 'ASR ', 'ASL ', 'MARK', 'MFPI', 'MTPI', 'SXT ', 'MOV ', 'CMP ', 'BIT ', 'BIC ', 'BIS ', 'ADD ', 'MUL ', 'DIV ', 'ASH ', 'ASHC', 'XOR ', 'FADD', 'FSUB', 'FMUL', 'FDIV', 'SOB ', 'BPL ', 'BMI ', 'BHI ', 'BLOS', 'BVC ', 'BVS ', 'BCC ', 'BCS ', 'EMT ', 'TRAP', 'CLRB', 'COMB', 'INCB', 'DECB', 'NEGB', 'ADCB', 'SBCB', 'TSTB', 'RORB', 'ROLB', 'ASRB', 'ASLB', 'MFPD', 'MTPD', 'MOVB', 'CMPB', 'BITB', 'BICB', 'BISB', 'SUB ', 'REAL' CONSTINTEGERARRAY MASK(1:84) = C K'177777'(8), K'177740', K'177700', K'177770'(2), K'177700', K'177400'(7), K'177000', K'177700'(16), K'170000'(6), K'177000'(5), K'177770'(4), K'177000', K'177400'(10),K'177700'(14),K'170000'(7) CONSTINTEGERARRAY VALUE(1:84) = C K'0', K'1', K'2', K'3', K'4', K'5', K'6', K'240', K'240', K'100', K'200', K'230', K'300', K'400', K'1000', K'1400', K'2000', K'2400', K'3000', K'3400', K'4000', K'5000', K'5100', K'5200', K'5300', K'5400', K'5500', K'5600', K'5700', K'6000', K'6100', K'6200', K'6300', K'6400', K'6500', K'6600', K'6700', K'10000', K'20000', K'30000', K'40000', K'50000', K'60000', K'70000', K'71000', K'72000', K'73000', K'74000', K'75000', K'75010', K'75020', K'75030', K'77000', K'100000', K'100400', K'101000', K'101400', K'102000', K'102400', K'103000', K'103400', K'104000', K'104400', K'105000', K'105100', K'105200', K'105300', K'105400', K'105500', K'105600', K'105700', K'106000', K'106100', K'106200', K'106300', K'106500', K'106600', K'110000', K'120000', K'130000', K'140000', K'150000', K'160000', K'170000' CONSTINTEGERARRAY TYPE(1:84) = C 0(8), 7,8,3,3,1,4(7),9,1(12), 6,1(3),2(6),5(5),3(4),6,4(8),10(2),1(14),2(6), 0 INTEGER J T = -1 CYCLE J = 1, 1, 84 IF V&MASK(J) = VALUE(J) START OP == TEXT(J); T = TYPE(J) RETURN FINISH REPEAT END N = N+1; P = P+1; PEND(P&3) = NN; CUR LINE(P&3) = CURRENT LINE RETURN IF N < 3 SPAC = 24 LINE = CUR LINE((Q+1)&3) IF LINE # HERE START HERE = LINE; GET LINE UNTIL LNUM >= HERE FINISH SPACES(5); POCT(CA-4); SPACE A = NEXT; FIND(A) DM = -1; SM = -1 ->TT(T) TT(2):ADDR(A>>6&K'77', SR, SM, SD) ; ! SOURCE-DESTINATION OPERATIONS TT(1):ADDR(A&K'77', DR, DM, DD); ->PUT ; ! DESTINATION-ONLY OPERATIONS TT(5):ADDR(A&K'77', DR, DM, DD) SM = 0; SD = 0; SR = A>>6&7; ->PUT TT(3):DM = 0; DR = A&7; ->PUT TT(4):V = A&255; V = V!K'177400' IF V&128 # 0 DM = INDEX; DR = PC; DD = V*2+CA-2 ->PUT TT(6):DM = INDEX; DR = PC; DD = A&K'77'; ->PUT TT(7): SM = INDEX; SR = PC; SD = A&15 TT(0): -> PUT TT(8):ADDR(A&K'77', DR, DM, DD) ; ! JMP OPERATION DD = DD + CA -> PUT TT(9):ADDR(A&K'77', DR, DM, DD) ; ! JSR OPERATION SM = 0 ; SD = 0 ; SR = A >> 6 & 7 DD = DD + CA -> PUT TT(10):SM = INDEX ; SR = PC ; SD = A & K'377' ; ! EMT AND TRAP OPERATIONS -> PUT TT(11):SM = INDEX ; SR = PC ; SD = A & 7 ; ! SPL OPERATION -> PUT TT(12):SM = INDEX ; SR = PC ; SD = A & K'77' ; ! MARK OPERATION PUT: SPACES(SPAC); PRINTSTRING(OP) UNLESS (SM = -1 AND DM = -1) OR T = 0 START SPACES(2) OPERAND(SM, SR, SD) UNLESS SM < 0 IF DM >= 0 START PRINTSTRING(", ") IF SM >= 0 OPERAND(DM, DR, DD) FINISH FINISH TT(-1): NEWLINE END CA = 0; CURRENT LINE = 0; LNUM = 0 SELECTINPUT(1); SELECTOUTPUT(1) CYCLE S = ITEM IF ADDR = CA START DECODE(S); CA = CA+2 FINISH REPEAT ENDOFPROGRAM