; Doug's Programming Language  -- DPL, Version 2.22
; Copyright (c) 1988 Douglas S. Cody, All rights reserved.
;--------------------------------
; _ E N C  -  CONVERT SIGNED 16 BIT VALUE TO A STRING
;
; Entry conditions:
;	AX holds the integer
;	DI holds the string
; Exit conditions:
;	The target string holds the decimal representation
;
SUBPGM	_ENC
;
NUM_TABLE	LABEL	WORD
	DW	10000
	DW	1000
	DW	100
	DW	10
;
BEGIN	_ENC
	PUSH	ES		; SAVE ES
	PUSH	DS		; & MAKE IT POINT TO OUR DATA SEG
	POP	ES
	MOV	BX,'- '		; PLACE SPACE IN BL FOR POSITIVE #
	TEST	AX,8000H	; NEGATIVE?
	JZ	@EN_05		; NO, CONTNUE ON...
	XCHG	BL,BH		; MOVE THE NEGATIVE INTO BL
	NEG	AX		; STRAIGHTEN OUT THE NUMBER
;
@EN_05:
	PUSH	BX		; SAVE THE SIGN
	SUB	DH,DH		; CLEAR THE SAVING FLAG
	MOV	CX,04		; 4 LOOPS THROUGH THE TABLE
	MOV	SI,OFFSET NUM_TABLE
	CMP	AX,8000H	; IS IT A -0?
	JNZ	@EN_10		; NO, CONTINUE ON...
	DEC	AX		; MAKE IT 32767
;
@EN_10:
	MOV	BX,[SI]		; GET THE NEXT COMPARISON VALUE
	ADD	SI,2
	SUB	DL,DL		; DX HOLDS THE DIGIT COUNT
;
@EN_15:
	CMP	AX,BX		; AX GT THE 10 BASE #?
	JL	@EN_20		; NO, MOVE ON...
	SUB	AX,BX
	INC	DL		; DL HOLDS THE COUNT
	JMP	SHORT @EN_15
;
@EN_20:
	OR	DH,DH		; SAVE?
	JNZ	@ENC_200	; YES, GO DO IT
	OR	DL,DL		; ALREADY ZERO?
	JZ	@EN_21		; YES, DON'T SAVE LEADING ZEROS
;
@ENC_200:
	ADD	DL,'0'		; DL HOLDS THE NEW CHARACTER
	MOV	[DI],DL		; SAVE THE CHARACTER
	INC	DI
	INC	DH		; SET FLAG INDICATING STORAGE IN PROGRESS
;
@EN_21:
	LOOP	@EN_10		; CONTINUE TILL ALL IS ENCODED
;
; SAVE THE FINAL DIGIT
;
	ADD	AL,'0'
	STOSB			; SAVE THE LAST CHARACTER
	POP	AX		; GET THE SIGN
	STOSB			; SAVE IN THE STRING
	SUB	AX,AX
	STOSB			; SET THE TERMINATOR
	POP	ES
	RET

ENDPGM	_ENC
;
