*COMDECK PBFMAH 
_$J+  PAGE EJECT? 
_*****************************
*                            *
*         PBFMAH             *
*  CONVERT FROM ASCII HEX    *
*                            *
*****************************?
_$R-,G-,I+    NON RECURSIVE,
              NON INTERRUPTABLE ? 
_***********************************************************************
*                                                                      *
**OVERVIEW- PBFMAH CONVERTS 0-N ASCII HEX CHARACTERS INTO AN 18-BIT    *
*           QUANTITY.  PBFMAH RETURNS A BOOLEAN FALSE                  *
*           AND PERFORMS NO CONVERSION IF THE START OR STOP            *
*           POSITION IN THE BUFFER CONTAINING THE CHARACTERS           *
*           IS WRONG OR AN INVALID CHARACTER IS DETECTED.  THE         *
*           START INDEX IS BUMPED TO THE CHARACTER BEYOND THE          *
*           HEX CHARACTERS DELIMITER (COMMA, BLANK, CONTROL D,         *
*           OR SLASH (/)) IF THE CONVERSION WAS SUCCESSFUL.            *
*                                                                      *
**INPUT- BUFFER CONTAINING CHARACTERS TO CONVERT AND INDEX IN          *
*        BUFFER OF 1ST CHARACTER TO CONVERT.                           *
*                                                                      *
**OUTPUT- CHARACTERS CONVERTED.                                        *
*                                                                      *
**EXTERNAL SUBROUTINES-                                                *
*              1) PBMEMBER         TEST ASCII SET MEMBERSHIP           *
***********************************************************************?
FUNCTION PBFMAH(VAR WORD   : B018BITS;      _18-BIT ADDR/16-BIT WORD   ?
                    BFR    : B0BUFPTR;      _BUFFER CONTAINING CHARS   ?
                VAR START  : INTEGER) : BOOLEAN;
VAR OK : BOOLEAN; 
    I : INTEGER;
    TEMP : B0OVERLAY; 
    UPPER : PACKED RECORD                   _UPPER 7-BIT OVERLAY       ?
            CASE X : INTEGER OF 
              0: (INT : INTEGER); 
              1: (FILL     : B09BITS; 
                  TWOBITS  : B02BITS; 
                  FOURBITS : B04BITS; 
                  ONEBIT   : B01BIT); 
            END;
BEGIN 
  WITH BFR',TEMP,WORD DO
  BEGIN 
    WORD := ZERO; 
    UPPER.INT := 0; 
    OK := (J1FRSTCHAR @ START) &            _VALIDATE START POSITION   ?
          (BFLCD \ START);
    IF NOT OK THEN GOTO 10;                 _INVALID START             ?
    I := START; 
    REPEAT                                  _FIND LAST CHAR IN STRING  ?
      BA1CHAR := BFDATAC[START];
      START := START+1; 
    UNTIL PBMEMBER(TEMP,JSDELIMSET) ! 
          (BFLCD < START);
    IF NOT PBMEMBER(TEMP,JSDELIMSET)        _IN CASE NO DELIMITER      ?
    THEN START := START+1;
    REPEAT                                  _CONVERSION LOOP           ?
      BA1CHAR := BFDATAC[I];
      IF PBMEMBER(TEMP,JSDELIMSET)
      THEN GOTO 10;                         _EXIT ON STRING DELIMITER  ?
      OK := PBMEMBER(TEMP,JSHEXSET);        _VALIDATE HEX CHARACTER    ?
      BAINT := JNCNVTFROM[BA1CHAR]; 
      CASE START-I OF                       _FIND CHARACTER POSITION   ?
      6: UPPER.TWOBITS := BAINT;
      5: UPPER.FOURBITS:= BAINT;            _-PERFORM                  ?
      4: BEGIN                              _-PROPER                   ?
           UPPER.ONEBIT := BAINT/$8;        _-CONVERSION               ?
           B0WORD.BAHEX.B0H2 := BAINT MOD $8; 
         END; 
      3: B0WORD.BAHEX.B0H3 := BAINT;
      2: B0WORD.BAHEX.B0H4 := BAINT;
      END;
      I := I+1; 
    UNTIL NOT OK ! (I = START-1);           _ABNORMAL LOOP END         ?
 10:B0UPPER7.BA7BITS := UPPER.INT;
    B0WORD.BAPAGE :=  B0UPPER7.BA7BITS;     _SET UP 16-BIT ADDRESS     ?
    PBFMAH := OK;                           _RETURN CONVERSION RESULT  ?
  END; _WITH? 
END; _PBFMAH? 
