Google
 

Trailing-Edge - PDP-10 Archives - BB-H348C-RM_1982 - swskit-v21/debugging-tools/ddt11/stb.b36
There are no other files named stb.b36 in the archive.
! NET:<GUNN>STB.B36.2  3-Nov-81 09:00:04, Edit by GUNN
!
! Add print out of length for PSECT GSD records.
!
MODULE STB (					!
		IDENT = '001010',
		LANGUAGE (BLISS36) ,
		MAIN = STB
		) =
BEGIN
!
!			  COPYRIGHT (c) 1979, 1980 BY
!	      DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
!
! THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND  COPIED
! ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH  LICENSE AND WITH THE
! INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR  ANY  OTHER
! COPIES  THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
! OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF  THE  SOFTWARE  IS  HEREBY
! TRANSFERRED.
!
! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE  WITHOUT  NOTICE
! AND  SHOULD  NOT  BE  CONSTRUED  AS  A COMMITMENT BY DIGITAL EQUIPMENT
! CORPORATION.
!
! DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF  ITS
! SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
!

!++
! FACILITY: RSX symbol table file interpreter
!
! ABSTRACT:
!
!
! ENVIRONMENT: TOPS20
!
! AUTHOR: ALAN D. PECKHAM	, CREATION DATE: 23-AUG-79
!
! MODIFIED BY:
!
! 	, : VERSION
! 01	-
!--

!
! TABLE OF CONTENTS:
!

FORWARD ROUTINE
    BACKUP : NOVALUE,				!Back up over edited message removing blanks.
    DUMP : NOVALUE,				!Dump a message buffer.
    GET_RECORD,					!Get a record from the file.
    PUTLIN : NOVALUE,				!Edit and display a line of text.
    STB : NOVALUE;

!
! INCLUDE FILES:
!

LIBRARY 'BLI:MONSYM';				!Define the TOPS20 monitor symbols.

BUILTIN
    JSYS;					!Define the JSYS machine specific function.

!
! MACROS:
!
!
! These two macros are from TENDEF.R36
!
!	POINTR(adr,mask)
!
!	Inputs:
!		adr	- an address
!		mask	- a literal mask of bits
!
!	Expansion:
!		(adr) < pos , siz >	where "pos" and "siz" are inferred from "mask"
!

MACRO
    POINTR (adr, mask) =
	    adr
	<
	    %NBITSU(mask  AND  - mask) - 1
	,
	    %NBITSU(mask) - %NBITSU(mask  AND  - mask) + 1
	>
	%;

!	FLD(val,mask)
!
!	Inputs:
!		val	- a value
!		mask	- a literal mask of bits
!
!	Expansion:
!		(val ^ pos)		where "pos" is inferred from "mask"
!

MACRO
    FLD (val, mask) =
	(
	    (val)
	^
	    (%NBITSU(mask  AND  - mask) - 1)
	)
	%;

!
! Convenient character string macros
!

MACRO
    CH$LEN (PTR) =
				!Get length of ASCIZ string.
	CH$DIFF(CH$FIND_CH(200,PTR,0),PTR) %,
    CH$SEQUENCE (CHARS, CS) =
			!Allocate storage for string.
	VECTOR[CH$ALLOCATION(CHARS,CS)] %,
    CH$ASCIC [] =
				!A pointer to an ASCIC string.
	CH$PTR(UPLIT(%STRING(%CHAR(%CHARCOUNT(%REMAINING)),%REMAINING)),1) %,
    CH$ASCII [] =
				!A pointer to an ASCII string.
	CH$PTR(UPLIT(%ASCII %STRING(%REMAINING))) %,
    CH$ASCIZ [] =
				!A pointer to an ASCIZ string.
	CH$PTR(UPLIT(%ASCIZ %STRING(%REMAINING))) %;

