%CONTROL X'0FFFFFFF'
 
!********************************************* 
!*                                           * 
!* THIS ROUTINE RECODES FROM HEX INTO NEW    * 
!* RANGE ASSEMBLY CODE.                      * 
!*                                           * 
!********************************************* 
 
 
%SYSTEMROUTINE NCODE(%INTEGER START, FINISH, CA) 
%ROUTINESPEC PRIMARY DECODE 
%ROUTINESPEC SECONDARY DECODE 
%ROUTINESPEC TERTIARY DECODE 
%ROUTINESPEC DECOMPILE 
%CONSTSTRING (5) %ARRAY OPS(0 : 127) =       %C 
'     ','JCC  ','JAT  ','JAF  ','     ','     ','     ','     ', 
'VAL  ','CYD  ','INCA ','MODD ','PRCL ','J    ','JLK  ','CALL ', 
'ADB  ','SBB  ','DEBJ ','CPB  ','SIG  ','MYB  ','VMY  ','CPIB ', 
'LCT  ','MPSR ','CPSR ','STCT ','EXIT ','ESEX ','OUT  ','ACT  ', 
'SL   ','SLSS ','SLSD ','SLSQ ','ST   ','STUH ','STXN ','IDLE ', 
'SLD  ','SLB  ','TDEC ','INCT ','STD  ','STB  ','STLN ','STSF ', 
'L    ','LSS  ','LSD  ','LSQ  ','RRTC ','LUH  ','RALN ','ASF  ', 
'LDRL ','LDA  ','LDTB ','LDB  ','LD   ','LB   ','LLN  ','LXN  ', 
'TCH  ','ANDS ','ORS  ','NEQS ','EXPA ','AND  ','OR   ','NEQ  ', 
'PK   ','INS  ','SUPK ','     ','COMA ','DDV  ','DRDV ','DMDV ', 
'SWEQ ','SWNE ','CPS  ','TTR  ','FLT  ','IDV  ','IRDV ','IMDV ', 
'MVL  ','MV   ','CHOV ','     ','FIX  ','RDV  ','RRDV ','RDVD ', 
'UAD  ','USB  ','URSB ','UCP  ','USH  ','ROT  ','SHS  ','SHZ  ', 
'DAD  ','DSB  ','DRSB ','DCP  ','DSH  ','DMY  ','DMYD ','CBIN ', 
'IAD  ','ISB  ','IRSB ','ICP  ','ISH  ','IMY  ','IMYD ','CDEC ', 
'RAD  ','RSB  ','RRSB ','RCP  ','RSC  ','RMY  ','RMYD ','     ' 
%INTEGER I, J, K, KP, KPP, N, OPCODE, FLAG, SIZE 
%INTEGER L 
%INTEGER TRACE, DECOMP, INSL, DEC 
%INTEGER TOS, H, Q, INS, MASK, LITFILL, M, KPPP 
%INTEGER PC 
%INTEGER ALL 
%CONSTINTEGERARRAY HX(0 : 15) =     %C 
'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' 
!* 
%ROUTINE MOVE(%INTEGER LENGTH, FROM, TO) 
%INTEGER I 
         %RETURNIF LENGTH <= 0 
         I = X'18000000'!LENGTH 
         *LSS_FROM 
         *LUH_I 
         *LDTB_I 
         *LDA_TO 
         *MV_%L=%DR 
%END;                                   !OF MOVE 
!* 
%ROUTINE PHEX(%INTEGER N) 
%INTEGER I,J,H 
      H=ADDR(N) 
      %CYCLE I = 0,1,3 
         J=BYTEINTEGER(I+H) 
         PRINTSYMBOL(HX(J>>4)) 
         PRINTSYMBOL(HX(J&15)) 
      %REPEAT 
%END;                                   !OF PHEX 
!* 
   PC = 0 
   %IF START>>18 # FINISH>>18 %THEN %START 
      START = (FINISH>>18)<<18;         ! FROM START OF SEGMENT 
      CA = START 
   %FINISH 
ALL = FINISH-START 
!! 
!!   VALIDATE CODE AREA TO BE DUMPED 
!! 
   I = X'18000000'!ALL 
   *LDTB_I 
   *LDA_START 
   *VAL_(%LNB+1) 
   *JCC_3,<BADADDR> 
