home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / TASMSWAN.ZIP / BCD.ASM < prev    next >
Assembly Source File  |  1989-07-17  |  5KB  |  211 lines

  1. %TITLE  "Binary-Coded-Decimal (BCD) routines"
  2.  
  3.     IDEAL
  4.     DOSSEG
  5.     MODEL    small
  6.  
  7. ;------ Equates
  8. ASCIINull    EQU     0
  9. PackedSize    EQU    10
  10. UnpackedSize    EQU    20
  11.  
  12.  
  13.     UDATASEG
  14.  
  15. TempUPBCD    dt    ?, ?
  16.  
  17.     CODESEG
  18.  
  19.     PUBLIC    BCDAdd, BCDSubtract, PackedToUnpacked
  20.     PUBLIC    UnpackedToPacked, BCDToASCII, BCDCopy
  21.  
  22. %NEWPAGE
  23. ;------------------------------------------------------------------------
  24. ; BCDAdd - adds two packed BCD numbers
  25. ;------------------------------------------------------------------------
  26. ;    Input:   si = address of source BCD value (10 bytes)
  27. ;                di = address of destination BCD value (10 bytes)
  28. ;    Output:  destinationBCD <- destinationBCD + sourceBCD
  29. ;         cf = 0 : NO error
  30. ;         cf = 1 : OVERFLOW error occurred
  31. ;       Registers:  none
  32. ;------------------------------------------------------------------------
  33. PROC    BCDAdd
  34.     push    ax
  35.     push    cx
  36.     push    di
  37.     push    si
  38.     cld
  39.     clc
  40.     mov    cx, PackedSize
  41. @@10:
  42.     lodsb
  43.     adc    al,[byte di]
  44.     daa
  45.     stosb
  46.     loop    @@10
  47.     pop    si
  48.     pop    di
  49.     pop    cx
  50.     pop    ax
  51.     ret
  52. ENDP    BCDAdd
  53.  
  54. %NEWPAGE
  55. ;------------------------------------------------------------------------
  56. ; BCDSubtract - subtracts two packed BCD numbers
  57. ;------------------------------------------------------------------------
  58. ;    Input:   si = address of source BCD value (10 bytes)
  59. ;                di = address of destination BCD value (10 bytes)
  60. ;    Output:  destinationBCD <- destinationBCD - sourceBCD
  61. ;         cf = 0 : NO error
  62. ;         cf = 1 : UNDERFLOW error occurred
  63. ;       Registers:  none
  64. ;------------------------------------------------------------------------
  65. PROC    BCDSubtract
  66.     push    ax
  67.     push    cx
  68.     push    di
  69.     push    si
  70.     cld
  71.     clc
  72.     mov    cx, PackedSize
  73. @@10:
  74.     lodsb
  75.     sbb    [byte di],al
  76.     mov    al,[byte di]
  77.     das
  78.     stosb
  79.     loop    @@10
  80.     pop    si
  81.     pop    di
  82.     pop    cx
  83.     pop    ax
  84.     ret
  85. ENDP    BCDSubtract
  86.  
  87. %NEWPAGE
  88. ;------------------------------------------------------------------------
  89. ; PackedToUnpacked - convert packed BCD to Unpacked BCD
  90. ;------------------------------------------------------------------------
  91. ;    Input:   si = address of source packed BCD value (10 bytes)
  92. ;                di = address of destination unpacked BCD value (20 bytes)
  93. ;    Output:  destinationBCD <- unpacked(sourceBCD)
  94. ;       Registers:  none
  95. ;------------------------------------------------------------------------
  96. PROC    PackedToUnpacked
  97.     push    ax
  98.     push    cx
  99.     push    di
  100.     push    si
  101.     cld
  102.     mov    cx,PackedSize
  103. @@10:
  104.     lodsb
  105.     mov    ah,al
  106.     shr    ah,1
  107.     shr    ah,1
  108.     shr    ah,1
  109.     shr    ah,1
  110.     and    al,0Fh
  111.     stosw
  112.     loop    @@10
  113.     pop    si
  114.     pop    di
  115.     pop    cx
  116.     pop    ax
  117.     ret
  118. ENDP    PackedToUnpacked
  119.  
  120. %NEWPAGE
  121. ;------------------------------------------------------------------------
  122. ; UnpackedToPacked - convert Unpacked BCD to packed BCD
  123. ;------------------------------------------------------------------------
  124. ;    Input:   si = address of source unpacked BCD value (20 bytes)
  125. ;                di = address of destination packed BCD value (10 bytes)
  126. ;    Output:  destinationBCD <- packed(sourceBCD)
  127. ;       Registers:  none
  128. ;------------------------------------------------------------------------
  129. PROC    UnpackedToPacked
  130.     push    ax
  131.     push    cx
  132.     push    di
  133.     push    si
  134.     cld
  135.     mov    cx,PackedSize
  136. @@10:
  137.     lodsw
  138.     shr    ah,1
  139.     shr    ah,1
  140.     shr    ah,1
  141.     shr    ah,1
  142.     or    al,ah
  143.     stosb
  144.     loop    @@10
  145.     pop    si
  146.     pop    di
  147.     pop    cx
  148.     pop    ax
  149.     ret
  150. ENDP    UnpackedToPacked
  151.  
  152. %NEWPAGE
  153. ;------------------------------------------------------------------------
  154. ; BCDToASCII - convert packed BCD value to ASCII
  155. ;------------------------------------------------------------------------
  156. ;    Input:   si = address of source packed BCD value (10 bytes)
  157. ;                di = address of destination ASCIIZ string (21 bytes)
  158. ;    Output:  ASCIIZ <- ASCII(sourceBCD) + null character
  159. ;       Registers:  none
  160. ;------------------------------------------------------------------------
  161. PROC    BCDToASCII
  162.     push    ax
  163.     push    cx
  164.     push    di
  165.     push    si
  166.     push    di
  167.     mov    di, offset TempUPBCD
  168.     call    PackedToUnpacked
  169.     pop    di
  170.     mov    si,offset TempUPBCD + UnpackedSize - 2
  171.     mov    cx,PackedSize
  172. @@10:
  173.     std
  174.     lodsw
  175.     or    ax,03030h
  176.     xchg    ah,al
  177.     cld
  178.     stosw
  179.     loop    @@10
  180.     mov    [byte,di],ASCIINull
  181.     pop    si
  182.     pop    di
  183.     pop    cx
  184.     pop    ax
  185.     ret
  186. ENDP    BCDToASCII
  187.  
  188. %NEWPAGE
  189. ;------------------------------------------------------------------------
  190. ; BCDCopy - copy a packed BCD value
  191. ;------------------------------------------------------------------------
  192. ;    Input:   si = address of source BCD value (10 bytes)
  193. ;                di = address of destination BCD value (10 bytes)
  194. ;    Output:  destinationBCD <- sourceBCD
  195. ;       Registers:  none
  196. ;------------------------------------------------------------------------
  197. PROC    BCDCopy
  198.     push    cx
  199.     push    di
  200.     push    si
  201.     cld
  202.     mov    cx,PackedSize/2
  203.     rep    movsw
  204.     pop    si
  205.     pop    di
  206.     pop    cx
  207.     ret
  208. ENDP    BCDCopy
  209.  
  210.     END
  211.