home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / TASMSWAN.ZIP / BINASC.ASM < prev    next >
Assembly Source File  |  1989-07-14  |  8KB  |  311 lines

  1. %TITLE  "Binary to/from ASCII conversion routines"
  2.  
  3.     IDEAL
  4.     DOSSEG
  5.     MODEL    small
  6.  
  7. ASCnull        EQU    0
  8.  
  9.     DATASEG
  10.  
  11.     CODESEG
  12.  
  13. ;------ From STRINGS.OBJ
  14.  
  15.     EXTRN    StrLength:proc, StrUpper:proc
  16.  
  17.     PUBLIC    HexDigit, ValCh, NumToASCII
  18.     PUBLIC    BinToAscHex, SBinToAscDec, BinToAscDec, BinToAscBin
  19.     PUBLIC    AscToBin
  20.  
  21. %NEWPAGE
  22. ;---------------------------------------------------------------------
  23. ;  HexDigit - converts 4-bit value to ASCII digit
  24. ;---------------------------------------------------------------------
  25. ;     Input:    dl = value limited to range 0...15
  26. ;    Output:    dl = ASCII hex digit equivalent
  27. ;    Registers:  dl
  28. ;---------------------------------------------------------------------
  29. PROC    HexDigit
  30.     cmp    dl,10
  31.     jb    @@10
  32.     add    dl,'A'-10
  33.     ret
  34. @@10:
  35.     or    dl,'0'
  36.     ret
  37. ENDP    HexDigit
  38. %NEWPAGE
  39. ;---------------------------------------------------------------------
  40. ;  ValCh - converts ASCII digit char to binary value
  41. ;---------------------------------------------------------------------
  42. ;     Input:    dl = ASCII digit '0'...'9'; 'A'..'F'
  43. ;        bx = base (2 = binary, 10 = decimal, 16 = hexadecimal)
  44. ;    Output:    cf = 0: dx = equivalent binary value
  45. ;        cf = 1: bad char for this number base (dx is meaningless)
  46. ;    Registers:  dx
  47. ;---------------------------------------------------------------------
  48. PROC    ValCh
  49.     cmp    dl, '9'
  50.     jbe    @@10
  51.     sub    dl,7
  52. @@10:
  53.     sub    dl, '0'
  54.     test    dl,0f0h
  55.     jnz    @@99
  56. @@20:
  57.     xor    dh,dh
  58.     cmp    dx,bx
  59. @@99:
  60.     cmc
  61.     ret
  62. ENDP    ValCh
  63. %NEWPAGE
  64. ;---------------------------------------------------------------------
  65. ;  NumToASCII - converts unsigned binary value to ASCII
  66. ;---------------------------------------------------------------------
  67. ;     Input:    ax = 16-bit value to convert
  68. ;        bx = base for result (2 = binary, 10 = decimal, 16 = hex)
  69. ;        cx = minimum number of digits to output
  70. ;        di = address of string to hold result
  71. ;        NOTE: assumes string is large enough to hold result
  72. ;        NOTE: creates full result if cx is less than the number
  73. ;            of digits required to specify the result or cx = 0
  74. ;        NOTE: if cx = 0 and ax = 0 then length of string will be 0
  75. ;                        set cx = 1 if you want string to = '0' if ax = 0
  76. ;        NOTE: assumes (2 <= bx <= 16)
  77. ;    Output:    none
  78. ;    Registers:  ax,cx
  79. ;---------------------------------------------------------------------
  80. PROC    NumToASCII
  81.     push    dx
  82.     push    di
  83.     push    si
  84.     xor    si,si
  85.     jcxz    @@20
  86. @@10:
  87.     xor    dx,dx
  88.     div    bx
  89.     call    HexDigit
  90.     push    dx
  91.     inc    si
  92.     loop    @@10
  93. @@20:
  94.     inc    cx
  95.     or    ax,ax
  96.     jnz    @@10
  97.     mov    cx,si
  98.     jcxz    @@40
  99.     cld
  100. @@30:
  101.     pop    ax
  102.     stosb
  103.     loop    @@30
  104. @@40:
  105.     mov    [byte di], ASCnull
  106.     pop    si
  107.     pop    di
  108.     pop    dx
  109.     ret
  110. ENDP    NumToASCII
  111. %NEWPAGE
  112. ;---------------------------------------------------------------------
  113. ;  BinToAscHex - converts binary values to ASCII hex strings
  114. ;---------------------------------------------------------------------
  115. ;     Input:    ax = 16-bit value to convert
  116. ;        cx = minimum number of digits to output
  117. ;        di = address of string to hold result
  118. ;        NOTE: assumes string is large enough to hold result
  119. ;        NOTE: outputs full result if cx is less than the number
  120. ;            of digits required to specify the result
  121. ;    Output:    none
  122. ;    Registers:  ax,cx
  123. ;---------------------------------------------------------------------
  124. PROC    BinToAscHex
  125.     push    bx
  126.     mov    bx,16
  127.     call    NumToAscii
  128.     pop    bx
  129.     ret
  130. ENDP    BinToAscHex
  131. %NEWPAGE
  132. ;---------------------------------------------------------------------
  133. ;  BinToAscDec - converts binary values to ASCII decimal strings
  134. ;---------------------------------------------------------------------
  135. ;     Input:    ax = 16-bit value to convert
  136. ;        cx = minimum number of digits to output
  137. ;        di = address of string to hold result
  138. ;        NOTE: assumes string is large enough to hold result
  139. ;        NOTE: outputs full result if cx is less than the number
  140. ;            of digits required to specify the result
  141. ;    Output:    none
  142. ;    Registers:  ax,cx (indirectly)
  143. ;---------------------------------------------------------------------
  144. PROC    BinToAscDec
  145.     push    bx
  146.     mov    bx,10
  147.     call    NumToAscii
  148.     pop    bx
  149.     ret
  150. ENDP    BinToAscDec
  151. %NEWPAGE
  152. ;---------------------------------------------------------------------
  153. ;  SBinToAscDec - converts signed binary values to ASCII decimal strings
  154. ;---------------------------------------------------------------------
  155. ;     Input:    ax = signed 16-bit value to convert
  156. ;        cx = minimum number of digits to output
  157. ;        di = address of string to hold result
  158. ;        NOTE: assumes string is large enough to hold result
  159. ;        NOTE: outputs full result if cx is less than the number
  160. ;            of digits required to specify the result
  161. ;    Output:    none
  162. ;    Registers:  ax,cx
  163. ;---------------------------------------------------------------------
  164. PROC    SBinToAscDec
  165.     push    bx
  166.     push    di
  167.     cmp    ax,0
  168.     jge    @@10
  169.     neg    ax
  170.     mov    [byte di], '-'
  171.     inc    di
  172. @@10:
  173.     mov    bx,10
  174.     call    NumToAscii
  175.     pop    di
  176.     pop    bx
  177.     ret
  178. ENDP    SBinToAscDec
  179. %NEWPAGE
  180. ;---------------------------------------------------------------------
  181. ;  BinToAscBin - converts binary values to ASCII binary strings
  182. ;---------------------------------------------------------------------
  183. ;     Input:    ax = 16-bit value to convert
  184. ;        cx = minimum number of digits to output
  185. ;        di = address of string to hold result
  186. ;        NOTE: assumes string is large enough to hold result
  187. ;        NOTE: outputs full result if cx is less than the number
  188. ;            of digits required to specify the result
  189. ;    Output:    none
  190. ;    Registers:  ax,cx (indirectly)
  191. ;---------------------------------------------------------------------
  192. PROC    BinToAscBin
  193.     push    bx
  194.     mov    bx,2
  195.     call    NumToAscii
  196.     pop    bx
  197.     ret
  198. ENDP    BinToAscBin
  199. %NEWPAGE
  200. ;---------------------------------------------------------------------
  201. ;  ChToBase - returns number base for string
  202. ;---------------------------------------------------------------------
  203. ; NOTE: private subroutine for AscToBin.
  204. ;
  205. ;    Input:    si = pointer to null terminator at end of string
  206. ;        Note: assumes length of string >= 1
  207. ;    Output:    bx = 2(binary), 10 (decimal/default), 16 (hexadecimal)
  208. ;        si = address of last probable digit character in string
  209. ;    Registers:  bx,dl,si
  210. ;---------------------------------------------------------------------
  211. PROC    ChgToBase
  212.     mov    dl,[byte si - 1]
  213.     mov    bx,16
  214.     cmp    dl,'H'
  215.     je    @@10
  216.     mov    bx,2
  217.     cmp    dl,'B'
  218.     je    @@10
  219.     mov    bx,10
  220.     cmp    dl,'D'
  221.     jne    @@20
  222. @@10:
  223.     dec    si
  224. @@20:
  225.     ret
  226. ENDP    ChToBase
  227. %NEWPAGE
  228. ;---------------------------------------------------------------------
  229. ;  AscToNum - converts ASCII characters to binary
  230. ;---------------------------------------------------------------------
  231. ; NOTE: private subroutine for AscToBin.
  232. ;     Input:    ax = initial value (0)
  233. ;        bx = number base ( 2 = binary, 10 = decimal, 16 = hexadecimal)
  234. ;        di = address of unsigned string (any format)
  235. ;        si = address of last probable digit char in string
  236. ;    Output:    cf = 0 : ax = unsigned value
  237. ;        cf = 1 : bad character in string (ax is meaningless)
  238. ;    Registers:  ax, bx,dx,si
  239. ;---------------------------------------------------------------------
  240. PROC    AscToNum
  241.     mov    cx,1
  242. @@10:
  243.     cmp    si,di
  244.     je    @@99
  245.     dec    si
  246.     mov    dl,[byte si]
  247.     call    ValCh
  248.     jc    @@99
  249.     push    cx
  250.     xchg    ax,cx
  251.     mul    dx
  252.     add    cx,ax
  253.     pop    ax
  254.     mul    bx
  255.     xchg    ax,cx
  256.     jmp    @@10
  257. @@99:
  258.     ret
  259. ENDP    AscToNum
  260. %NEWPAGE
  261. ;---------------------------------------------------------------------
  262. ;  AscToBin - converts ASCII strings to binary values
  263. ;---------------------------------------------------------------------
  264. ; NOTE: private subroutine for AscToBin.
  265. ;     Input:  di = ASCIIZ string to convert to binary
  266. ;        'H' at end of string = hexadecimal
  267. ;               'B' at end of string = binary
  268. ;        'D' or digit at end of string = decimal
  269. ;        '-' at s[0] indicates negative number
  270. ;             NOTE: no blanks allowed in string
  271. ;    Output:    cf = 0 : ax = value of string
  272. ;        cf = 1 : bad character in string (ax is undefined)
  273. ;          NOTE: chars in string converted to uppercase
  274. ;             NOTE: null strings set ax = 0
  275. ;    Registers:  ax
  276. ;---------------------------------------------------------------------
  277. PROC    AscToBin
  278.     push    bx
  279.     push    cx
  280.     push    dx
  281.     push    si
  282.     call    StrUpper
  283.     call    StrLength
  284.     xor    ax,ax
  285.     jcxz    @@99
  286.     mov    si,di
  287.     add    si,cx
  288.     cmp    [byte di], '-'
  289.     pushf
  290.     jne    @@10
  291.     inc    di
  292. @@10:
  293.     call    ChToBase
  294.     call    AscToNum
  295.     rcl    bx,1
  296.     popf
  297.     jne    @@20
  298.     neg    ax
  299.     dec    di
  300. @@20:
  301.     rcr    bx,1
  302. @@99:
  303.     pop    si
  304.     pop    dx
  305.     pop    cx
  306.     pop    bx
  307.     ret
  308. ENDP    AscToBin
  309.  
  310.     END
  311.