MACRO
    BYTES_PTR [] =
	CH$PTR(UPLIT(WRD36(%EXPLODE(%REMAINING))),,8) %,
    WRD36 [CHR1, CHR2, CHR3, CHR4] =
	(CHR8 (CHR1)^28+CHR8 (CHR2)^20+CHR8 (CHR3)^12+CHR8 (CHR4)^4) %,
    CHR8 (CHR) =
	%IF %NULL (CHR) %THEN 0 %ELSE %C CHR %FI %;

!
! DISPLAY A LINE OF TEXT
!

MACRO
    PUTLN (SKIP, EDIT) [] =
	BEGIN
	%IF %LENGTH GTR 2
	%THEN
	    LOCAL PRM_LIST : VECTOR[%LENGTH-2];
	    MACRO PUTASG[PARAMETER] =
		PRM_LIST[%COUNT]=PARAMETER %QUOTE %;
	    PUTASG( %REMAINING );
	    PUTLIN( SKIP, EDIT, PRM_LIST )
	%ELSE
	    PUTLIN( SKIP, EDIT, 0 )
	%FI
	END %;

MACRO
    FATAL =
	'*FATAL*  ' %,
    WARNING =
	'*WARNING*  ' %;

!
! EQUATED SYMBOLS:
!

LITERAL
    TRUE = 1,					!Truisms.
    FALSE = 0;

!
! OWN STORAGE:
!

OWN
    FIRST_BYTE : INITIAL (FALSE),
    LOAD_ADDRESS : INITIAL (0),
    MACY11_FORMAT : INITIAL (FALSE),
    PSECT_NAME : VECTOR [2] INITIAL (0, 0),
    STB_JFN;

!
! EXTERNAL REFERENCES:
!

EXTERNAL ROUTINE
    $EDMSG;
ROUTINE BACKUP (BUF_PTR_ADR, PAT_PTR_ADR, PRM_LST_ADR_ADR) : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!
!
! FORMAL PARAMETERS:
!
!	..BUF_PTR_ADR				!Pointer to output buffer.
!	..PAT_PTR_ADR				!Pointer to pattern string.
!	..PRM_LST_ADR_ADR			!Pointer to next parameter.
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--

    BEGIN

    LOCAL
	PTR;

    WHILE CH$RCHAR (PTR = CH$PLUS (..BUF_PTR_ADR, -1)) EQL %C' ' DO
	.BUF_PTR_ADR = .PTR;

    END;					!End of BACKUP
ROUTINE DUMP (ADDRESS, MSG_PTR_ADR, MSG_LEN_ADR) : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    LITERAL
	BYTES_PER_LINE = 16;

    OWN
	BYTE_BUFFER : CH$SEQUENCE (BYTES_PER_LINE, 8);

    LOCAL
	ADR,
	CNT,
	LEN,
	MSG_PTR,
	PTR;

    BIND
	BYTE_PTR = CH$PTR (BYTE_BUFFER,, 8);

    ADR = .ADDRESS;
    MSG_PTR = .MSG_PTR_ADR;
    LEN = .MSG_LEN_ADR;

    WHILE .LEN GTR 0 DO
	BEGIN
	PTR = BYTE_PTR;

	INCR CNT FROM 1 TO BYTES_PER_LINE DO
	    CH$WCHAR_A (CH$RCHAR_A (MSG_PTR), PTR);

	PUTLN (0, CH$ASCIZ ('  %P  %#B'), .ADR, MIN (.LEN, BYTES_PER_LINE), BYTE_PTR);
	ADR = .ADR + BYTES_PER_LINE;
	LEN = .LEN - BYTES_PER_LINE
	END;

    END;					!End of DUMP
