Google
 

Trailing-Edge - PDP-10 Archives - BB-R595B-SM_11-9-85 - mcb/vnp36/misc.bli
There are 4 other files named misc.bli in the archive. Click here to see a list.
!<REL4A.TKB-VNP>MISC.BLI.6,  3-Dec-79 14:34:50, Edit by SROBINSON
MODULE MISC (					!MISCELLANEOUS
		IDENT = 'X2.0'
		) =
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 AND VNP-20
!
! ABSTRACT:
!
!
! THIS MODULE PROVIDES SEVERAL MISCELLANEOUS SERVICES
!
!
! ENVIRONMENT: TOPS-20 USER MODE
!
! AUTHOR: J. SAUTER, CREATION DATE: 14-DEC-77
!
! MODIFIED BY:
!
!	Scott G. Robinson, 13-JUN-79 : VERSION X0.2
!	- Make a Call to ERROR fatal
!-----------------------------------------------------------------------
!
!	Scott G. Robinson, 3-DEC-79 : Version X2.0
!	- Ensure DECnet-10 Compatibility
!
!	, : VERSION
! 01	-
!--

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

FORWARD ROUTINE
    ERROR : NOVALUE,				!PROGRAMMING ERROR
    R50TOA : NOVALUE,				!RADIX50_11 TO ASCII
    RX50,					!ASCII CHAR TO RADIX50
    ATOR50 : NOVALUE;				!ASCII TO RADIX50_11

!
! INCLUDE FILES:
!
!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!

LITERAL
    DEBUG = 0;

!
! OWN STORAGE:
!

OWN
    ERR_FLAG : INITIAL (0);

!
! EXTERNAL REFERENCES:
!

EXTERNAL ROUTINE
    FND_CHAIN,					!FIND A BLOCK IN A CHAIN
    OUTPUT : NOVALUE,				!WRITE ON A FILE
    OUTSTR : NOVALUE,				!WRITE A STRING ON A FILE
    PCRLF : NOVALUE,				!SEND CRLF TO A FILE
    STOP_PROGRAM : NOVALUE;			!TERMINATE EXECUTION
GLOBAL ROUTINE ERROR (MESSAGE) : NOVALUE = 	!SIGNAL A PROGRAMMING ERROR

!++
! FUNCTIONAL DESCRIPTION:
!
!	PRINT A MESSAGE DUE TO A PROGRAMMING ERROR IN TKB-20
!	TERMINATE THE PROGRAM AFTERWARDS
!
! FORMAL PARAMETERS:
!
!	MESSAGE - POINTER TO THE STRING DESCRIBING THE ERROR
!
! IMPLICIT INPUTS:
!
!	ERR_FLAG
!
! IMPLICIT OUTPUTS:
!
!	ERR_FLAG
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--

    BEGIN

    IF (.ERR_FLAG EQL 0)
    THEN
	BEGIN
	ERR_FLAG = 1;
	PCRLF (0);
	OUTPUT (0, %C'?');
	OUTSTR (0, .MESSAGE);
	END;

    STOP_PROGRAM ();
    END;
GLOBAL ROUTINE R50TOA (R50, ASCVAL) : NOVALUE = 	!CONVERT RADIX50 TO ASCII

