; Doug's Programming Language  -- DPL, Version 2.22
; Copyright (c) 1988 Douglas S. Cody, All rights reserved.
;--------------------------------
; _ H S T O I  -  HEX STRING TO INTEGER CONVERSION
;
; Entry conditions:
;	SI holds the string offset
; Exit conditions:
;	AX holds the 16 bit value
;	SI points to the last no-good hex character
;	STATUS = 0, end of line encountered, 1=bad character encountered
; 
SUBPGM	_HSTOI
;
BEGIN	_HSTOI
	SUB	AX,AX
	SUB	BX,BX
	MOV	[STATUS],00		; DEFAULT TO GOOD RESULT
;
@HSTI_05:
	MOV	BL,[SI]			; FETCH THE CHARACTER
	INC	SI
	OR	BL,BL			; END OF LINE?
	JZ	@HSTI_20		; YES, EXIT
	CMP	BL,'0'			; LESS THAN 0?
	JL	@HSTI_15		; YES, EXIT
	CMP	BL,'9'			; GT 9?
	JG	@HSTI_10		; YES
	SUB	BL,'0'			; REMOVE THE ASCII PORTION
	MOV	CL,4			; ADVANCE THE HEX POSITIONAL VALUE
	SHL	AX,CL
	ADD	AX,BX			; ADD TO ACCUMULATOR
	JMP	SHORT @HSTI_05		; CONTINUE ON...
;
@HSTI_10:
	AND	BL,05FH			; CONVERT TO UPPERCASE
	SUB	BL,'A'			; LESS THAN 'A'?
	JL	@HSTI_15		; YES, EXIT
	CMP	BL,05			; GT 5
	JG	@HSTI_15		; YES, EXIT
	ADD	BL,10			; ADJUST TO CREATE 10-15
	MOV	CL,4			; ADVANCE THE HEX POSITIONAL VALUE
	SHL	AX,CL
	ADD	AX,BX			; ACCUMULATE THE VALUE
	JMP	SHORT @HSTI_05		; CONTINUE ON...
;
@HSTI_15:
	MOV	[STATUS],01		; BAD VALUE - REPORT IT
;
@HSTI_20:
	RET

ENDPGM _HSTOI
;