ROUTINE GET_RECORD (ADDRESS_PTR, LENGTH) =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    LOCAL
	COUNT,
	TEMP_PTR;

    TEMP_PTR = .ADDRESS_PTR;

    IF NOT .MACY11_FORMAT
    THEN
	BEGIN

	DO
	    BEGIN

	    REGISTER
		AC1 = 1,
		AC2 = 2;

	    AC1 = .STB_JFN;
	    JSYS (-1, BIN, AC1, AC2);
	    COUNT = .AC2;
	    END
	WHILE .COUNT EQL 0;

	DECR INDEX FROM (.COUNT + 1)^-1 TO 1 DO
	    BEGIN

	    REGISTER
		AC1 = 1,
		AC2 = 2;

	    AC1 = .STB_JFN;
	    JSYS (-1, BIN, AC1, AC2);
	    CH$WCHAR_A (.AC2<0, 8>, TEMP_PTR);
	    CH$WCHAR_A (.AC2<8, 8>, TEMP_PTR);
	    END;

	END
    ELSE
	BEGIN

	LOCAL
	    CHAR,
	    INDEX,
	    STATE;

	OWN
	    WORD_READ;

	STATE = 0;

	DO
	    BEGIN

	    IF (FIRST_BYTE = NOT .FIRST_BYTE)
	    THEN
		BEGIN

		REGISTER
		    AC1 = 1,
		    AC2 = 2;

		AC1 = .STB_JFN;
		JSYS (-1, BIN, AC1, AC2);
		WORD_READ = .AC2;
		CHAR = .WORD_READ<0, 8>
		END
	    ELSE
		CHAR = .WORD_READ<8, 8>;

	    CASE .STATE FROM 0 TO 5 OF
		SET

		[0] :

		    IF .CHAR EQL 1 THEN STATE = 1;

		[1] :
		    STATE = 2;

		[2] :
		    BEGIN
		    COUNT = 0;
		    COUNT<0, 8> = .CHAR;
		    STATE = 3;
		    END;

		[3] :
		    BEGIN
		    COUNT<8, 8> = .CHAR;
		    INDEX = (COUNT = .COUNT - 4);
		    STATE = 4;
		    END;

		[4] :
		    BEGIN
		    CH$WCHAR_A (.CHAR, TEMP_PTR);

		    IF (INDEX = .INDEX - 1) EQL 0 THEN STATE = 5;

		    END;

		[5] :
		    STATE = -1;
		TES;

	    END
	UNTIL .STATE LSS 0;

	END;

    .COUNT
    END;					!End of GET_RECORD
ROUTINE PUTLIN (TIMES, PATTERN_PTR, PRM_LIST_ADR) : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!
!
!
! FORMAL PARAMETERS:
!
!	TIMES					!NUMBER OF LINES TO SKIP
!						!BEFORE DISPLAYING LINE
!	PATTERN					!ASCIZ STRING USED TO CONTROL
!						!CONSTRUCTION OF OUTPUT LINE
!	PARAMETER_LIST				!PARAMETERS TO TRANSLATE INTO
!						!THE OUTPUT LINE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--

    BEGIN

    OWN
	BUFFER : CH$SEQUENCE (133),		!General editing buffer.
	BUF_LNG;				!Length of edited string.

    BIND
	BUF_PTR = CH$PTR (BUFFER),		!Pointer to print buffer.
	CRLF = CH$ASCIZ (%CHAR (13, 10));	!a pointer to a crlf

    BUF_LNG = .TIMES;

    WHILE (BUF_LNG = .BUF_LNG - 1) GEQ 0 DO
	BEGIN

	REGISTER
	    AC1 = 1;

	AC1 = CRLF;
	JSYS (0, PSOUT, AC1);
	END;

    $EDMSG (%REF (BUF_PTR), .PATTERN_PTR, .PRM_LIST_ADR);
    BEGIN

    REGISTER
	AC1 = 1;

    AC1 = BUF_PTR;
    JSYS (0, PSOUT, AC1);
    AC1 = CRLF;
    JSYS (0, PSOUT, AC1);
    END;
    END;					!OF PUTLIN
