Google
 

Trailing-Edge - PDP-10 Archives - BB-R595B-SM_11-9-85 - mcb/tkb36/wmap.bli
There are 2 other files named wmap.bli in the archive. Click here to see a list.
!NET:<DECNET20-V3P0.TKB-VNP>WMAP.BLI.5 15-Jan-81 09:18:11, Edit by SROBINSON
!<REL4A.TKB-VNP>WMAP.BLI.3,  3-Dec-79 15:16:31, Edit by SROBINSON
MODULE WMAP (					!WRITE GLOBAL MAP
		IDENT = 'X2.0-1'
		) =
BEGIN
!
!
!
!                    COPYRIGHT (c) 1980, 1981, 1982
!                    DIGITAL EQUIPMENT CORPORATION
!                        Maynard, Massachusetts
!
!     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: TKB-20
!
! ABSTRACT:
!
!
! THIS MODULE PRINTS A LIST OF ALL GLOBALS WITH THEIR VALUES AND
!  REFERENCES.  IT ALSO FLAGS UNDEFINED GLOBALS.
!
!
! ENVIRONMENT: TOPS-20 USER MODE
!
! AUTHOR: J. SAUTER, CREATION DATE: 22-FEB-78
!
! MODIFIED BY:
!
!	Scott G. Robinson, 28-SEP-78 : VERSION X0.1-2A
!	- Make map generation more readable
!
!	Scott G. Robinson, 7-NOV-78 : VERSION X0.1-3A
!	- Make map show references to undefined symbols
!
!	Scott G. Robinson, 13-NOV-78 : VERSION X0.1-4A
!	- More cleanup of map generation
!-----------------------------------------------------------------------

!
!	Scott G. Robinson, 3-DEC-79 : Version X2.0
!	- Ensure DECnet-10 Compatibility
!
!	Scott G. Robinson, 15-JAN-80 : Version X2.0-1
!	- Yet another fix to the Global Symbol Xref
!	  (Eventually We will get this right!)
!
!	, : VERSION
! 01	-
!--

!<BLF/PAGE>
!
! TABLE OF CONTENTS:
!

FORWARD ROUTINE
    GLOB : NOVALUE,				!PRODUCE GLOBAL LISTING
    PRC_GLOBL,					!PROCESS EACH GLOBAL
    SEL_PSECT,					!PROCESS EACH PSECT
    UNBLANK,					!SUBSTITUTE "BLANK" FOR BLANKS
    GBL_VAL;					!RETURN THE VALUE OF A GLOBAL

!
! INCLUDE FILES:
!

LIBRARY 'TKBLIB';

!REQUIRE 'BLOCKH.REQ';				!PREPARE TO DEFINE STORAGE BLOCKS
!REQUIRE 'GLOBL.REQ';				!GLOBAL SYMBOL BLOCK
!REQUIRE 'MODU.REQ';				!MODULE BLOCK
!REQUIRE 'PSECT.REQ';				!PSECT BLOCK
!REQUIRE 'BLOCKT.REQ';				!END OF DEFINING STORAGE BLOCKS
!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!

LITERAL
    DEBUG = 0;

!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!

EXTERNAL ROUTINE
    ERRMSG : NOVALUE,				!TYPE AN ERROR MESSAGE
    OUTNUM : NOVALUE,				!WRITE A NUMBER ON A FILE
    OUTPUT : NOVALUE,				!WRITE ON A FILE
    OUTSTR : NOVALUE,				!WRITE A STRING ON A FILE
    PCRLF : NOVALUE,				!SEND CRLF TO A FILE
    FND_CHAIN;					!FIND A BLOCK IN A CHAIN
GLOBAL ROUTINE GLOB (GLOB_CHAN, GLOBL_PTR) : NOVALUE = 	!PRINT A GLOBAL LISTING

!++
! FUNCTIONAL DESCRIPTION:
!
!	PRINT A GLOBAL LISTING.  FLAG UNDEFINED SYMBOLS AND PRINT A
!	 CROSS REFERENCE LISTING.  PSECT BASE ADDRESSES MUST BE RESOLVED.
!
! FORMAL PARAMETERS:
!
!	GLOB_CHAN - CHANNEL ON WHICH TO WRITE THE CROSS REFERENCE.
!	 LESS THAN ZERO MEANS NO GLOBAL CROSS REFERENCE.
!	GLOBL_PTR - POINTER TO ALPHABETICLY FIRST GLOBAL
!
! IMPLICIT INPUTS:
!
!	THE GLOBAL SYMBOLS
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	MAY PRINT THE GLOBAL CROSSREF AND ERROR MESSAGES
!
!--

    BEGIN

    MAP
	GLOBL_PTR : REF GLOBL_BLOCK;

    LOCAL
	FIRST_TIME,
	GLOB_INFO : VECTOR [4];

