!*********************************************
!* *
!* 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