ROUTINE STB : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN
    BEGIN

    REGISTER
	AC1 = 1;

    AC1 = CH$ASCIZ ('INPUT FILE NAME: ');
    JSYS (0, PSOUT, AC1);
    END;
    BEGIN

    REGISTER
	AC1 = 1,
	AC2 = 2;

    AC2 = $PRIIN^18 + $PRIOU;
    AC1 = GJ_OLD + GJ_MSG + GJ_CFM + GJ_FNS + GJ_SHT + $GJDEF;
    JSYS (1, GTJFN, AC1, AC2);
    STB_JFN = .AC1<0, 18>;
    END;
    BEGIN

    REGISTER
	AC1 = 1,
	AC2 = 2;

    AC2 = FLD (18, OF_BSZ) + OF_RD + OF_AWT + OF_PDT + OF_NWT;
    JSYS (1, OPENF, AC1, AC2);
    END;
    BEGIN
    MACY11_FORMAT =
    BEGIN

    REGISTER
	AC1 = 1,
	AC2 = 2;

    AC1 = .STB_JFN;
    JSYS (-1, BIN, AC1, AC2);
    .AC2
    END
    EQL 1;
    BEGIN

    REGISTER
	AC1 = 1,
	AC2 = 2;

    AC1 = .STB_JFN;
    AC2 = 0;
    JSYS (-1, SFPTR, AC1, AC2);
    END;
    END;

    WHILE TRUE DO
	BEGIN

	MACRO
	    PTR (INDEX) =
 CH$PTR(BUFFER,INDEX,8) %,
	    CHAR (INDEX) =
 CH$RCHAR(PTR(INDEX)) %;

	LITERAL
	    MAX_COUNT = %O'1000';

	OWN
	    BUFFER : CH$SEQUENCE (MAX_COUNT, 8),
	    COUNT;

	COUNT = GET_RECORD (PTR (0), MAX_COUNT);
	BEGIN

	MACRO
	    SYMBOL (SYM_ADR, REC_PTR) =
		BEGIN
		BIND
		    T_0 = SYM_ADR [0],
		    T_1 = SYM_ADR [1];
		T_0 = 0;
		T_0<0, 8> = CH$RCHAR_A (RECORD_PTR);
		T_0<8, 8> = CH$RCHAR_A (RECORD_PTR);
		T_1 = 0;
		T_1<0, 8> = CH$RCHAR_A (RECORD_PTR);
		T_1<8, 8> = CH$RCHAR_A (RECORD_PTR);
		END %;

	CASE CHAR (0) FROM 1 TO 6 OF
	    SET

	    [1] :
		!
		! GSD - declare Global Symbol Dictionary
		!
		BEGIN

		LOCAL
		    FLAGS,
		    NAME_0,
		    NAME_1,
		    RECORD_END,
		    RECORD_PTR,
		    TYPE,
		    VALUE;

		OWN
		    PSECT_NAME_0 : INITIAL (0),
		    PSECT_NAME_1 : INITIAL (0);

		PUTLN (0, CH$ASCIZ ('GSD record'));
		RECORD_PTR = PTR (2);
		RECORD_END = PTR (.COUNT);

		WHILE CH$DIFF (.RECORD_END, .RECORD_PTR) GTR 0 DO
		    BEGIN
		    NAME_0 = 0;
		    NAME_0<0, 8> = CH$RCHAR_A (RECORD_PTR);
		    NAME_0<8, 8> = CH$RCHAR_A (RECORD_PTR);
		    NAME_1 = 0;
		    NAME_1<0, 8> = CH$RCHAR_A (RECORD_PTR);
		    NAME_1<8, 8> = CH$RCHAR_A (RECORD_PTR);
		    FLAGS = CH$RCHAR_A (RECORD_PTR);
		    TYPE = CH$RCHAR_A (RECORD_PTR);
		    VALUE = 0;
		    VALUE<0, 8> = CH$RCHAR_A (RECORD_PTR);
		    VALUE<8, 8> = CH$RCHAR_A (RECORD_PTR);

		    CASE .TYPE FROM 0 TO 7 OF
			SET

			[0] :
			    !
			    ! Module name
			    !
			    PUTLN (0, CH$ASCIZ ('  Module name: %2R%@'), .NAME_0, .NAME_1, BACKUP);

			[1] :
			    !
			    ! Control section name
			    !
			    PUTLN (0, CH$ASCIZ ('  Control Section name: %2R%@, length: %O'), .NAME_0,
				.NAME_1, BACKUP, .VALUE);

			[2] :
			    !
			    ! Internal symbol name
			    !
			    PUTLN (0, CH$ASCIZ ('  Internal Symbol name: %2R%@'), .NAME_0, .NAME_1, BACKUP);

			[3] :
			    !
			    ! Transfer address
			    !
			    PUTLN (0, CH$ASCIZ ('  Transfer to p-section %2R%@ + %O'), .NAME_0, .NAME_1,
				BACKUP, .VALUE);

			[4] :
			    !
			    ! Global symbol name
			    !
			    BEGIN

			    IF .FLAGS<3, 1>
			    THEN
				PUTLN (0,
				    (IF .FLAGS<5, 1> THEN CH$ASCIZ ('  Global Symbol %2R = %2R%@ + %O''') ELSE
				    CH$ASCIZ ('  Global Symbol %2R = %2R%@ + %O')), .NAME_0, .NAME_1,
				    .PSECT_NAME_0, .PSECT_NAME_1, BACKUP, .VALUE)
			    ELSE
				PUTLN (0, CH$ASCIZ ('  Global Symbol %2R%@ referenced'), .NAME_0, .NAME_1,
				    BACKUP);

			    IF .FLAGS<0, 1>
			    THEN

				IF .FLAGS<3, 1>
				THEN
				    PUTLN (0, CH$ASCIZ ('%4SWeak definition'))
				ELSE
				    PUTLN (0, CH$ASCIZ ('%4SWeak reference'));

			    IF .FLAGS<2, 1> THEN PUTLN (0, CH$ASCIZ ('%4SLibrary definition'));

			    !* MORE TO COME
			    END;

			[5] :
			    !
			    ! Program section name
			    !
			    BEGIN
			    PSECT_NAME_0 = .NAME_0;
			    PSECT_NAME_1 = .NAME_1;
			    PUTLN (0, CH$ASCIZ ('  Program Section %2R%@, length: %O'), .NAME_0, .NAME_1, BACKUP, .VALUE);

			    IF .FLAGS<0, 1>
			    THEN
				PUTLN (0,
				    CH$ASCIZ ('%4SHigh speed memory occupation requested'));

			    IF .FLAGS<1, 1> THEN PUTLN (0, CH$ASCIZ ('%4SResident library psect'));

			    IF .FLAGS<2, 1> THEN PUTLN (0, CH$ASCIZ ('%4SOverlaid'));

			    IF .FLAGS<4, 1>
			    THEN
				PUTLN (0, CH$ASCIZ ('%4SRead-only'))
			    ELSE
				PUTLN (0,
				    CH$ASCIZ ('%4SRead-write'));

			    IF .FLAGS<7, 1>
			    THEN
				PUTLN (0, CH$ASCIZ ('%4SData'))
			    ELSE
				PUTLN (0,
				    CH$ASCIZ ('%4SInstruction'));

			    IF .FLAGS<5, 1> THEN PUTLN (0, CH$ASCIZ ('%4SRelocatable'));

			    IF .FLAGS<6, 1> THEN PUTLN (0, CH$ASCIZ ('%4SGlobal'));

			    !* MORE TO COME
			    END;

			[6] :
			    !
			    ! Program version identification
			    !
			    PUTLN (0, CH$ASCIZ ('  Program version %2R%@'), .NAME_0, .NAME_1, BACKUP);

			[7] :
			    !
			    ! Mapped array declaration
			    !
			    PUTLN (0, CH$ASCIZ ('  Mapped array %2R%@, length: %O blocks'), .NAME_0, .NAME_1,
				BACKUP, .VALUE);

			[INRANGE, OUTRANGE] :
			    RETURN PUTLN (1, CH$ASCIZ (FATAL, 'Invalid GSD record type: %O'), .TYPE);
			TES;

		    END;

		END;

	    [2] :
		!
		! End of Global Symbol Dictionary
		!
		PUTLN (0, CH$ASCIZ ('End GSD record'));

	    [3] :
		!
		! TXT - TeXT information
		!
		BEGIN
		PUTLN (0, CH$ASCIZ ('TXT record'));
		LOAD_ADDRESS<0, 8> = CHAR (2);
		LOAD_ADDRESS<8, 8> = CHAR (3);
		DUMP (.LOAD_ADDRESS, PTR (4), .COUNT - 4);

		IF .LOAD_ADDRESS GEQ 4 THEN LOAD_ADDRESS = .LOAD_ADDRESS - 4;

		END;

	    [4] :
		!
		! RLD - ReLocation Dictionary
		!
		BEGIN

		LOCAL
		    RECORD_END,
		    RECORD_PTR,
		    SIZE,
		    TYPE;

		OWN
		    CONSTANT : INITIAL (0),
		    DISP : INITIAL (0),
		    LOCATION_CTR : INITIAL (0);

		PUTLN (0, CH$ASCIZ ('RLD record'));
		RECORD_PTR = PTR (2);
		RECORD_END = PTR (.COUNT);

		WHILE CH$DIFF (.RECORD_END, .RECORD_PTR) GTR 0 DO
		    BEGIN
		    TYPE = CH$RCHAR_A (RECORD_PTR);
		    SIZE = (IF .TYPE<7, 1> THEN CH$ASCII ('BYTE') ELSE CH$ASCII ('WORD'));

		    CASE .TYPE<0, 7> FROM 1 TO 16 OF
			SET

			[1] :
			    BEGIN
			    DISP = CH$RCHAR_A (RECORD_PTR);
			    CONSTANT<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    CONSTANT<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PUTLN (0, CH$ASCIZ ('  %2R%@ + %O (%A) = %2R%@ + %O'), .PSECT_NAME [0],
				.PSECT_NAME [1], BACKUP, .LOAD_ADDRESS + .DISP, .SIZE, .PSECT_NAME [0],
				.PSECT_NAME [1], BACKUP, .CONSTANT);
			    END;

			[2] :
			    BEGIN

			    LOCAL
				SYMBOL_NAME_0,
				SYMBOL_NAME_1;

			    DISP = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_0 = 0;
			    SYMBOL_NAME_0<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_0<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_1 = 0;
			    SYMBOL_NAME_1<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_1<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PUTLN (0, CH$ASCIZ ('  %2R%@ + %O (%A) = %2R%@'), .PSECT_NAME [0],
				.PSECT_NAME [1], BACKUP, .LOAD_ADDRESS + .DISP, .SIZE, .SYMBOL_NAME_0,
				.SYMBOL_NAME_1, BACKUP);
			    END;

			[3] :
			    BEGIN
			    DISP = CH$RCHAR_A (RECORD_PTR);
			    CONSTANT<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    CONSTANT<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PUTLN (0, CH$ASCIZ ('  %2R%@ + %O (%A) = %O'''), .PSECT_NAME [0],
				.PSECT_NAME [1], BACKUP, .LOAD_ADDRESS + .DISP, .SIZE, .CONSTANT);
			    END;

			[4] :
			    BEGIN

			    LOCAL
				SYMBOL_NAME_0,
				SYMBOL_NAME_1;

			    DISP = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_0 = 0;
			    SYMBOL_NAME_0<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_0<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_1 = 0;
			    SYMBOL_NAME_1<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_1<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PUTLN (0, CH$ASCIZ ('  %2R%@ + %O (%A) = %2R%@'''), .PSECT_NAME [0],
				.PSECT_NAME [1], BACKUP, .LOAD_ADDRESS + .DISP, .SIZE, .SYMBOL_NAME_0,
				.SYMBOL_NAME_1, BACKUP);
			    END;

			[5] :
			    BEGIN

			    LOCAL
				SYMBOL_NAME_0,
				SYMBOL_NAME_1;

			    DISP = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_0 = 0;
			    SYMBOL_NAME_0<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_0<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_1 = 0;
			    SYMBOL_NAME_1<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_1<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    CONSTANT<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    CONSTANT<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PUTLN (0, CH$ASCIZ ('  %2R%@ + %O  (%A) = %2R%@ + %O'), .PSECT_NAME [0],
				.PSECT_NAME [1], BACKUP, .LOAD_ADDRESS + .DISP, .SIZE, .SYMBOL_NAME_0,
				.SYMBOL_NAME_1, BACKUP, .CONSTANT);
			    END;

			[6] :
			    BEGIN

			    LOCAL
				SYMBOL_NAME_0,
				SYMBOL_NAME_1;

			    DISP = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_0 = 0;
			    SYMBOL_NAME_0<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_0<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_1 = 0;
			    SYMBOL_NAME_1<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    SYMBOL_NAME_1<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    CONSTANT<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    CONSTANT<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PUTLN (0, CH$ASCIZ ('  %2R%@ + %O (%A) = %2R%@'' + %O'), .PSECT_NAME [0],
				.PSECT_NAME [1], BACKUP, .LOAD_ADDRESS + .DISP, .SIZE, .SYMBOL_NAME_0,
				.SYMBOL_NAME_1, BACKUP, .CONSTANT);
			    END;

			[7] :
			    BEGIN

			    BIND
				PSECT_NAME_0 = (PSECT_NAME [0]),
				PSECT_NAME_1 = (PSECT_NAME [1]);

			    RECORD_PTR = CH$PLUS (.RECORD_PTR, 1);
			    PSECT_NAME_0<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_0<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_1<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_1<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    LOCATION_CTR<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    LOCATION_CTR<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PUTLN (0, CH$ASCIZ ('  . (%A) = %2R%@ + %O'), .SIZE, .PSECT_NAME_0,
				.PSECT_NAME_1, BACKUP, .LOCATION_CTR);
			    END;

			[8] :
			    BEGIN
			    RECORD_PTR = CH$PLUS (.RECORD_PTR, 1);
			    CONSTANT<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    CONSTANT<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PUTLN (0, CH$ASCIZ ('  . (%A) = . + %O'), .SIZE, .CONSTANT);
			    END;

			[9] :
			    BEGIN
			    DISP = CH$RCHAR_A (RECORD_PTR);
			    PUTLN (0, CH$ASCIZ ('  %2R%@ + %O (%A) = .LIMIT'), .PSECT_NAME [0],
				.PSECT_NAME [1], BACKUP, .LOAD_ADDRESS + .DISP, .SIZE);
			    END;

			[10] :
			    BEGIN

			    LOCAL
				PSECT_NAME_0,
				PSECT_NAME_1;

			    DISP = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_0 = 0;
			    PSECT_NAME_0<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_0<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_1 = 0;
			    PSECT_NAME_1<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_1<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PUTLN (0, CH$ASCIZ ('  %2R%@ + %O (%A) = %2R%@'), .PSECT_NAME [0],
				.PSECT_NAME [1], BACKUP, .LOAD_ADDRESS + .DISP, .SIZE, .PSECT_NAME_0,
				.PSECT_NAME_1, BACKUP);
			    END;

			[12] :
			    BEGIN

			    LOCAL
				PSECT_NAME_0,
				PSECT_NAME_1;

			    DISP = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_0 = 0;
			    PSECT_NAME_0<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_0<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_1 = 0;
			    PSECT_NAME_1<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_1<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PUTLN (0, CH$ASCIZ ('  %2R%@ + %O (%A) = %2R%@'''), .PSECT_NAME [0],
				.PSECT_NAME [1], BACKUP, .LOAD_ADDRESS + .DISP, .SIZE, .PSECT_NAME_0,
				.PSECT_NAME_1, BACKUP);
			    END;

			[13] :
			    BEGIN

			    LOCAL
				PSECT_NAME_0,
				PSECT_NAME_1;

			    DISP = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_0 = 0;
			    PSECT_NAME_0<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_0<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_1 = 0;
			    PSECT_NAME_1<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_1<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    CONSTANT<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    CONSTANT<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PUTLN (0, CH$ASCIZ ('  %2R%@ + %O (%A) = %2R%@ + %O'), .PSECT_NAME [0],
				.PSECT_NAME [1], BACKUP, .LOAD_ADDRESS + .DISP, .SIZE, .PSECT_NAME_0,
				.PSECT_NAME_1, BACKUP, .CONSTANT);
			    END;

			[14] :
			    BEGIN

			    LOCAL
				PSECT_NAME_0,
				PSECT_NAME_1;

			    DISP = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_0 = 0;
			    PSECT_NAME_0<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_0<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_1 = 0;
			    PSECT_NAME_1<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    PSECT_NAME_1<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    CONSTANT<0, 8> = CH$RCHAR_A (RECORD_PTR);
			    CONSTANT<8, 8> = CH$RCHAR_A (RECORD_PTR);
			    PUTLN (0, CH$ASCIZ ('  %2R%@ + %O (%A) = %2R%@'' + %O'), .PSECT_NAME [0],
				.PSECT_NAME [1], BACKUP, .LOAD_ADDRESS + .DISP, .SIZE, .PSECT_NAME_0,
				.PSECT_NAME_1, BACKUP, .CONSTANT);
			    END;

			[16] :
			    RECORD_PTR = CH$PLUS (.RECORD_PTR, 3);

			[15] :
			    BEGIN

			    LOCAL
				OPERATION;

			    RECORD_PTR = CH$PLUS (.RECORD_PTR, 1);

			    WHILE TRUE DO

				SELECTONE (OPERATION = CH$RCHAR_A (RECORD_PTR)) OF
				    SET

				    [0, 1, 2, 3, 4, 5, 6, 8, 9, 17] :
					0;

				    [10, 11] :
					EXITLOOP;

				    [14] :
					RECORD_PTR = CH$PLUS (.RECORD_PTR, 4);

				    [15] :
					RECORD_PTR = CH$PLUS (.RECORD_PTR, 3);

				    [16] :
					RECORD_PTR = CH$PLUS (.RECORD_PTR, 2);

				    [OTHERWISE] :
					RETURN PUTLN (1,
						CH$ASCIZ (FATAL,
						    'Invalid complex relocation operation: %O'), .OPERATION);
				    TES;

			    END;

			[INRANGE, OUTRANGE] :
			    RETURN PUTLN (1, CH$ASCIZ (FATAL, 'Invalid RLD entry type: %O'), .TYPE<0, 7>);
			TES;

		    END;

		END;

	    [5] :
		!
		! ISD - Internal Symbol Dictionary
		!
		PUTLN (0, CH$ASCIZ ('ISD record'));

	    [6] :
		!
		! End of Module
		!
		RETURN PUTLN (0, CH$ASCIZ ('End of module record'));

	    [INRANGE, OUTRANGE] :
		RETURN PUTLN (1, CH$ASCIZ (FATAL, 'Invalid record type: %O'), CHAR (0));
	    TES;

	END;
	END;

    END;					!End of STB
END						!End of module

ELUDOM