!
! THE GLOBAL INFORMATION VECTOR IS LAID OUT AS FOLLOWS:
!
!  0 - CHANNEL ON WHICH TO WRITE THE CROSS REFERENCE, LESS THAN
!	0 MEANS NO GLOBAL CROSS REFERENCE.
!  1 - CURRENT HORIZONTAL POSITION ON THE PRINT LINE.
!  2 - NUMBER OF PSECT NAMES PRINTED SO FAR.
!  3 - CURRENT VERTICAL POSITION ON THE PAGE.
!

    BIND
	HPOS = GLOB_INFO [1],
	VPOS = GLOB_INFO [3];

    FIRST_TIME = 1;
    VPOS = 55;
    HPOS = 0;
    GLOB_INFO [0] = .GLOB_CHAN;

    WHILE (.GLOBL_PTR NEQ 0) DO
	BEGIN

	IF ((.GLOB_CHAN GEQ 0) AND ((.VPOS GEQ 55) OR (.FIRST_TIME NEQ 0)))
	THEN
	    BEGIN
	    FIRST_TIME = 0;

	    IF (.VPOS GEQ 55)
	    THEN
		BEGIN
		PCRLF (.GLOB_CHAN);
		OUTPUT (.GLOB_CHAN, %O'14');	!FORM FEED
		END;

	    VPOS = 1;
	    OUTSTR (.GLOB_CHAN, UPLIT (%ASCIZ'Map of Global Symbols'));
	    PCRLF (.GLOB_CHAN);
	    VPOS = .VPOS + 1;
	    HPOS = 0;
	    PCRLF (.GLOB_CHAN);
	    VPOS = .VPOS + 1;
	    OUTSTR (.GLOB_CHAN, UPLIT (%ASCIZ'Name   Value   PSECT  Module ABS Value'));
	    PCRLF (.GLOB_CHAN);
	    VPOS = .VPOS + 1;
	    END;

	PRC_GLOBL (.GLOBL_PTR, GLOB_INFO);
	GLOBL_PTR = .GLOBL_PTR [GBL_NEXT];
	END;

    END;					!END OF GLOB
ROUTINE PRC_GLOBL (GLOBL_PTR, GLOB_INFO) = 	!PROCESS A GLOBAL SYMBOL

!++
! FUNCTIONAL DESCRIPTION:
!
!	LIST INFORMATION ABOUT A GLOBAL SYMBOL
!
! FORMAL PARAMETERS:
!
!	GLOBL_PTR - POINTER TO A GLOBAL SYMBOL BLOCK
!	GLOB_INFO - POINTER TO INFORMATION VECTOR.
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	MAY PRINT ONE LINE OF GLOBAL CROSSREF, AND AN ERROR MESSAGE
!
!--

    BEGIN

    MAP
	GLOB_INFO : REF VECTOR,
	GLOBL_PTR : REF GLOBL_BLOCK;

    BIND
	HPOS = GLOB_INFO [1],
	VPOS = GLOB_INFO [3];

    LOCAL
	FLAGS,
	GLOB_CHAN,
	MODU_PTR : REF MODU_BLOCK,
	PSECT_PTR : REF PSECT_BLOCK;

    FLAGS = .GLOBL_PTR [GBL_FLAGS];

    IF (.FLAGS<GBL_FLG_DEF, 1> EQL 0) THEN ERRMSG (0, 16, GLOBL_PTR [GBL_NAME], 0, 0, 0, 0);

    GLOB_CHAN = .GLOB_INFO [0];

    IF (.GLOB_CHAN GEQ 0)
    THEN
	BEGIN

	IF (.HPOS GTR 0)
	THEN
	    BEGIN
	    PCRLF (.GLOB_CHAN);
	    VPOS = .VPOS + 1;
	    HPOS = 0;
	    END;

	OUTSTR (.GLOB_CHAN, GLOBL_PTR [GBL_NAME]);
	OUTPUT (.GLOB_CHAN, %C' ');
	HPOS = .HPOS + 8;

	IF (.FLAGS<GBL_FLG_DEF, 1> EQL 0)
	THEN
	    BEGIN
	    OUTSTR (.GLOB_CHAN, UPLIT (%ASCIZ'**Undefined** '));
	    HPOS = .HPOS + 14;
	    OUTSTR (.GLOB_CHAN, UPLIT (%ASCIZ'              '));
	    HPOS = .HPOS + 14;
	    END
	ELSE
	    BEGIN
	    OUTNUM (.GLOB_CHAN, .GLOBL_PTR [GBL_VALUE], 8, 6);
	    OUTPUT (.GLOB_CHAN, %C' ');
	    HPOS = .HPOS + 7;
	    PSECT_PTR = .GLOBL_PTR [GBL_DEF_PSECT];

	    IF (.FLAGS<GBL_FLG_REL, 1> NEQ 0)
	    THEN
		BEGIN
		OUTSTR (.GLOB_CHAN, UNBLANK (PSECT_PTR [PSECT_NAME]));
		END
	    ELSE
		OUTSTR (.GLOB_CHAN, UPLIT (%ASCIZ'      '));

	    OUTPUT (.GLOB_CHAN, %C' ');
	    HPOS = .HPOS + 7;
	    MODU_PTR = .GLOBL_PTR [GBL_DEF_MODU];
	    OUTSTR (.GLOB_CHAN, MODU_PTR [MODU_NAME]);
	    OUTPUT (.GLOB_CHAN, %C' ');
	    HPOS = .HPOS + 7;
	    OUTNUM (.GLOB_CHAN, GBL_VAL (.GLOBL_PTR), 8, 6);
	    OUTPUT (.GLOB_CHAN, %C' ');
	    HPOS = .HPOS + 7;
	    END;

	GLOB_INFO [2] = 0;
	FND_CHAIN (.GLOBL_PTR [GBL_PSECTS], SEL_PSECT, .GLOB_INFO);
	END;

    END;					!OF PRC_GLOBL
