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