#
! $Source$
! $State$
! $Revision$

! Declare segments (the order is important).

.sect .text
.sect .rom
.sect .data
.sect .bss

! This file contains the code necessary to extend the ACK heap. This is called
! by a i86/libem helper function called .strhp, which takes care of updating
! some magic global variables --- defined here.

! Pointer to the current top of the heap.

.sect .data
.define .reghp
.reghp:
	.data2 endbss
	
! Pointer to the current top of memory.

.sect .data
.define .limhp
.limhp:
	.data2 endbss
	
! Claims more memory from the system, but does not actually change those
! global variables (.strhp does that). This does not use the C calling
! convention!
!
! Stack: ( desired_limhp : actual_limhp )
! Also returns: ax = -1 on failure

.sect .text
.define BRK
BRK:
	pop bx ! holds return address
	pop ax ! holds desired limhp

	cmp ax, sp               ! compare sp with si
	jae fail                 ! si too big? (Overlaps stack?)
	cmp ax, endbss           ! compare with bottom of heap
	jb fail                  ! si too small? (Overlaps bss?)
	
return:
	push ax                  ! success
	jmp bx
	
fail:
	mov ax, -1
	jmp return