ROUTINE SEL_PSECT (PSECT_PTR, GLOB_INFO) = 	!PROCESS A PSECT REFERENCE TO A GLOBAL

!++
! FUNCTIONAL DESCRIPTION:
!
!	PRINT A PSECT REFERENCE TO A GLOBAL
!
! FORMAL PARAMETERS:
!
!	PSECT_PTR - POINTER TO THE PSECT WHICH REFERENCES THIS GLOBAL
!	GLOB_INFO - THE GLOBAL XREF INFORMATION VECTOR.
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	WRITES ONE PSECT REFERENCE TO THE CURRENT GLOBAL
!
!--

    BEGIN

    MAP
	GLOB_INFO : REF VECTOR,
	PSECT_PTR : REF PSECT_BLOCK;

    BIND
	HPOS = GLOB_INFO [1],
	VPOS = GLOB_INFO [3];

    LOCAL
	GLOB_CHAN;

    GLOB_CHAN = .GLOB_INFO [0];

    IF (.GLOB_INFO [2] NEQ 0)
    THEN
	BEGIN
	OUTPUT (.GLOB_CHAN, %C',');
	HPOS = .HPOS + 1;
	END;

    IF (.HPOS GTR 100)
    THEN
	BEGIN
	PCRLF (.GLOB_CHAN);
	VPOS = .VPOS + 1;
	OUTPUT (.GLOB_CHAN, %O'11');
	OUTPUT (.GLOB_CHAN, %O'11');
	HPOS = 17;
	END;

    OUTSTR (.GLOB_CHAN, UNBLANK (PSECT_PTR [PSECT_NAME]));
    GLOB_INFO [2] = .GLOB_INFO [2] + 1;
    HPOS = .HPOS + 6;
    END;					!OF SEL_PSECT
ROUTINE UNBLANK (POINTER) = 			!RETURN "BLANK" FOR BLANKS

!++
! FUNCTIONAL DESCRIPTION:
!
!	IF THE POINTER POINTS TO SIX BLANKS, RETURN A POINTER TO
!	 SIX CHARACTERS OF "BLANK", OTHERWISE RETURN THE POINTER.
!
! FORMAL PARAMETERS:
!
!	POINTER - POINTER TO THE STRING TO TEST
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	POINTER TO A SUITABLE STRING
!
! SIDE EFFECTS
!
!	NONE
!
!--

    BEGIN

    IF (CH$EQL (6, CH$PTR (.POINTER), 6, CH$PTR (UPLIT (%ASCIZ'      '))))
    THEN
	UPLIT (%ASCIZ' blank')
    ELSE
	.POINTER

    END;					!OF UNBLANK
GLOBAL ROUTINE GBL_VAL (GLOBL_PTR) = 		!RETURN VALUE OF GLOBAL SYMBOL

!++
! FUNCTIONAL DESCRIPTION:
!
!	IF THE GLOBAL SYMBOL IS ABSOLUTE, JUST RETURN ITS VALUE CELL.
!	 IF IT IS RELOCATABLE, WE MUST ADD TO THIS THE BASE OF THE
!	 PSECT IT WAS DEFINED IN AND THE OFFSET INTO THAT PSECT AT
!	 THE TIME OF THE DEFINITION.
!	 AN UNDEFINED SYMBOL RETURNS ZERO.
!
! FORMAL PARAMETERS:
!
!	GLOBL_PTR - POINTER TO THE GLOBAL WHOSE VALUE IS TO BE RETURNED
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	THE VALUE OF THE GLOBAL SYMBOL
!
! SIDE EFFECTS
!
!	NONE
!
!--

    BEGIN

    MAP
	GLOBL_PTR : REF GLOBL_BLOCK;

    LOCAL
	FLAGS,
	PSECT_PTR : REF PSECT_BLOCK;

    FLAGS = .GLOBL_PTR [GBL_FLAGS];

    IF (.FLAGS<GBL_FLG_DEF, 1> EQL 0)
    THEN
	0
    ELSE
	BEGIN

	IF (.FLAGS<GBL_FLG_REL, 1> EQL 0)
	THEN
	    .GLOBL_PTR [GBL_VALUE]
	ELSE
	    BEGIN
	    PSECT_PTR = .GLOBL_PTR [GBL_DEF_PSECT];
	    .GLOBL_PTR [GBL_VALUE] + .PSECT_PTR [PSECT_BASE] + .GLOBL_PTR [GBL_DEF_OFFSET]
	    END

	END

    END;					!OF GBL_VAL

END

ELUDOM
! Local Modes:
! Comment Start:!
! Comment Column:36
! Mode:Fundamental
! Auto Save Mode:2
! End: