; Doug's Programming Language  -- DPL, Version 2.22
; Copyright (c) 1988 Douglas S. Cody, All rights reserved.
;--------------------------------
; D E C O D E - CONVERT A SIGNED DECIMAL REPRESENATION
;		STRING TO SIGNED INTEGER
;
; Entry conditions:
;	SI points to the source string
; Exit conditions:
;	AX holds the value
;	SI points to the last character
;	STATUS = 1, Bad character encountered
;	STATUS = 0, End of string encountered
;
SUBPGM	_DEC
BEGIN	_DEC
	MOV	[STATUS],00	; CLEAR THE RETURN STATUS
	SUB	CX,CX
	SUB	AX,AX
	CMP	BYTE PTR [SI],'-' ; CHECK FOR SIGN, NEGATIVE?
	JNE	@DE_05		; NO
	INC	SI		; YES, MOVE PAST THE CHAR
	MOV	AL,0FFH		; SETUP A NEGATIVE FLAG
;
@DE_05:
	PUSH	AX
	SUB	AX,AX
	MOV	DX,3009H	; DH='0',DL=09
;
@DE_10:
	MOV	CL,[SI]		; GET THE CHARACTER
	OR	CL,CL		; END OF STRING?
	JZ	@DE_15		; YES, CONTINUE ON...
	SUB	CL,DH		; LT 0?
	JL	@DE_12		; YES, EXIT
	CMP	CL,DL		; GT 9?
	JG	@DE_12		; YES, EXIT
	SHL	AX,1		; * 2
	MOV	BX,AX
	SHL	AX,1		; * 4
	SHL	AX,1		; * 8
	ADD	AX,BX		; * 10
	ADD	AX,CX		; + NEW DECIMAL LOCATION
	INC	SI
	JMP	SHORT @DE_10	; CONTINUE TILL DONE...
;
@DE_12:
	POP	BX		; FLUSH THE STACK
	CMP	CL,0FDH		; WAS IT A NEGATIVE SIGN?
	JZ	@DE_16		; YES, EXIT GOOD
	XOR	AX,AX		; RETURN BAD
	MOV	[STATUS],01
	RET
;
@DE_15:
	POP	BX		; GET THE NEGATIVE FLAG
	OR	BX,BX
	JZ	@DE_17
;
@DE_16:
	NEG	AX
;
@DE_17:
	RETURN
;
ENDPGM	_DEC
;
