*DECK NS$CVH
USETEXT CYB$NS
PROC NS$CVH(INW,OUTW,ERR); # CONVERT HEX DC TO BINARY #
# TITLE NS$CVH - CONVERT HEX DISPLAY CODE TO BINARY. #
BEGIN # NS$CVH #
#
** NS$CVH - CONVERT HEX TO BINARY.
*
* J.C. LEE 1981
*
* THIS IS A UTILITY ROUTINE. ITS FUNCTION IS TO CONVERT HEX TO
* BINARY.
*
* PROC NS$CVH(INW, OUTW, ERR)
*
* ENTRY:
* INW - INPUT WORD, LEFT-JUSTIFIED.
*
* EXIT:
* OUTW - OUTPUT WORD, RIGHT-JUSTIFIED.
* ERR - SET IF ERROR IS FLAGED.
*
* METHOD:
* PROCESS A DISPLAY CODED CHARACTER AT A TIME UNTIL THE WHOLD
* WORD IS PROCESSED. IF ERROR IS FOUND, FLAG IT.
*
#
DEF DC$0 #O"33"#; # DISPLAY-CODED 0 #
DEF DC$9 #O"44"#; # DISPLAY-CODED 9 #
DEF DC$A #O"01"#; # DISPLAY-CODED A #
DEF DC$F #O"06"#; # DISPLAY-CODED F #
#
LOCAL VARIABLES
#
ITEM INW U; # INPUT WORD, LEFT-JUSTIFIED #
ITEM OUTW I; # OUTPUT RIGHT-JUSTIFIED #
ITEM ERR B; # ERROR INDICATOR #
ITEM COMPLETE B; # CONVERSION DONE INDICATOR #
ITEM DIGIT I; # DISPLAY-CODED CHARACTER #
ITEM I I; # TEMPORARY VARIABLE #
CONTROL EJECT;
OUTW = 0;
ERR = FALSE;
COMPLETE = FALSE; # CONVERSION NOT DONE YET #
FOR I=0 STEP 1 WHILE I LS WC
AND NOT COMPLETE
DO
BEGIN # PROCESS A DISPLAY-CODED CHAR #
DIGIT = C<I,1>INW;
IF DIGIT GQ DC$A
AND DIGIT LQ DC$F
THEN # DIGIT IS BETWEEN A AND F #
DIGIT = DIGIT + 9; # CONVERT TO BINARY #
ELSE
BEGIN
IF DIGIT GQ DC$0
AND DIGIT LQ DC$9
THEN # DIGIT IS BETWEEN 0 AND 9 #
DIGIT = DIGIT - O"33"; # CONVERT TO BINARY #
ELSE # DIGIT IS NOT A VALID HEX CHAR #
BEGIN
COMPLETE = TRUE;
IF DIGIT NQ 0
THEN # ERROR IF NOT END OF FIELD #
ERR = TRUE;
END
END
IF NOT COMPLETE
THEN
OUTW = OUTW*16 + DIGIT; # BINARY VALUE #
END
RETURN;
END
TERM