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