1 ; :ts=8 2 ;Copyright (C) 1983 by Manx Software Systems 3 dataseg segment para public 'data' 4 extrn $MEMRY:word 5 extrn _mbot_:word, sbot:word 6 extrn errno_:word 7 dataseg ends 8 codeseg segment para public 'code' 9 assume cs:codeseg,ds:dataseg,es:dataseg,ss:dataseg 10 ; 11 ; sbrk(size): return address of current top & bump by size bytes 12 ; 13 public sbrk_ 14 sbrk_ proc near 15 mov bx,sp 16 push di 17 mov ax,2[bx] 18 mov di,$MEMRY 19 add ax,di 20 push ax 21 call brk_ 22 pop cx 23 jnz brk_error 24 mov ax,di ;return original value of the break 25 brk_error: 26 pop di 27 test ax,ax ;set flags for C 28 ret 29 ; 30 ; brk(addr): set current top address to addr 31 ; returns 0 if ok, -1 if error 32 ; 33 public brk_ 34 brk_: 35 mov bx,sp 36 mov ax,2[bx] 37 cmp ax,sbot ;check for stack/heap overflow 38 jae brk_ov 39 cmp ax,bx ;double check with sp for saftey 40 jae brk_ov 41 ; cmp ax,_mbot_ ; ** DISABLED FOR ROGUE 42 ; jb brk_ov ; ** DISABLED FOR ROGUE 43 mov $MEMRY,ax ;new value is good so save it away 44 sub ax,ax 45 ret 46 ; invalid request 47 brk_ov: 48 mov errno_,-4 49 mov ax,-1 50 test ax,ax 51 ret 52 ; 53 ; rsvstk(size): set saftey margin for stack 54 ; this will make sure that at least size 55 ; bytes of stack below the current level remain. 56 ; 57 rsvstk_: 58 mov bx,sp 59 sub bx,2[bx] 60 mov sbot,bx 61 ret 62 sbrk_ endp 63 codeseg ends 64 end 65 ÿ