;DEC_ADJ.ASM           9-28-83
;
;INPUT AX = 16 BIT SIGNED NUMBER
;      CX = NUMBER OF CHARACTER TO RIGHT OF DECIMAL POINT
;THIS PROGRAM MULTIPLIES AX BY 10 AND ADJUSTS CX TO MAKE THE
;NUMBER IN AX A MAXIMUN VALUE AND CX A EVEN NUMBER

;----------------------------------------------------
;DATA SEGMENT PARA 'DATA'
;SAVE_NUM   DW  ?
;DATA    ENDS
;----------------------------------------------------
CODE SEGMENT PARA PUBLIC 'CODE'

DEC_ADJ PROC FAR
       ASSUME CS:CODE
 ;     ASSUME DS:DATA
       PUBLIC DEC_ADJ


       CMP AX,0         ;IF NUMBER IS ZERO JUMP TO END AND EXIT
       JZ DEC_ADJ_EXIT

       MOV  BX,10       ;GOING TO MULTIPLY AX BY 10 AND INCREMENT
                        ;  CX BY 1 UNTIL GET A CARRY (AX GOT TOO
                        ;  LARGE)
MUL_BY_10:
       MOV  SI,AX       ;SAVE CURRENT VALUE OF NUMBER  IN DI
       IMUL  BX
       JC   UN_DO_LAST  ;LAST MULTIPLY WAS ONE TOO MANY GO UNDO
       INC  CX
       JMP  MUL_BY_10

UN_DO_LAST:          ;SAVE_NUM CONTAINS VALUE BEFORE LAST MULTI
  ;    MOV  AX,DX       ;UNDO LAST MULTIPLY
  ;    MOV  SAVE_NUM,AX ;SAVE PRESENT VALUE OF NUMBER
      

;CHECK THAT CX IS EVEN NUMBER
       MOV  AX,CX       ;PUT IN AX FOR DIVIDE
       CBW
       MOV  BL,2        ;GOING TO DO A BYTE DIVIDE
       DIV  BL          ;AL WILL CONTAIN REMAINDER
       CMP  AH,0        ;IF REMAINDER WAS ZERO CX WAS EVEN
       JZ   DEC_ADJ_EXIT   ;WAS EVEN GO EXIT
       MOV  AX,SI          ;WAS NOT EVEN PUT NUMBER BACK IN AX
       MOV  BX,10       ;  AND divide   BY 10 
       CWD
       IDIV BX
       DEC  CX          ;ADJUST CX FOR divide  

       JMP  DEC_ADJ_EXIT1


DEC_ADJ_EXIT:
       MOV  AX,SI

DEC_ADJ_EXIT1:

;ax has number and cx has number of characters after decimal point

       RET               ;RETURN TO CALLER

DEC_ADJ  ENDP
CODE     ENDS
         END
          P