*DECK DLDIS
USETEXT DLFPDEF
USETEXT DEQCOM
USETEXT WRDPAIR
PROC DLDIS (AWORD,RETRNH,RETRNO,RETRND,RETRNA);
BEGIN
#
*1DC DLDIS
*
* 1. PROC NAME AUTHOR DATE
* DLDIS KRULEVITCH 78/10/10
*
* 2. FUNCTIONAL DESCRIPTION
* CONVERTS DATA INTO HEX,OCTAL,DISPLAY CODE CHARACTERS AND ASCII
* CODE CHARACTERS.
*
* 3. METHOD USED
* A CHARACTER WORD ITEM CONTAINS A DISPLAY CODE CONVERSION TABLE
* FOR EACH HEX, OCTAL, AND ASCII CODES.
* FOR DISPLAY CODE ZERO BYTES ARE CONVERTED TO BLANKS.
* FOR ASCII CODE THE CONVERSION TABLE IS ADJUSTED FOR 63 OR 64
* CHARACTER SET.
* THE ASCII CHARACTER IS RETRIEVED FROM AWORD. IF THIS IS THE
* SECOND WORD OF A WORD PAIR THE UPPER HEX DIGIT IS IN COMMON IN
* ACHAR. IF CT = CT12ASC OR CT12ASZ,THEN THE ASCII CHARACTER
* IS RIGHT JUSTIFIED IN 12 BIT BYTES.
* THE ASCII CHARACTER IS STORED IN THE OUTPUT WORD. 7 CHARACTERS
* AND 1 BLANK ARE STORED IN ODD WORDS. 8 CHARACTERS ARE STORED IN
* EVEN WORDS (PAIR=TRUE). LOWER CASE CHARACTERS ARE MAPPED INTO
* UPPER CASE CHARACTERS. FOR CT = CT12ASC/CT12ASZ
* 5 CHARACTERS ARE STORED WITH BLANK FILL.
*
* 4. ENTRY CONDITIONS
* AWORD - CONTAINS MESSAGE TEXT TO BE CONVERTED
* PAIR - FALSE,IF AWORD IS THE FIRST WORD OF ASCII WORD PAIR
* ASKICHAR - CONTAINS THE UPPER HEX DIGIT IF PAIR IS TRUE
* CT - CT8ASCII, 7.5 CHARACTERS PER WORD (ACT=2)
* CT12ASC, 5 ASCII CHARACTERS PER WORD (ACT=3)
* CT12ASZ, 5 ASCII CHARACTERS PER WORD,NULL CHARACTER
* HAS HIGH BIT SET (ACT=5)
*
* 5. EXIT CONDITIONS
* RETRNH - HEX OUTPUT
* RETRNO - OCTAL OUTPUT
* RETRND - DISPLAY CODE CHARACTERS
* RETRNA - ASCII CODE CHARACTERS
*
* 6. COMDECKS CALLED AND SYMPL TEXTS USED.
* DEQCOM DLFPDEF WRDPAIR
*
* 7. PROCEDURES/FUNCTIONS CALLED
* DLDISO CONVERT OCTAL TO DISPLAY
*
* 8. DAYFILE/DIAGNOSTIC MESSAGES
* NONE
*
#
#
INPUT PARAMETERS
#
ITEM AWORD U; # WORD TO BE CONVERTED #
CONTROL PRESET;
#
OUTPUT PARAMETERS
#
ITEM RETRNH C(15); # HEXIDECIMAL CONVERSION #
ITEM RETRNO C(20); # OCTAL CONVERSION #
ITEM RETRND C(10); # DISPLAY CONVERSION #
ITEM RETRNA C(8); # ASCII OUTPUT #
#
EXTERNAL REFERENCES
#
XREF
BEGIN
PROC DLDISO; # CONVERTS OCTAL TO DISPLAY CODE #
END
#
LOCAL VARIABLES
#
DEF HEXL # 4 #; # HEXIDECIMAL DIGIT LENGTH IN BITS #
DEF ASCL # 8 #; # ASCII CHARACTER LENGTH #
DEF ASCL12 # 12 #; # ASCII CHARACTER IN 12 BIT BYTE #
DEF CT12ASZ # 3 #; # CHARACTER TYPE OF ASCII, 5 PER WORD #
DEF LCPOS # 52 #; # LAST POSSIBLE FULL ASCII CHARACTER POS #
ARRAY MSGTEXT [0:0] S(1);
BEGIN
ITEM DCWORD C(0,0,10); # DISPLAY CODE CHARACTERS #
ITEM TXTWORD I(0,0,WL); # WORD TO BE CONVERTED #
END
BASED ARRAY IPCSET [0:0] S(1);
ITEM CSET B(0,0,1); # 1 IF 64CSET,0 IF 63CSET #
# HEXIDECIMAL TO DISPLAY CONVERSION #
ITEM HEXC C(16) = "0123456789ABCDEF";
# ASCII TO DISPLAY CONVERSION TABLE #
ITEM DC C(64) =
" !""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_"
;
ITEM ASC12BYT B=FALSE; # TRUE IF ACT=CT12ASC/CT12ASZ #
ITEM ASKIPOS; # ASCII CHARACTER BIT POSITION #
ITEM DCPOS; # DISPLAY CHARACTER POSITION #
ITEM HEX; # 4 BIT HEXIDECIMAL DIGIT #
ITEM I; # DO LOOP INDUCTION VARIABLE #
ITEM J; # DO LOOP INDUCTION VARIABLE #
#**********************************************************************#
#
DLDIS EXECUTION BEGINS HERE
#
#
HEXIDECIMAL TO DISPLAY CONVERSION
#
FOR I = 0 STEP 1 UNTIL 14 DO
BEGIN
HEX = B<I*HEXL,HEXL> AWORD;
C<I,1> RETRNH = C<HEX> HEXC;
END
#
OCTAL TO DISPLAY CODE CONVERSION
#
DLDISO(AWORD,20,RETRNO);
#
DISPLAY CODE CONVERSION OF ZERO BYTES FOR 64 CHARACTER SET
#
TXTWORD[0] = AWORD;
RETRND = DCWORD[0]; # ASSUME TEXT WORD DISPLAY CODE #
FOR I = 0 STEP 1 UNTIL 9 DO
BEGIN
IF C<I,1>RETRND EQ 0
THEN # CONVERT ZERO BYTES TO BLANKS #
C<I,1>RETRND = " ";
END
#
ASCII TO DISPLAY CODE CONVERSION
#
# CHECK INSTALLATION"S CHARACTER SET #
P<IPCSET> = CSMRLOC; # POSITION AT MACHINE CHARACTERISTIC WORD #
IF NOT CSET
THEN # 63 CSET #
C<5>DC = " "; # % SHOULD YIELD A BLANK #
ELSE # 64 CSET #
C<26>DC = " "; # : SHOULD YIELD A BLANK #
# INITIALIZE BEGINNING WORD-BIT POSITIONS #
DCPOS = 0; # DISPLAY CHARACTER WORD POSITION #
ASC12BYT = CT EQ CT12ASC OR CT EQ CT12ASZ;
IF ASC12BYT # 8 BIT CODE IN 12 BIT BYTES #
THEN
ASKIPOS = 4; # FIRST TEXT BIT #
ELSE # 8 BIT ASCII CODE, 7.5 CHAR PER WORD #
ASKIPOS = 0; # FIRST TEXT BIT #
FOR J = 1 STEP 1 UNTIL 8
DO # CONVERT ASCII TO DISPLAY #
BEGIN
#
GET ASCII CHARACTER
#
IF ASKIPOS LQ LCPOS
THEN # ASCII CHAR DOES NOT CROSS WORD BOUND #
BEGIN
IF PAIR AND ASKIPOS EQ 0
THEN
BEGIN
B<4,4>ACHAR[0] = B<0,4>AWORD;
ASKIPOS = 4; # START BIT OF NEXT CHARACTER #
END # LAST HALF OF ASCII CHAR #
ELSE
BEGIN
ACHAR[0] = B<ASKIPOS,ASCL>AWORD;
IF ASKIPOS NQ LCPOS
THEN # NEXT CHARACTER IN CURRENT WORD #
BEGIN
IF ASC12BYT
THEN
ASKIPOS = ASKIPOS + ASCL12;
ELSE
ASKIPOS = ASKIPOS + ASCL;
END
ELSE # NEXT CHAR. AT START OF NEXT WORD #
ASKIPOS = 0;
END
END
ELSE # ASCII CHAR WILL CROSS WORD BOUNDARY #
BEGIN
IF NOT PAIR
THEN
B<0,4>ACHAR[0] = B<ASKIPOS,4>AWORD;
END
ACHARPB[0] = 0; # ZERO PARITY BIT. #
#
CONVERT AND STORE DISPLAY CHARACTER
#
IF ACHAR[0] LQ X"20"
OR (DCPOS EQ 7 AND NOT PAIR)
OR (DCPOS GQ 5 AND ASC12BYT)
THEN # BLANK OR NO CORRESPONDING DISPLAY CHAR #
C<DCPOS>DCWORD[0] = " "; # STORE A BLANK #
ELSE # GET CORRESPONDING DISPLAY CHAR #
BEGIN
IF ACHAR[0] GR X"5F"
THEN # MAP LOWER CASE INTO UPPER CASE #
ACHAR[0] = ACHAR[0] - X"40";
ELSE
ACHAR[0] = ACHAR[0] - X"20";
C<DCPOS>DCWORD[0] = C<ACHAR[0]>DC; # STORE DISPLAY CHAR #
END
IF J NQ 8
THEN # SET CHAR POS FOR NEXT LOOP ITERATION #
IF DCPOS NQ 7
THEN # MORE ROOM LEFT IN CURRENT WORD #
DCPOS = DCPOS + 1;
ELSE # SET POINTERS FOR NEXT WORD #
DCPOS = 0; # FIRST CHARACTER #
END
PAIR = NOT PAIR;
RETRNA = DCWORD[0];
RETURN;
END # DLDIS #
TERM