! reconstituted from intexts

%EXTERNALROUTINE RECODE(%INTEGER S, TO, BASE)
%CONSTINTEGERARRAY OPCODES(0 : 255) =    %C
     0(4),
M'SPM ',M'BALR',M'BCTR',M'BCR ',M'SSK ',M'ISK ',M'SVC ',     0(5),
M'LPR ',
M'LNR ',M'LTR ',M'LCR ',M'NR  ',M'CLR ',M'OR  ',M'XR  ',M'LR  ',
M'CR  ',
M'AR  ',M'SR  ',M'MR  ',M'DR  ',M'ALR ',M'SLR ',M'LPDR',M'LNDR',
M'LTDR',
M'LCDR',M'HDR ',M'LRDR',M'MXR ',M'MXDR',M'LDR ',M'CDR ',M'ADR ',M'SDR ',
M'MDR ',
M'DDR ',M'AWR ',M'SWR ',M'LPER',M'LNER',M'LTER',M'LCER',M'HER ',M'LRER',
M'AXR ',
M'SXR ',M'LER ',M'CER ',M'AER ',M'SER ',M'MER ',M'DER ',M'AUR ',M'SUR ',
M'STH ',
M'LA  ',M'STC ',M'IC  ',M'EX  ',M'BAL ',M'BCT ',M'BC  ',M'LH  ',M'CH  ',
M'AH  ',
M'SH  ',M'MH  ',     0,
M'CVD ',
M'CVB ',M'ST  ',     0(3),M'N   ',M'CL  ',M'O   ',
M'X   ',
M'L   ',M'C   ',M'A   ',M'S   ',M'M   ',M'D   ',M'AL  ',M'SL  ',M'STD ',
     0(6),
M'MXD ',
M'LD  ',M'CD  ',M'AD  ',M'SD  ',M'MD  ',M'DD  ',M'AW  ',M'SW  ',
M'STE ',
     0(7),
M'LE  ',
M'CE  ',M'AE  ',M'SE  ',M'ME  ',M'DE  ',M'AU  ',M'SU  ',
M'SSM',
     0,M'LPSW',M'DIAG',M'WRD ',M'RDD ',M'BXH ',M'BXLE',M'SRL ',M'SLL ',
M'SRA ',
M'SLA ',M'SRDL',M'SLDL',M'SRDA',M'SLDA',M'STM ',M'TM  ',M'MVI ',
M'TS  ',
M'NI  ',M'CLI ',M'OI  ',M'XI  ',M'LM  ',     0(3),
M'SIO ',
M'TIO ',M'HIO ',
M'TCH ',
     0(49),
M'MVN ',
M'MVC ',M'MVZ ',M'NC  ',M'CLC ',M'OC  ',M'XC  ',     0(4),
M'TR  ',
M'TRT ',M'ED  ',M'EDMK',     0(17),M'MVO ',M'PACK',M'UNPK',     0(4),
M'ZAP ',
M'CP  ',M'AP  ',M'SP  ',M'MP  ',M'DP  ',     0,     0
%INTEGER J, K, L, M
%INTEGER T
%ROUTINESPEC HEX(%INTEGER N)
%ROUTINESPEC HEX8(%INTEGER N)
%ROUTINESPEC PUT(%INTEGER S, C)

!printstring("RECODE(X'"); HEX8(S)
!printstring("', X'"); HEX8(TO)
!printstring("', X'"); HEX8(BASE)
!printstring("')".snl)
          S = S&(\1)
BASE = BASE-S
L1:        NEWLINE
          NEWLINE %AND %RETURN %IF S >= TO
PRINT STRING("C ")
          HEX8(BASE+S)
          SPACES(4)
          J = SHORTINTEGER(S);  S = S+2
          M = J>>8&255
          T = OPCODES(M)
          HEX(J)
          -> L1 %IF T = 0
          %IF M>>6 = 0 %THEN %START;    ! RR
             PUT(12,T)
             WRITE(J>>4&15,4)
             print symbol(',')
             WRITE(J&15,2)
             -> L1
          %FINISH
          K = SHORTINTEGER(S);  S = S+2
          HEX(K)
          %IF M>>6 = 1 %THEN %START;    !  RX
             PUT(8,T)
             WRITE(J>>4&15,4);  print symbol(',')
             WRITE(K&X'FFF',4);  print symbol('(')
             WRITE(J&15,2);  print symbol(',')
L3:           WRITE(K>>12&15,2);  print symbol(')')
             -> L1
          %FINISH
          %IF M&X'F8' = X'88' %THEN %START
             PUT(8,T)
             WRITE(J>>4&15,4);  print symbol(',')
L2:           WRITE(K&X'FFF',4);  print symbol('(')
             -> L3
          %FINISH
          %IF M > 192 %THEN %START
             L = SHORTINTEGER(S);  S = S+2
             HEX(L)
             PUT(4,T)
             WRITE(K&X'FFF',5);  print symbol('(')
             %IF M>>4&15 # 15 %THEN WRITE(J&255+1,2) %C
                %ELSE WRITE(J>>4&15,2)
             print symbol(',')
             WRITE(K>>12&15,2);  print symbol(')');  print symbol(',')
             WRITE(L&X'FFF',4);  print symbol('(')
             %IF M>>4&15 = 15 %THEN %START
                WRITE(J&15,2);  print symbol(',')
             %FINISH
             WRITE(L>>12&15,2);  print symbol(')')
             -> L1
          %FINISH
          %IF M = 134 %OR M = 135 %OR M = 144 %OR M = 152 %THEN %START
             PUT(8,T)
             WRITE(J>>4&15,4);  print symbol(',')
             WRITE(J&15,2);  print symbol(',')
             -> L2
          %FINISH
          PUT(8,T)
          WRITE(K&X'FFF',5);  print symbol('(')
          WRITE(K>>12&15,2);  print symbol(')')
          print symbol(',')
          WRITE(J&255,2)
          -> L1

%ROUTINE HEX(%INTEGER N)
%CONSTBYTEINTEGERARRAY XSYM(0 : 15) = %C
   '0', '1', '2', '3',
   '4', '5', '6', '7',
   '8', '9', 'A', 'B',
   'C', 'D', 'E', 'F'
%INTEGER J, S
          %CYCLE J = 1,1,4; !8
             S = (N>>12)&15; !S = N>>28
             N = N<<4
             PRINTSYMBOL(XSYM(S))
          %REPEAT
%END

%ROUTINE HEX8(%INTEGER N)
%CONSTBYTEINTEGERARRAY XSYM(0 : 15) = %C
   '0', '1', '2', '3',
   '4', '5', '6', '7',
   '8', '9', 'A', 'B',
   'C', 'D', 'E', 'F'
%INTEGER J, S
          %CYCLE J = 1,1,8
             S = (N>>28)&15
             N = N<<4
             PRINTSYMBOL(XSYM(S))
          %REPEAT
%END

%ROUTINE PUT(%INTEGER SP, SYMS)
%INTEGER I
         SPACES(SP)
         %CYCLE I = 1,1,4
            PRINT SYMBOL(SYMS>>24&127); SYMS = SYMS << 8
         %REPEAT
%END

%END

%ENDOFFILE
