home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CASM.ARJ / ATOL.ASM < prev    next >
Assembly Source File  |  1988-01-23  |  2KB  |  107 lines

  1. ;_ atol.asm   Sat Jan 23 1988   Modified by: Walter Bright */
  2. ; Copyright (C) 1985-1988 by Northwest Software
  3. ; All Rights Reserved
  4. ; Written by Walter Bright
  5.  
  6.     include    macros.asm
  7.  
  8.     begcode    atol
  9.  
  10. ;;;;;;;;;;;;;;;;;;;;;;;;;
  11. ; Convert ascii string to long.
  12. ; Use:
  13. ;    l = atol(p);
  14.  
  15.     c_public    atol
  16.  
  17. func    atol
  18.     push    BP
  19.     mov    BP,SP
  20.     .save    <SI,DI>
  21.     if SPTR
  22.     mov    SI,P[BP]    ;get p
  23. A1:    mov    CL,[SI]
  24.     else
  25.     les    SI,P[BP]    ;get p
  26. A1:    mov    CL,ES:[SI]
  27.     endif
  28.     inc    SI
  29.     .if    CL e ' ', A1
  30.     .if    CL b 9, A3
  31.     .if    CL be 0Dh, A1    ;skip white space
  32.  
  33. A3:
  34.     clr    AX
  35.     ifdef MSC
  36.     cwd            ;DX,AX = 0: accumulate result in DX,AX
  37.     else
  38.     mov    BX,AX        ;accumulated result
  39.     endif
  40.     mov    BP,AX        ;assume positive
  41.     mov    CH,AL        ;CH = 0
  42.     .if    CL e '+', A4
  43.     .if    CL ne '-', A5
  44.     inc    BP        ;nope, it's negative
  45.     if SPTR
  46. A4:    mov    CL,[SI]
  47.     else
  48. A4:    mov    CL,ES:[SI]
  49.     endif
  50.     inc    SI
  51. A5:    tst    CL
  52.     jz    A2
  53.     sub    CL,'0'        ;to binary
  54.     jb    A2
  55.     .if    CL a 9, A2    ;not a digit
  56.     ifdef MSC
  57.     ;DX,AX = DX,AX * 10 - CX
  58.     shl    AX,1
  59.     rcl    DX,1
  60.     mov    BX,AX
  61.     mov    DI,DX
  62.     shl    AX,1
  63.     rcl    DX,1
  64.     shl    AX,1
  65.     rcl    DX,1
  66.     add    AX,BX
  67.     adc    DX,DI
  68.     sub    AX,CX
  69.     sbb    DX,0
  70.     else
  71.     ;AX,BX = AX,BX * 10 - CX
  72.     shl    BX,1
  73.     rcl    AX,1
  74.     mov    DI,BX
  75.     mov    DX,AX
  76.     shl    BX,1
  77.     rcl    AX,1
  78.     shl    BX,1
  79.     rcl    AX,1
  80.     add    BX,DI
  81.     adc    AX,DX
  82.     sub    BX,CX
  83.     sbb    AX,0        ;AX,BX -= digit
  84.     endif
  85.     jmp    A4
  86.  
  87. A2:    ;if (BP == 0), negate the result
  88.     tst    BP
  89.     jnz    A6
  90.     ifdef MSC
  91.     neg    DX
  92.     neg    AX
  93.     sbb    DX,BP
  94.     else
  95.     neg    AX
  96.     neg    BX
  97.     sbb    AX,BP
  98.     endif
  99. A6:    .restore <DI,SI>
  100.     pop    BP
  101.     ret
  102. c_endp    atol
  103.  
  104.     endcode    atol
  105.  
  106.     end
  107.