!*********************************************
!*                                           *
!* THIS ROUTINE RECODES FROM HEX INTO NEW    *
!* RANGE ASSEMBLY CODE.                      *
!*                                           *
!*********************************************


SYSTEMROUTINE  NCODE(INTEGER  START, FINISH, CA)
SYSTEMROUTINESPEC  MOVE(INTEGER  L, FROM, TO)
SYSTEMROUTINESPEC  PHEX(INTEGER  N)
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'
   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  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