!++
! FUNCTIONAL DESCRIPTION:
!
!	CONVERT PDP-11 FORMAT RADIX50 TO ASCII
!
! FORMAL PARAMETERS:
!
!	R50 - 32 BITS OF PDP-11 FORMAT RADIX50
!	ASCVAL - 7-CHARACTER STRING OF RESULTING ASCIZ
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--

    BEGIN

    MAP
	ASCVAL : REF VECTOR [CH$ALLOCATION (7)];

    LOCAL
	ASCPTR,
	CHAR,
	TEMP1,
	TEMP2;

    ASCVAL [0] = 0;
    ASCVAL [1] = 0;
    ASCPTR = CH$PTR (ASCVAL [0], 5);

    INCR WORD_NUMBER FROM 0 TO 1 DO
	BEGIN
	TEMP1 = .R50<(IF (.WORD_NUMBER EQL 0) THEN 0 ELSE 16), 16>;

	INCR CHAR_NUMBER FROM 1 TO 3 DO
	    BEGIN
	    TEMP2 = .TEMP1 MOD %O'50';
	    TEMP1 = .TEMP1/%O'50';
	    CHAR = (CASE .TEMP2 FROM 0 TO (%O'50' - 1) OF
		SET
		[0] : %C' ';
		[1 TO 26] : %C'A' + (.TEMP2 - 1);
		[27] : %C'$';
		[28] : %C'.';
		[29] : %C'&';			!ACTUALLY UNDEFINED
		[30 TO 39] : %C'0' + (.TEMP2 - 30);
		[OUTRANGE] : %C'&';		!SHOULD NEVER HAPPEN
		TES);
	    CH$WCHAR (.CHAR, .ASCPTR);
	    ASCPTR = CH$PLUS (.ASCPTR, -1);
	    END;				!OF INCR CHARACTER

	END;					!OF INCR WORD

    CH$WCHAR (0, CH$PTR (ASCVAL [0], 6));	!APPEND 0 TO MAKE ASCIZ
    END;					!OF R50TOA
GLOBAL ROUTINE RX50 (CHAR) = 			!CONVERT ASCII CHAR TO RADIX50

!++
! FUNCTIONAL DESCRIPTION:
!
!	CONVERT ASCII CHARACTER TO RADIX50_11
!	 NULLS ARE CONVERTED TO SPACES.
!
! FORMAL PARAMETERS:
!
!	CHAR - ASCII CHARACTER
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	THE RADIX50 VALUE OF THE CHARACTER
!
! SIDE EFFECTS
!
!	NONE
!
!--

    BEGIN

    SELECTONE .CHAR OF
	SET

	[%C' ', 0] :
	    0;

	[%C'A' TO %C'Z'] :
	    .CHAR + %O'1' - %C'A';

	[%C'$'] :
	    %O'33';

	[%C'.'] :
	    %O'34';

	[%C'0' TO %C'9'] :
	    .CHAR + %O'36' - %C'0';

	[%C'a' TO %C'z'] :
	    .CHAR + %O'1' - %C'a';

	[OTHERWISE] :
	    %O'35';
	TES

    END;					!OF RX50
GLOBAL ROUTINE ATOR50 (ASCVAL, R50) : NOVALUE = 	!CONVERT ASCII TO RADIX50

!++
! FUNCTIONAL DESCRIPTION:
!
!	CONVERT ASCII TO RADIX50_11
!
! FORMAL PARAMETERS:
!
!	ASCVAL - SIX CHARACTERS OF ASCII
!	R50 - POINTER TO VECTOR OF LENGTH 4 TO RECEIVE BYTES
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS
!
!	NONE
!
!--

    BEGIN

    MAP
	ASCVAL : REF VECTOR [CH$ALLOCATION (7)],
	R50 : REF VECTOR [4];

    LOCAL
	ASCPTR,
	CHAR1,
	CHAR2,
	CHAR3,
	R50_INDEX,
	TEMP;

    ASCPTR = CH$PTR (.ASCVAL, -1);
    R50_INDEX = 0;

    INCR COUNTER FROM 0 TO 1 DO
	BEGIN
	CHAR1 = CH$A_RCHAR (ASCPTR);
	CHAR2 = CH$A_RCHAR (ASCPTR);
	CHAR3 = CH$A_RCHAR (ASCPTR);
	TEMP = (((RX50 (.CHAR1)*%O'50') + RX50 (.CHAR2))*%O'50') + RX50 (.CHAR3);
	R50 [.R50_INDEX] = .TEMP<0, 8>;
	R50_INDEX = .R50_INDEX + 1;
	R50 [.R50_INDEX] = .TEMP<8, 8>;
	R50_INDEX = .R50_INDEX + 1;
	END;

    END;					!OF ATOR50

END

ELUDOM