home *** CD-ROM | disk | FTP | other *** search
/ Dream 48 / Amiga_Dream_48.iso / Atari / c / sozobon-v2 / dlibsrc.lha / BRK.S < prev    next >
Text File  |  1987-11-27  |  1KB  |  65 lines

  1. ****
  2. *
  3. *    Heap management functions
  4. *
  5.  
  6. *
  7. * entry points
  8. *
  9. .globl    _brk
  10. .globl    _sbrk
  11.  
  12. *
  13. * external references
  14. *
  15. .globl    _end
  16. .globl    __break
  17.  
  18. .text
  19. *
  20. * int brk(addr)
  21. *   char *addr;
  22. *
  23. * Set _break (the point where heap and stack meet) to <addr>.
  24. * Return 0 for success, -1 for failure.
  25. *
  26. _brk:
  27.     move.l    4(sp),a0        * get new break
  28.     move.l    a0,d0
  29.     cmp.l    _end,d0            * if (new break < end of BSS)
  30.     blt    brkerr            *   error
  31.     add.l    #$100,d0
  32.     cmp.l    d0,sp            * if ((new break + 256) > sp)
  33.     bgt    setbrk
  34. brkerr:                    *   error, bad break location
  35.     move.l    #-1,d0
  36.     rts                * return error -1
  37. setbrk:
  38.     move.l    a0,__break        * set new break
  39.     clr.l    d0
  40.     rts                * return status ok
  41.  
  42. *
  43. * char *sbrk(amount)
  44. *   int amount;
  45. *
  46. * Move _break by <amount> bytes.
  47. * Return a pointer to the old _break for success, NULL for failure.
  48. *
  49. _sbrk:
  50.     move.w    4(sp),d0        * get amount
  51.     ext.l    d0
  52.     move.l    __break,a1        * save old _break
  53.     add.l    a1,d0            * calculate new break
  54.     move.l    d0,-(sp)
  55.     jsr    _brk            * call brk() to set new break
  56.     addq.l    #4,sp
  57.     tst.w    d0            * if brk() returned an error
  58.     beq    sbrk
  59.     clr.l    a1            *   set old _break to NULL
  60. sbrk:
  61.     move.l    a1,d0
  62.     rts                * return old _break
  63.  
  64. .end
  65.