;
; SYSLIB Module Name:  SEVAL2
; Author:  Richard Conn
; SYSLIB Version Number:  2.0
; Module Version Number:  1.0
; Module Entry Points:
;       EVAL16
; Module External References:
;       CAPS
;

;
;  EVAL16 --
;       Convert the string of ASCII hexadecimal digits pointed to by HL
; into a binary value; string is converted until invalid digit is
; encountered.
;       On return, HL points to error character, DE=value, A=E (low
; order 8 bits of value).  BC not affected.
;

       EXT     CAPS    ; CAPITALIZATION ROUTINE

EVAL16::
       PUSH    B       ; SAVE BC
       LXI     D,0     ; SET DE=0 INITIALLY

;  Get next digit and check for '0' - '9'
E16L:
       MOV     A,M     ; GET BYTE
       CALL    CAPS    ; CAPITALIZE
       SUI     '0'     ; CHECK FOR RANGE
       JC      DONE
       CPI     10
       JC      PROC
       SUI     7       ; ADJUST FOR 'A'-'F'
       CPI     16
       JNC     DONE

;  Proceed with processing
PROC:
       PUSH    PSW     ; SAVE VALUE

;  Multiply DE by 16
MUL16:
       PUSH    H       ; SAVE HL
       LXI     H,0     ; ACC=0
       MVI     B,16    ; 16 LOOPS
MUL16L:
       DAD     D       ; HL=HL+DE
       DCR     B       ; COUNT DOWN
       JNZ     MUL16L
       MOV     D,H     ; NEW DE
       MOV     E,L
       POP     H       ; RESTORE HL

;  Add in A
       POP     PSW     ; GET LATEST DIGIT
       ADD     E       ; A=A+E
       MOV     E,A
       MOV     A,D     ; ADD TO D IF NECESSARY
       ACI     0

;  Continue
       INX     H       ; PT TO NEXT CHARACTER
       JMP     E16L

;  Done -- Result already in DE; Set A=E
DONE:
       MOV     A,E     ; A=E
       POP     B       ; RESTORE BC

       RET

       END