;/***

MenuetHeapInit = @@Menuet@_HeapInit$qpvt1t1

MenuetHeapAlloc = @@Menuet@Alloc$qui

MenuetHeapReAlloc = @@Menuet@ReAlloc$qpvui

MenuetHeapFree = @@Menuet@Free$qpv

MenuetHeapFreeAndThreadFinish = @Menuet@_FreeAndThreadFinish$qpvpi

define @Menuet@_SetUseMemory$qui
  push ebx
  mov  eax,64
  mov  ebx,1
  mov  ecx,[esp+8]
  int  0x40
  pop  ebx
  test eax,eax
  jnz  Menuet_set_use_memory_nomem
  push ecx
  push dword [@Menuet@_MenuetMemBlock]
  call @@MemoryHeap@ResizeBlock$q20MemoryHeap@TMemBlockpv
  add  esp,8
  mov  al,1
  ret
Menuet_set_use_memory_nomem:
  xor  al,al
  ret
enddef

define @Menuet@_RecalculateUseMemory$qui
  mov  eax,dword [esp+4]
  mov  ecx,(U_END + 3) and not 3
  cmp  eax,ecx
  jna  Menuet_recalculate_use_memory_min
  push ebx
  sub  eax,ecx
  mov  ebx,6
  mul  ebx
  dec  ebx
  div  ebx
  add  eax,((U_END + 3) and not 3) + 3
  and  eax,not 3
  pop  ebx
  ret
Menuet_recalculate_use_memory_min:
  mov  eax,ecx
  ret
enddef

define @Menuet@_FreeAndThreadFinish$qpvpi
  mov  ebx,1
  mov  ecx,[esp+8]
  jmp  Menuet_heap_free_tf_wait
Menuet_heap_free_tf_wait_loop:
  mov  eax,5
  int  0x40
  shl  ebx,1
  cmp  ebx,MENUET_MUTEX_MAX_TIME_WAIT
  jna  Menuet_heap_free_tf_wait
  mov  ebx,MENUET_MUTEX_MAX_TIME_WAIT
Menuet_heap_free_tf_wait:
  cmp  dword [ecx],0
  jnz  @Menuet@ExitProcess$qv
  lock bts dword [@Menuet@_MemHeapMutex],0
  jc   Menuet_heap_free_tf_wait_loop
  push dword [esp+4]
  push @Menuet@_MenuetFreeSpace
  call @@MemoryHeap@Free$qr21MemoryHeap@TFreeSpacepv
  add  esp,8
  mov  byte [@Menuet@_MemHeapMutex],0x40
  or   eax,-1
  int  0x40
enddef

macro call func
{
  if func eq @MemoryHeap@_FirstNotZeroBit$qui
    bsf  eax,[esp]
  else if func eq @MemoryHeap@_CopyMemItemArray$quiuiui
    xchg edi,[esp]
    xchg esi,[esp+4]
    mov  ecx,[esp+8]
    cld
    sub  ecx,esi
    shr  ecx,2
    rep movs dword [edi],[esi]
    xchg edi,[esp]
    xchg esi,[esp+4]
  else
    call func
  end if
}

;/**/