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

  1. ;_ sbrk.asm   Sun May  8 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.     begdata
  9.     c_extrn    errno,word
  10.     enddata
  11.  
  12.     begcode    sbrk
  13.  
  14.     c_public sbrk
  15.  
  16. ; Storage allocator
  17.  
  18.     begdata
  19.  
  20.     c_extrn    _psp,word
  21.  
  22.     if SPTR
  23.     c_extrn    _datapar,word
  24.     c_extrn    _pastdata,word, _progpar,word
  25.     else
  26.     c_extrn    _totalpar,word
  27.     endif
  28.     enddata
  29.  
  30. ;;;;;;;;;;;;;;;;;;;;;;;;;;
  31. ; Request memory from operating system.
  32. ; Attempt to grow the data segment.
  33. ; Use:
  34. ;    p = sbrk(nbytes);
  35. ; Returns:
  36. ;    pointer to memory allocated
  37. ;        (first word of allocated memory contains # of bytes allocated)
  38. ;    -1 if error
  39.  
  40. func    sbrk
  41.     push    BP
  42.     mov    BP,SP
  43.     mov    BX,P[BP]        ;get nbytes
  44.     add    BX,15            ;round
  45.     and    BX,0FFF0h        ;BX = # of bytes to allocate
  46.     jz    sbrk3            ;error if sbrk(0)
  47.     mov    DX,BX            ;save
  48.     mov    CL,4
  49.     shr    BX,CL            ;# of paragraphs to allocate
  50.     mov    CX,BX            ;save
  51.     if SPTR
  52.     add    BX,_datapar        ;add in # already in data segment
  53.     jc    sbrk3            ;too much
  54.     .if    BX a 0FFFh, sbrk3    ;if > 64k
  55.     add    BX,_progpar        ;BX = total new size of program
  56.     else
  57.     add    BX,_totalpar        ;BX = total new size of program
  58.     endif
  59.     push    ES
  60.     mov    ES,_psp            ;segment of start of program
  61.     bdos    4Ah            ;set new program size
  62.     pop    ES
  63.  
  64.     if SPTR
  65.     jc    sbrk2            ;failed
  66.     mov    AX,_pastdata        ;pointer to allocated memory
  67.     mov    BX,AX
  68.     mov    [BX],DX            ;store # of bytes allocated
  69.     add    _pastdata,DX        ;and remember for posterity
  70.     add    _datapar,CX        ;new size of data segment
  71.     else
  72.     jnc    sbrkok            ;succeeded
  73.     .if    AX ne 8, sbrk2        ;if something is very wrong
  74.  
  75.     ;Can't grow data segment. Try to allocate an independent block.
  76. ;    sub    BX,_totalpar        ;BX = # of paragraphs req'd
  77.     mov    BX,CX            ;BX = # of paragraphs req'd
  78.     bdos    48h            ;allocate memory
  79.     jc    sbrk2            ;failed
  80.     jmps    sbrk1            ;success. AX = segment of new block
  81. sbrkok:
  82.     mov    AX,_psp
  83.     add    AX,_totalpar        ;AX = segment of new block
  84.     add    _totalpar,CX        ;new total size of program
  85. sbrk1:
  86.     clr    BX            ;BX = offset of new block
  87.     mov    ES,AX
  88.     mov    ES:[BX],DX        ;store size of new block
  89.       if MSC
  90.     mov    DX,AX
  91.     mov    AX,BX
  92.       endif
  93.     endif
  94.     pop    BP
  95.     ret
  96.  
  97. sbrk3:    mov    AX,8            ;fake an ENOMEM
  98. sbrk2:    mov    errno,AX
  99.     mov    AX,-1
  100.     if LPTR
  101.       ifdef MSC
  102.     cwd
  103.       else
  104.     mov    BX,AX
  105.       endif
  106.     endif
  107.     pop    BP
  108.     ret
  109. c_endp    sbrk
  110.  
  111.     endcode    sbrk
  112.     end
  113.