home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / assemutl.zip / PUT_DEC.ASM < prev    next >
Assembly Source File  |  1983-10-15  |  4KB  |  129 lines

  1. ;PUT_DEC.ASM       10-10-83 
  2. ;
  3. ;ROUTINE TO PUT A DECIMAL POINT 'X' CHARACTERS FROM RIGHT END
  4. ;OF A ASCII STRING
  5. ;
  6. ;CALLED WITH                                                   
  7. ;            BX = OFFSET OF ASCII STRING
  8. ;            CX = NUMBER OF CHARACTERS IN STRING           
  9. ;            DX = NUMBER OF CHARACTERS TO RIGHT OF DECIMAL
  10. ;RETURN WITH DECIMAL IN STRING AND NUMBER AT RIGHT SIDE OF STRING
  11. ;--------------------------------------------
  12. DATA SEGMENT PARA 'DATA'
  13. TEMP_STRING  DB  10 DUP (?)    ;PLACE TO PUT ASCII STRING 
  14.                                ;WHILL WORKING WITH IT
  15. TEMP_NUM     DW  ?
  16. PUT_DEC_SIGN DB  ?             ;PLACE TO PUT SIGN
  17. DATA ENDS
  18. ;--------------------------------------------
  19. CODE SEGMENT PARA 'CODE'
  20.       PUBLIC PUT_DEC 
  21.       ASSUME CS:CODE,DS:DATA,ES:DATA
  22. PUT_DEC PROC FAR
  23.  
  24. ;MOVE ASCII STRING TO TEMPORARY LOCATION AND PUT
  25. ;DECIMAL INTO PROPER LOCATION AS STRING IS MOVED
  26. ;BACK
  27.  
  28.  
  29.        PUSH DX        ;NUMBERS OF CHARACTERS TO RIGHT OF DEC
  30.        PUSH BX        ;OFFSET OF START OF STRING
  31.        PUSH CX        ;NUMBER OF CHARACTERS IN STRING
  32.  
  33.        CMP  DX,0         ;IF NO CHARACTERS TO RIGHT OF DECIMAL THEN
  34.        JZ  PUT_DEC_EXIT1 ;   DON'T NEED A DECIMAL POINT
  35.  
  36. ;CLEAR TEMP STRING AREA
  37.        LEA  AX,TEMP_STRING
  38.        MOV  SI,AX
  39.        MOV  CX,10            ;SIZE OF TEMP_STRING
  40. LOOP_CLEAR:
  41.        MOV  BYTE PTR [SI],' '  ;GOING TO PUT BLANKS IN STRING
  42.        INC  SI                 
  43.        LOOP LOOP_CLEAR
  44.  
  45.        POP  CX       ;NUMBER OF CHARACTERS IN ORIGINAL STRING
  46.        POP  BX       ;POINTS TO START OF ORIGINAL STRING
  47.        PUSH CX       ;SAVE FOR LATER USE
  48.  
  49.        XOR  DX,DX
  50.        LEA  AX,TEMP_STRING
  51.        MOV  SI,AX     ;PUT ADDRESS OF TEMP STRING IN DESTINATION INDEX
  52.       
  53.        MOV  AL,BYTE PTR [BX]
  54.        CMP  AL,'-'
  55.        JNE  TEST_FOR_PLUS
  56.        MOV  PUT_DEC_SIGN,AL    ;FIRST CHAR WAS A '-'
  57.        INC  BX
  58.        DEC  CX
  59.        JMP  MOVE_CHAR
  60.  
  61. TEST_FOR_PLUS:
  62.        CMP  AL,'+'
  63.        JNE  MOVE_CHAR           ;FIRST CHAR WAS NOT - OR +
  64.        MOV  PUT_DEC_SIGN,AL
  65.        INC  BX
  66.        DEC  CX
  67.  
  68. ;NOTE HAVE NOT MOVED THE SIGN TO THE TEMPARY STRING
  69.  
  70. MOVE_CHAR:
  71.        MOV  AL,BYTE PTR [BX]   ;PUT STRING CHAR IN AX
  72.        MOV  BYTE PTR [SI],AL   ;  AND THEN INTO TEMP STRING
  73.        INC  BX
  74.        INC  SI
  75.        LOOP MOVE_CHAR
  76.  
  77.        POP  CX        ;NUMBER OF CHARACTERS IN STRING
  78.        DEC  BX        ;BX POINTS TO POSITION OF LAST CHARACTER IN STRING
  79.        DEC  SI        ;SI POINTS TO END OF STRING IN TEMP STRING SPACE
  80.        POP  DX
  81.  
  82. MOVE_CHAR_BACK:
  83.        CMP  DX,0      ;PUT DECIMAL IN STRING WHEN DX CHARS HAVE BEEN PUT
  84.        JE PUT_IN_DEC
  85.        MOV  AL,BYTE PTR [SI]   ;PUT CHAR FROM TEMP STRING IN AX
  86.        MOV  BYTE PTR [BX],AL   ;  AND THEN BACK TO ORIGINAL STRING
  87.        DEC  BX
  88.        DEC  SI
  89.        DEC  DX
  90.        LOOP MOVE_CHAR_BACK
  91.  
  92.        CMP  DX,0                ;IF DX IS NEG THEN DEC IN PLACE
  93.        JL   PUT_DEC_EXIT
  94.  
  95. PUT_LEADING_ZEROS:
  96.        CMP  DX,0
  97.        JZ PUT_IN_DEC_1
  98.        MOV  BYTE PTR [BX],'0'   ;ZERO
  99.        DEC  BX
  100.        DEC  DX
  101.        JMP PUT_LEADING_ZEROS
  102.  
  103. PUT_IN_DEC_1:
  104.        MOV  BYTE PTR [BX],'.'    ;DECIMAL
  105.        DEC  BX
  106.        MOV  BYTE PTR [BX],'0'    ;ZERO BEFORE THE DECIMAL
  107.        DEC  BX
  108.        MOV  AL,PUT_DEC_SIGN
  109.        MOV  [BX],AL              ;PUT SIGB ON STRING
  110.        JMP  PUT_DEC_EXIT
  111.  
  112. PUT_IN_DEC:           ;PUT THE DECIMAL POINT IN THE STRING
  113.        MOV  BYTE PTR [BX],'.'  
  114.        DEC  BX
  115.        DEC  DX                ;SO DX NOT ZERO
  116.        JMP MOVE_CHAR_BACK
  117.  
  118. PUT_DEC_EXIT1:
  119.         POP  CX       ;FIX STACK FOR EXIT
  120.         POP  BX
  121.         POP  DX
  122.  
  123. PUT_DEC_EXIT:
  124.        RET            ;RETURN TO CALLER
  125.  
  126. PUT_DEC  ENDP
  127. CODE     ENDS
  128.          END
  129.