;
; 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