@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H            CWU023
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
~V2 -16
                                                                      ISSUE 10~
~V2 0
~V9 -1
~P
~V9 1
~YCWU023
~S1~M~LCOMPILER WRITERS UTILITIES
~S1~M~LSection 2 Version 3
~S1~LSection 2.3 Disassembler for VAX11
~S1~L1.1 General Description
~BThis section contains a disassembler for producing assembler-like
listing of code. This version
interprets the code for the VAX11 and generates suitable
mnemonics.
~S1~L2. Interfaces
~S1~L2.1 Section Interfaces Used
~BNone.
~S1~L2.2 Section Interfaces
~
Library Procedures:~
   OUTPROG(SEGMENT.NO,START.BYTE,FINISH.BYTE)~
~
~
1) OUTPROG(SEGMENT.NO,START.BYTE,FINISH.BYTE)                     OP~
~BThis produces an assembler-like listing of a portion of code as
defined by the parameters.
The first parameter is the segment number
containing the code, the second is the starting byte address, and the third
is the finishing byte address of the code to be interpreted. Output is sent
to the current stream. A suitable default is taken
for the third parameter if it is zero.
~S1~L3. Implementation
~S1~L3.1 Outline of Operation
~BImplementation is straightforward and is adequately
described by the flowcharts.
~X%%
~Y
~P
~V9 -1
~D15
~HFLOWCHARTS
~
~
~H               CWU023
~V9 -1
~F
@TITLE CWU02(3,6)
@COL 1S-2R-5R-7R-9F
@FLOW 1-2-5-7-9
@BOX 1.0
COMPILER WRITERS UTILITIES
SECTION 2
@BOX 2.0
[IMPORTS CWU02/1]
MODULE HEADING
@BOX 5.0
SCALAR DECLARATIONS
@BOX 7.0
PROCEDURE DECLARATIONS
@BOX 9.0
END
@BOX 2.1
#CWU02/1
MODULE(oUTpROG);
@BOX 5.1
*GLOBAL 2;
$IN PW0,PW1,PW2,PW3,PW4;
*GLOBAL 0;
@BOX 7.1
PSPEC OUTHEXCH($IN);
PSPEC OUTHEX64($LO64);
PSPEC OUTHEX8($IN);
PSPEC OUTHEX16($IN);
PSPEC OUTHEX32($IN);
LSPEC OUTPROG($IN,$IN,$IN);
#CWU02.1
#CWU02.2
#CWU02.3
#CWU02.4
#CWU02.5
#CWU02.6
@BOX 9.1
*END
@END
@TITLE CWU02/1(3,10)
@COL 1S-6R-7F
@FLOW 1-6-7
@BOX 1.0
UTILITY IMPORTS
@BOX 6.0
IMPORTED PROCEDURES
@BOX 7.0
END
@BOX 6.1
LSPEC RELEASE.SEGMENT($IN) ;
LSPEC OUT.STACK($IN,$IN) ;
LSPEC OUT.NAME($LO64) ;
LSPEC CAPTION(ADDR[$LO8]) ;
LSPEC OUTCH($IN) ;
LSPEC INCH()/$IN ;
LSPEC NEXTCH()/$IN ;
LSPEC IN.BACK.SPACE($IN) ;
LSPEC SPACES($IN) ;
LSPEC NEWLINES($IN) ;
LSPEC CURRENT.INPUT()/$IN ;
LSPEC CURRENT.OUTPUT()/$IN ;
LSPEC SELECT.INPUT($IN) ;
LSPEC SELECT.OUTPUT($IN) ;
LSPEC IN.I()/$IN ;
LSPEC IN.HEX()/$LO64 ;
LSPEC OUT.I($IN,$IN) ;
LSPEC OUT.HEX($LO32,$IN) ;
LSPEC BREAK.OUTPUT($IN) ;
@END
@TITLE CWU02.1(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROC OUTHEXCH
@BOX 2.0
OUTPUT HEX CHARACTER
@BOX 3.0
END
@BOX 1.1
PROC OUTHEXCH (INPUT);
@BOX 2.1
IF %F&>INPUT > 9 THEN;
  OUTCH("A"+INPUT-10);
ELSE;
 OUTCH("0"+INPUT);
FI;
@BOX 3.1
END;
@END

@TITLE CWU02.2(3,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROC OUTHEX16
@BOX 2.0
OUTPUT 16-BIT NUMBER IN HEX
@BOX 3.0
END
@BOX 1.1
PROC OUTHEX16 (INPUT);
@BOX 2.1
OUTHEX8(INPUT->>8);
OUTHEX8(INPUT);
@BOX 3.1
END;
@END

@TITLE CWU02.3(3,6)
@C1S-2R-3F
@F1-2-3
@BOX 1.0
OUTHEX8 (HEX)
@BOX 2.0
OUTPUT 8-BIT HEX NUMBER IN HEX
@BOX 3.0
END
@BOX 1.1
PROC OUTHEX8(HEX);
@BOX 2.1
OUTHEXCH(HEX->>4);
OUTHEXCH(HEX);
@BOX 3.1
END;
@END
@TITLE CWU02.4(3,6)
@C1S-2R-3F
@F1-2-3
@BOX 1.0
OUTHEX32 (HEX)
@BOX 2.0
OUTPUT 32-BIT HEX NUMBER IN HEX
@BOX 3.0
END
@BOX 1.1
PROC OUTHEX32(HEX);
@BOX 2.1
OUTHEX16(HEX->>16);
OUTHEX16(HEX);
@BOX 3.1
END;
@END
@TITLE CWU02.5(3,10)
@C1S-2R-3F
@F1-2-3
@BOX 1.0
OUTHEX64 (HEX)
@BOX 2.0
OUTPUT 64-BIT NUMBER IN HEX
@BOX 3.0
END
@BOX 1.1
PROC OUTHEX64(HEX);
@BOX 2.1
OUTHEX32(HEX->>32);
OUTHEX(HEX,8);
@BOX 3.1
END;
@END
@TITLE CWU02.6(3,6)
@COL 1S-5R-6F
@FLOW 1-5-6
@BOX 1.0
OUT PROG (SEGMENT, STARTING BYTE, FINISHING BYTE)
@BOX 5.0
CREATE DESCRIPTOR INTO CODE SEGMENT (CODE)
WHILE STARTING ADDRESS =< FINISHING ADDRESS DO

      OUTPUT ADDRESS
      OUTPUT MNEMONIC
      FOR EACH OPERAND
          OUTPUT OPERAND
      OUTPUT HEX
      IF ALL ZERO, SKIP ALL FOLLOWING ZEROES
@BOX 6.0
END
@BOX 1.1
PROC OUTPROG(SEG,START,FINISH);
ADDR [$LO8] CODE;
$IN I,J,NOOFOPS,OPINDEX,OLDSTART,T;
LITERAL BRANCH=1;
#CWU02.6.0
PSPEC GETV8()/$LO64;
PSPEC GETV16()/$LO64;
PSPEC GETV32()/$LO64;
PSPEC GETV64()/$LO64;
PSPEC OUTPUTOPERAND($IN,$IN);
PSPEC OUTREG($IN);
#CWU02.6.1
#CWU02.6.2
#CWU02.6.3
#CWU02.6.4
#CWU02.6.5
#CWU02.6.6
@BOX 5.1
IF FINISH = 0 THEN 128 + START => FINISH FI;
MAKE($LO8,%10000,SEG<<-16)=>CODE;
WHILE START=>OLDSTART=<FINISH DO
 OUTHEX32(START);
 SPACES(1);
 CODE^[START]=>I; %FF&>I;
 1+>START;
 OUTNAME(MNEMONIC[I]);
 OPERAND[I]=>J->>5&%7=>NOOFOPS;
 J&%1F<<-3=>OPINDEX;
 SPACES(1);
IF OPINDEX=0 THEN
 CAPTION(%"??");
ELSE
FOR J < NOOFOPS DO
  OPTYPEANDSIZE[OPINDEX]=>T;
  OUTPUTOPERAND(T->>4,T&%F);
  IF J/=NOOFOPS-1 THEN
   OUTCH(',);
  FI;
  1+>OPINDEX;
 OD;
FI;
 SPACES(30-(START-OLDSTART*3));
 OUTCH(%09):: TAB
 0=>I;
 WHILE OLDSTART<START DO
  CODE^[OLDSTART]=>J!>I;
  OUTHEX8(J);
  1+>OLDSTART;
 OD;
 NEWLINES(1);
 IF I=0 THEN
  WHILE CODE^[OLDSTART]=0 AND OLDSTART=<FINISH DO
   1+>OLDSTART;
  OD;
  IF OLDSTART/=START THEN
   NEWLINES(1);
   OLDSTART=>START;
  FI;
 FI;
OD;
@BOX 6.1
END;
@END
@TITLE CWU02.6.0(3,6)
@COL 1S-2R-3R-4R-6F
@FLOW 1-2-3-4-6
@BOX 1.0
DATAVECS FOR OUTPROG
@BOX 2.0
'MNEMONIC' IS A LIST OF ALL THE FUNCTION NAMES, INDEXED BY THE OPCODE
@BOX 3.0
'OPERAND' IS A LIST OF OPERAND INFORMATION, INDEXED BY THE OPCODE

THE FIRST 3 BITS GIVES THE NUMBER OF OPERANDS FOR THE FUNCTION
THE BOTTOM 5 BITS IS AN INDEX INTO 'OP TYPE AND SIZE'
@BOX 4.0
'OP TYPE AND SIZE' IS A LIST OF ALL USED COMBINATIONS OF OPERAND TYPES AND SIZES

THE TOP 4 BITS ARE THE OPERAND TYPE (BRANCH OR NORMAL)
THE BOTTOM 4 BITS ARE THE OPERAND SIZE (V8,V16,V32,V64)
@BOX 6.0
END
@BOX 2.1
#CWU02.6.0.1
@BOX 3.1
#CWU02.6.0.2
@BOX 4.1
#CWU02.6.0.3
@BOX 6.1
::END
@END

@TITLE CWU02.6.0.1(3,8)
@COL 1S
@BOX 1.0
MNEMONIC DATAVECTOR
@BOX 1.1
DATAVEC MNEMONIC ($LO64)
"HALT" "NOP" "REI" "BPT" "RET" "RSB" "LDPCTX" "SVPCTX" "CVTPS" "CVTSP" "INDEX" "
CRC" "PROBER" "PROBEW" "INSQUE" "REMQUE"
"BSBB" "BRB" "BNEQ" "BEQL" "BGTR" "BLEQ" "JSB" "JMP" "BGEQ" "BLSS" "BGTRU" "BLEQ
U" "BVC" "BVS" "BCC" "BCS"
"ADDP4" "ADDP6" "SUBP4" "SUBP6" "CVTPT" "MULP" "CVTTP" "DIVP" "MOVC3" "CMPC3" "S
CANC" "SPANC" "MOVC5" "CMPC5" "MOVTC" "MOVTUC"
"BSBW" "BRW" "CVTWL" "CVTWB" "MOVP" "CMPP3" "CVTPL" "CMPP4" "EDITPC" "MATCHC" "L
OCC" "SKPC" "MOVZWL" "ACBW" "MOVAW" "PUSHAW"
"ADDF2" "ADDF3" "SUBF2" "SUBF3" "MULF2" "MULF3" "DIVF2" "DIVF3" "CVTFB" "CVTFW"
"CVTFL" "CVTRFL" "CVTBF" "CVTWF" "CVTLF" "ACBF"
"MOVF" "CMPF" "MNEGF" "TSTF" "EMODF" "POLYF" "CVTFD" "????" "ADAWI" "????" "????
" "????" "INSQHI" "INSQTI" "REMQHI" "REMQTI"
"ADDD2" "ADDD3" "SUBD2" "SUBD3" "MULD2" "MULD3" "DIVD2" "DIVD3" "CVTDB" "CVTDW"
"CVTDL" "CVTRDL" "CVTBD" "CVTWD" "CVTLD" "ACBD"
"MOVD" "CMPD" "MNEGD" "TSTD" "EMODD" "POLYD" "CVTDF" "????" "ASHL" "ASHQ" "EMUL"
 "EDIV" "CLRQ" "MOVQ" "MOVAQ" "PUSHAQ"
"ADDB2" "ADDB3" "SUBB2" "SUBB3" "MULB2" "MULB3" "DIVB2" "DIVB3" "BISB2" "BISB3"
"BICB2" "BICB3" "XORB2" "XORB3" "MNEGB" "CASEB"
"MOVB" "CMPB" "MCOMB" "BITB" "CLRB" "TSTB" "INCB" "DECB" "CVTBL" "CVTBW" "MOVZBL
" "MOVZBW" "ROTL" "ACBB" "MOVAB" "PUSHAB"
"ADDW2" "ADDW3" "SUBW2" "SUBW3" "MULW2" "MULW3" "DIVW2" "DIVW3" "BISW2" "BISW3"
"BICW2" "BICW3" "XORW2" "XORW3" "MNEGW" "CASEW"
"MOVW" "CMPW" "MCOMW" "BITW" "CLRW" "TSTW" "INCW" "DECW" "BISPSW" "BICPSW" "POPR
" "PUSHR" "CHMK" "CHME" "CHMS" "CHMU"
"ADDL2" "ADDL3" "SUBL2" "SUBL3" "MULL2" "MULL3" "DIVL2" "DIVL3" "BISL2" "BISL3"
"BICL2" "BICL3" "XORL2" "XORL3" "MNEGL" "CASEL"
"MOVL" "CMPL" "MCOML" "BITL" "CLRL" "TSTL" "INCL" "DECL" "ADWC" "SBWC" "MTPR" "M
FPR" "MOVPSL" "PUSHL" "MOVAL" "PUSHAL"
"BBS" "BBC" "BBSS" "BBCS" "BBSC" "BBCC" "BBSSI" "BBCCI" "BLBS" "BLBC" "FFS" "FFC
" "CMPV" "CMPZV" "EXTV" "EXTZV"
"INSV" "ACBL" "AOBLSS" "AOBLEQ" "SOBGEQ" "SOBGTR" "CVTLB" "CVTLW" "ASHP" "CVTLP"
 "CALLG" "CALLS" "XFC" "ESCD" "ESCE" "ESCF"
END;
@END
@TITLE CWU02.6.0.2(3,8)
@COL 1S
@BOX 1.0
OPERAND DATAVEC
@BOX 1.1
LITERAL/$LO8 BR8=%21,BR16=%22,NONE=%01;
DATAVEC OPERAND ($LO8)
NONE[8] %8F %8F %C5 %A9 %6A %6A %47 %47
BR8[6] %23 %23 BR8[8]
%8F %CF %8F %CF %AD %CF %AD %CF %64 %64 %8E %8E %AD %AD %CE %CE
BR16 BR16 %44 %44 %6E %6E %70 %8F %8E %8F %6A %6A %44 0 %44 %24
%45 %65 %45 %65 %45 %65 %45 %65 %45 %45 %45 %45 %43 %44 %45 0
%45 %45 %45 %25 %B5 %77 %45 NONE 0 NONE[7]
%46 %66 %46 %66 %46 %66 %46 %66 %46 %46 %46 %46 %43 %44 %45 %0
%46 %46 %46 %26 %B9 %7A %46 NONE %67 %68 0[2] %26 %46 %46 %26
%43 %63 %43 %63 %43 %63 %43 %63 %43 %63 %43 %63 %43 %63 %43 %63
%43 %43 %43 %43 %23 %23 %23 %23 %43 %43 %43 %43 %67 0 %43 %23
%44 %64 %44 %64 %44 %64 %44 %64 %44 %64 %44 %64 %44 %64 %44 %64
%44 %44 %44 %44 %24 %24 %24 %24 %24 %24 %24 %24 %24 %24 %24 %24
%45 %65 %45 %65 %45 %65 %45 %65 %45 %65 %45 %65 %45 %65 %45 %65
%45 %45 %45 %45 %25 %25 %25 %25 0[5] %25 %45 %25
%7B %7B %7B %7B %7B %7B %7B %7B %5C %5C 0[6]
0 %9D %7B %7B %5C %5C %45 %45 0[2] %45 %47 0 NONE[3]
END;
@END
@TITLE CWU02.6.0.3(3,7)
@COL 1S
@BOX 1.0
OPTYPEANDSIZE DATAVEC
@BOX 1.1
LITERAL/$LO8 N=%FF,BRV8=%10,BRV16=%11,
   B=%00,W=%01,L=%02,Q=%03;
DATAVEC OPTYPEANDSIZE ($LO8)
N N N N N N N N
BRV8 N N N N N N N
BRV16 N N N N N N N
B B B W W W W N
W W W W W W W N
L L L L L L N N
Q Q Q W W W W N
B L L N N N N N
B Q Q N N N N N
B L W B L N N N
B W B B W B N N
W L N N N N N N
W Q N N N N N N
W B B W B N N N
W B B B W B N N
W B W B W B N N
W B L N N N N N
L B B L N N N N
L L B B N N N N
L L L W W W W N
L L L Q N N N N
L B L L L N N N
L Q L L N N N N
L W B N N N N N
Q L N N N N N N
Q B Q L Q N N N
Q W B N N N N N
L B BRV8 N N N N N
B BRV8 N N N N N N
L L L BRV16 N N N N
N N N N N N N N
N N N N N N N N
END;
@END
@TITLE CWU02.6.1(3,6)
@C1S-2R-3F
@F1-2-3
@BOX 1.0
GET V8

RETURNS A V8 SIGN-EXTENDED TO V64
INCREMENTS PROGRAM ADDRESS
@BOX 2.0
FETCH V8
SIGN EXTEND
INCREMENT PROGRAM ADDRESS
@BOX 3.0
END
@BOX 1.1
PROC GETV8;
@BOX 2.1
IF CODE^[START]=>GETV8&%80/=0 THEN
 %F(14)00!>GETV8;
FI;
1+>START;
@BOX 3.1
END;
@END
@TITLE CWU02.6.2(3,6)
@C1S-2R-3F
@F1-2-3
@BOX 1.0
GET V16

RETURNS A V16 SIGN-EXTENDED TO V64
INCREMENTS PROGRAM ADDRESS
@BOX 2.0
FETCH V16
SIGN EXTEND
INCREMENT PROGRAM ADDRESS
@BOX 3.0
END
@BOX 1.1
PROC GETV16;
@BOX 2.1
CODE^[START+1]<<-8!CODE^[START]=>GETV16;
2+>START;
IF GETV16&%8000/=0 THEN
 %F(12)0(4)!>GETV16;
FI;
@BOX 3.1
END;
@END
@TITLE CWU02.6.3(3,6)
@C1S-2R-3F
@F1-2-3
@BOX 1.0
GET V32

RETURNS A V32 SIGN-EXTENDED TO V64
INCREMENTS PROGRAM ADDRESS
@BOX 2.0
FETCH V32
SIGN EXTEND
INCREMENT PROGRAM ADDRESS
@BOX 3.0
END
@BOX 1.1
PROC GETV32;
@BOX 2.1
CODE^[START+3]<<-8!CODE^[START+2]<<-8!
CODE^[START+1]<<-8!CODE^[START]=>GETV32;
4+>START;
IF GETV32&%80(7)/=0 THEN
 %F(8)0(8)!>GETV32;
FI;
@BOX 3.1
END;
@END
@TITLE CWU02.6.4(3,6)
@C1S-2R-3F
@F1-2-3
@BOX 1.0
GET V64

RETURNS A V64
INCREMENTS PROGRAM ADDRESS
@BOX 2.0
FETCH V64
INCREMENT PROGRAM ADDRESS
@BOX 3.0
END
@BOX 1.1
PROC GETV64;
@BOX 2.1
CODE^[START+7]<<-8!CODE^[START+6]<<-8!
CODE^[START+5]<<-8!CODE^[START+4]<<-8!
CODE^[START+3]<<-8!CODE^[START+2]<<-8!
CODE^[START+1]<<-8!CODE^[START]=>GETV64;
8+>START;
@BOX 3.1
END;
@END
@TITLE CWU02.6.5(3,6)
@C1S-2T-3R-4T-5T-6R-7C-8R-9R-10R-11R-12R-13R-14R-15R-16N
@C18R-19C-20R-21R-22R-23R-24R-26R-28R-62C-63F
@C25R-17R
@R3-25
@R5-17
@R6-18
@R16-62
@F1-2N-3-4N-5N-6-7
@F2Y-25-28
@F4Y-17-63
@F5Y-18-19
@F 22-28-63
@F 23-28
@F11-10
@F13-10
@F14-10
@F15-10
@BOX 1.0
OUTPUT OPERAND (OPTYPE, OPSIZE)
@BOX 2.0
IS OPTYPE = BRANCH OFFSET ?
@BOX 3.0
GET FIRST BYTE OF OPERAND
@BOX 4.0
MODE = 0-3 ?
@BOX 5.0
R15 ?
@BOX 6.0
IF NEEDED, O/P '@'
@BOX 7.0
CASE
MODE
OF
@BOX 8.0
4: OUTPUT OPERAND
   O/P '[RN]'
@BOX 9.0
5: O/P 'RN'
@BOX 10.0
6: O/P '(RN)'
@BOX 11.0
7: O/P '-'
@BOX 12.0
8,9: O/P '(RN)+'
@BOX 13.0
A,B: O/P V8
@BOX 14.0
C,D: O/P V16
@BOX 15.0
E,F: O/P V32
@BOX 17.0
O/P '#'
O/P 6 BIT LITERAL
@BOX 18.0
IF NEEDED, O/P '@'
@BOX 19.0
CASE
MODE
OF
@BOX 20.0
8: O/P '#'
   O/P OPSIZE-D LITERAL
@BOX 21.0
9: O/P '@'
   O/P V32
@BOX 22.0
A,B: O/P V8
@BOX 23.0
C,D: O/P V16
@BOX 24.0
E,F: O/P V32
@BOX 25.0
O/P OPSIZE-D OFFSET
@BOX 26.0
ILLEGAL MODE
GO TO BOXES 8-11
@BOX 62.0
ESAC
@BOX 63.0
END
@BOX 1.1
PROC OUTPUTOPERAND(OPTYPE,OPSIZE);
$IN MODE,RN,OP,T;
@BOX 2.1
IF OPTYPE=BRANCH,
@BOX 3.1
CODE^[START]=>OP;
1+>START;
@BOX 4.1
IF OP->>4&%F=>MODE<4,
@BOX 5.1
IF OP&%F=>RN=15,
@BOX 6.1
IF MODE&%9=%9 THEN
 OUTCH('@);
 %E&>MODE;
FI;
@BOX 7.1
SWITCH MODE-4\
M4,M5,M6,M7,M8,M8,MA,MA,MC,MC,ME,ME;
@BOX 8.1
M4: OUTPUTOPERAND(OPTYPE,OPSIZE);
OUTCH('[);
OUTREG(RN);
OUTCH(']);
->ESAC;
@BOX 9.1
M5:
OUTREG(RN);
->ESAC;
@BOX 10.1
M6: OUTCH('();
OUTREG(RN);
OUTCH('));
->ESAC;
@BOX 11.1
M7: OUTCH('-);
@BOX 12.1
M8: OUTCH('();
OUTREG(RN);
OUTCH('));
OUTCH('+);
->ESAC;
@BOX 13.1
MA: OUTHEX8(GETV8());
@BOX 14.1
MC: OUTHEX16(GETV16());
@BOX 15.1
ME: OUTHEX32(GETV32());
@BOX 17.1
OUTCH('#);
OUTHEX8(%3F&OP);
@BOX 18.1
IF MODE>9 AND MODE&%1/=0 THEN
 OUTCH('@);
 %E&>MODE;
FI;
@BOX 19.1
SWITCH MODE-4\
E,E,E,E,P8,P9,PA,PA,PC,PC,PE,PE;
@BOX 20.1
P8: OUTCH('#);
ALTERNATIVE OPSIZE FROM
 OUTHEX8(GETV8());
 OUTHEX16(GETV16());
 OUTHEX32(GETV32());
 OUTHEX64(GETV64());
END;
->ESAC;
@BOX 21.1
P9: OUTCH('@);
OUTHEX32(GETV32());
->ESAC;
@BOX 22.1
PA: OUTHEX8(GETV8()=>T);
@BOX 23.1
PC: OUTHEX16(GETV16()=>T);
@BOX 24.1
PE: OUTHEX32(GETV32());
->ESAC;
@BOX 25.1
ALTERNATIVE OPSIZE FROM
 OUTHEX8(GETV8()=>T);
 OUTHEX16(GETV16()=>T);
END;
@BOX 26.1
E:
CAPTION(%" *R15?* ");
SWITCH MODE-4\M4,M5,M6,M7;
@B28.1
OUT.CH("{");
OUTHEX16(START + T);
OUT.CH("}");
@BOX 62.1
ESAC:
@BOX 63.1
END;
@END
@TITLE CWU02.6.6(3,6)
@C1S-2C-3R-4R-5R-6R-7R-8C-9F
@F1-2
@F8-9
@BOX 1.0
OUT REG (REGISTER)
@BOX 2.0
CASE
REGISTER
OF
@BOX 3.0
0-11: OUTPUT 'R'
OUTPUT REGISTER
@BOX 4.0
12: OUTPUT 'AP'
@BOX 5.0
13: OUTPUT 'FP'
@BOX 6.0
14: OUTPUT 'SP'
@BOX 7.0
15: OUTPUT 'PC'
@BOX 8.0
ESAC
@BOX 9.0
END
@BOX 1.1
PROC OUTREG(REGISTER);
@BOX 2.1
SWITCH REGISTER\
R,R,R,R,R,R,R,R,R,R,R,R,R12,R13,R14,R15;
@BOX 3.1
R:
OUTCH('R);
OUTI(REGISTER,0);
->ESAC;
@BOX 4.1
R12:
CAPTION(%"AP");
->ESAC;
@BOX 5.1
R13:
CAPTION(%"FP");
->ESAC;
@BOX 6.1
R14:
CAPTION(%"SP");
->ESAC;
@BOX 7.1
R15:
CAPTION(%"PC");
->ESAC;
@BOX 8.1
ESAC:
@BOX 9.1
END;
@END