!! 
   NEWLINE 
   %WHILE PC < ALL %THEN %CYCLE 
      FLAG = 0 
      H = 0 
      DEC = 0 
      MOVE(4,START+PC,ADDR(INS)) 
      OPCODE = INS>>25<<1 
      %IF OPCODE = 0 %OR OPCODE = 254 %C 
         %OR 8 <= OPCODE <= 14 %THEN %START 
         INSL = 16 
         FLAG = 1 
      %FINISH %ELSE %START 
         %IF 2 <= OPCODE <= 8 %THEN TERTIARY DECODE %ELSE %START 
            %IF X'8' <= OPCODE>>4 <= X'B' %C 
               %AND OPCODE&X'F' < 7 %THEN SECONDARY DECODE %C 
               %ELSE PRIMARY DECODE 
         %FINISH 
      %FINISH 
      DECOMPILE 
      PC = PC+(INSL>>3) 
      NEWLINE 
   %REPEAT 
   %RETURN 
BADADDR: 
   PRINTSTRING(" 
INNACCESSIBLE CODE AREA PASSED TO NCODE FOR PRINTING - ") 
   PHEX(START) 
   PRINTSTRING(" TO ") 
   PHEX(FINISH) 
   NEWLINES(2) 
 
 
 
 
!*********************************************************************** 
!* ROUTINE TO INTERPRET PRIMARY FORMAT INSTRUCTION 
 
 
   %ROUTINE PRIMARY DECODE 
      DEC = 1 
      K = INS<<7>>30 
      N = INS<<9>>25 
      %UNLESS K = 3 %THEN %START 
         INSL = 16 
         %RETURN 
      %FINISH 
      KP = INS<<9>>30 
      KPP = INS<<11>>29 
      %IF KPP < 6 %THEN INSL = 32 %AND N = INS&X'3FFFF' %C 
         %ELSE %START 
         %UNLESS INS&X'30000' = 0 %C 
            %THEN PRINTSTRING(' RES. FIELD #0 
') 
         INSL = 16 
      %FINISH 
   %END 
!*********************************************************************** 
!* ROUTINE TO INTERPRET SECONDARY FORMAT INSTRUCTIONS 
 
 
   %ROUTINE SECONDARY DECODE 
      H = INS<<7>>31 
      Q = INS<<8>>31 
      N = INS<<9>>25 
      %IF Q = 1 %THEN INSL = 32 %ELSE INSL = 16 
   %END 
!*********************************************************************** 
!* ROUTINE TO INTERPRET TERTIARY FORMAT INSTRUCTIONS 
 
 
   %ROUTINE TERTIARY DECODE 
      DEC = 3 
      KPPP = INS<<11>>29 
      %IF KPPP > 5 %THEN INSL = 16 %ELSE INSL = 32 
      N = INS&X'3FFFF' 
      %IF INSL = 16 %AND INS<<14>>16 # 0 %C 
         %THEN PRINTSTRING(' 2 LS BITS #0 
') 
   %END 
!*********************************************************************** 
!* ROUTINE TO INTERPRET CURRENT INSTRUCTION 
 
 
   %ROUTINE DECOMPILE 
   %CONSTSTRING (12) %ARRAY POP(0 : 31) =       %C 
'N           ','***         ','(LNB+N)     ','(XNB+N)     ', 
'(PC+N)      ','(CTB+N)     ','TOS         ','B           ', 
'(DR+N)      ','***         ','(DR+(LNB+N))','(DR+(XNB+N))', 
'(DR+(PC+N)) ','(DR+(CTB+N))','(DR+TOS)    ','***         ', 
'ISN         ','***         ','((LNB+N))   ','((XNB+N))   ', 
'((PC+N))    ','((CTB+N))   ','(TOS)       ','(DR)        ', 
'ISB         ','***         ','((LNB+N)+B) ','((XNB+N)+B) ', 
'((PC+N)+B)  ','((CTB+N)+B) ','(TOS+B)   ','(DR+B)    ' 
   %CONSTSTRING (12) %ARRAY TOP(0 : 7) =     %C 
'N           ','(DR+N)      ','(LNB+N)     ','(XNB+N)     ', 
'(PC+N)      ','(CTB+N)     ','(DR)        ','(DR+B)      ' 
      J = PC+CA 
      PRINTSYMBOL(HX((J>>16)&3)) 
      PRINTSYMBOL(HX((J>>12)&15)) 
      PRINTSYMBOL(HX((J>>8)&15)) 
      PRINTSYMBOL(HX((J>>4)&15)) 
      PRINTSYMBOL(HX(J&15)) 
      SPACES(4) 
!%CYCLE I=3,-1,0 
!J=(INS>>(8*I))&X'FF' 
!%IF 32<=J<=123 %THEN PRINTSYMBOL(J) %ELSE PRINTSYMBOL('.') 
!%EXIT %IF I=2 %AND INSL=16 
!%REPEAT 
!%IF INSL=16 %THEN SPACES(8) %ELSE SPACES(2) 
      %IF INSL = 16 %THEN SPACES(4) 
      %IF INSL = 16 %THEN %START 
         %CYCLE J = 28,-4,16 
            PRINTSYMBOL(HX((INS>>J)&15)) 
         %REPEAT 
      %FINISH %ELSE PHEX(INS) 
      %RETURN %IF FLAG = 1 
      SPACE 
      PRINTSTRING(OPS((OPCODE>>1))) 
      SPACE 
      %IF DEC = 1 %THEN %START;         ! PRIMARY FORMAT 
         %IF K < 3 %THEN %START 
            %IF K = 1 %THEN PRINTSTRING('(LNB+N)     X') 
            %IF K = 2 %THEN PRINTSTRING('@(LNB+N)    X') 
            %IF K = 0 %THEN PRINTSTRING('            X') 
            %IF K = 0 %THEN %START 
               %IF N>>6 = 1 %THEN N = -(N!X'FFFFFF80') %C 
                  %AND PRINTSYMBOL('-') 
            %FINISH 
            PRINTSYMBOL(HX((N>>4)&7)) 
            PRINTSYMBOL(HX(N&15)) 
         %FINISH %ELSE %START 
            PRINTSTRING(POP(KP*8+KPP)) 
            %IF INSL = 32 %THEN %START 
               PRINTSTRING("X") 
               %IF (KP = 0 %AND KPP = 0) %OR KPP = 4 %THEN %START 
                  %IF (N>>16) > 1 %THEN N = -(N!X'FFFC0000') %C 
                     %AND PRINTSYMBOL('-') 
               %FINISH 
               PRINTSYMBOL(HX((N>>16)&3)) 
               %CYCLE I = 12,-4,0 
                  PRINTSYMBOL(HX((N>>I)&15)) 
               %REPEAT 
            %FINISH 
         %FINISH 
         %IF INS = X'62' %THEN %START;  ! LSS IN DECIMAL FOR KEITH 
            PRINTSTRING("  (") 
            WRITE(N,1) 
            PRINTSTRING(")") 
         %FINISH 
      %FINISH 
      %IF DEC = 2 %THEN %START;         ! SECONDARY FORMAT 
         PRINTSTRING('            X') 
         PRINTSYMBOL(HX((INS>>20)&7)) 
         PRINTSYMBOL(HX((INS>>16)&15)) 
         %IF INSL = 32 %THEN %START 
            ! MASK 
            PRINTSTRING(' X') 
            PRINTSYMBOL(HX((INS>>12)&15)) 
            PRINTSYMBOL(HX((INS>>8)&15)) 
            ! LITERAL/FILLER 
            PRINTSTRING(' X') 
            PRINTSYMBOL(HX((INS>>4)&15)) 
            PRINTSYMBOL(HX(INS&15)) 
            PRINTSTRING(' H=') 
            WRITE(H,1) 
         %FINISH 
      %FINISH 
      %IF DEC = 3 %THEN %START;         ! TERTIARY FORMAT 
         PRINTSTRING(TOP(KPPP)) 
         %IF INSL = 32 %THEN %START 
            ! M FIELD 
            PRINTSTRING(' X') 
            PRINTSYMBOL(HX((INS>>21)&15)) 
            PRINTSTRING(' X') 
            %IF KPPP = 0 %OR KPPP = 4 %THEN %START 
               %IF (N>>16) > 1 %THEN N = -(N!X'FFFC0000') %C 
                  %AND PRINTSYMBOL('-') 
            %FINISH 
            PRINTSYMBOL(HX((N>>16)&3)) 
            %CYCLE I = 12,-4,0 
               PRINTSYMBOL(HX((N>>I)&15)) 
            %REPEAT 
         %FINISH 
      %FINISH 
   %END 
%END 
%ENDOFFILE