#TITLE  "24-BIT BINARY TO DECIMAL ROUTINE"
       #PAGE   132,66
       MODULE  "BinDec"
;
       LOC     Data#
;
LEAD0:  BYTE    0
;
       LOC     Code#
;
;       Enter here with DX:AX containing SEGMENT:OFFSET to
;       print as decimal.
;
SEGDEC::
       PUSH    DX
       MOV     CL,=4
       SHL     DX,CL
       ADD     AX,DX
       POP     DX
       MOV     CL,=12
       SHR     DX,CL
;
;
;       Enter with 20-bit number in DX and AX
;       (low nybble of DL = MSN)
;       ie DX=000F, AX=F000 for FF000
;       If leading zero suppression, make CH=0 else CH=NZ
;       DS:BX point to storage for result.
;       Output: DS:BX points to byte past end of output string
;       Destroys AX,DX
;
BINDEC::
       MOV     LEAD0,CH                ; SAVE LEADING 0 FLAG
       MOV     CX,=10000               ; DIVIDE BY 10000
       DIV     CX                      ; REMAINDER NOW IN DX
       CALL    DEC
       MOV     AX,DX
       CWD
       MOV     CX,=100                 ; NOW DIVIDE BY 100
       DIV     CX
       CALL    DEC
       MOV     AX,DX
DEC:    AAM
       CMP     AH,=9
       JNA     __NOV
       PUSH    AX
       MOV     AL,AH
       AAM
       CALL    __NOV
       POP     AX
       OR      AL,=0X30
       JMPS    __CL
;
__NOV:  OR      AX,=0X3030
       CMP     AH,='0'                 ; ZERO?
       JNZ     __NZ
       CMP     LEAD0,=0                ; LEAD 0 SUPPRESS?
       JZ      __CL                    ;   YES, CHECK LOW
__NZ:   MOV     LEAD0,AH
       MOV     [BX],AH
       INC     BX
__CL:   CMP     AL,='0'
       JNZ     __NZ1
       CMP     LEAD0,=0
       JZ      __CL1
__NZ1:  MOV     LEAD0,AL
       MOV     [BX],AL
       INC     BX
__CL1:  RET
       END