' (c) MAXON Computer GmbH
FUNCTION speicher_res(bytes%)
  LOCAL real%,back%,adr%,such_adr%,flag!
  LOCAL bitz%,startbit%,sbyte%,bitm%,bitnr&
  real%=bytes%
  ADD bytes%,4
  IF ROL(SHR(bytes%,4),4)<bytes%
    bytes%=ROL(SHR(bytes%,4),4)+16
  ENDIF
  IF {{malloc_adr%+24}}<bytes%
    back%=FALSE
    RETURN back%
  ENDIF
  {malloc_adr%+8}={malloc_adr%+8}-bytes%
  adr%=malloc_adr%
  REPEAT
    adr%={adr%+4}
  UNTIL {adr%}=>bytes%
  IF {adr%}=bytes% AND {adr%+12}=FALSE
    {{adr%+8}+4}={adr%+4}
    {{adr%+4}+8}={adr%+8}
    back%=adr%
  ELSE IF {adr%}=bytes% AND {adr%+12}<>FALSE
    back%={adr%+12}
    {adr%+12}={back%+12}
  ELSE IF {adr%}>bytes% AND {adr%+12}=FALSE
    {{adr%+8}+4}={adr%+4}
    {{adr%+4}+8}={adr%+8}
    flag!=TRUE
  ELSE IF {adr%}>bytes% AND {adr%+12}<>FALSE
    {{adr%+8}+4}={adr%+12}
    {{adr%+4}+8}={adr%+12}
    BMOVE adr%+4,{adr%+12}+4,8
    flag!=TRUE
  ENDIF
  IF flag!
    {adr%}={adr%}-bytes%
    back%=adr%+{adr%}
    IF {adr%}>16
      {back%-4}=adr%
    ENDIF
    such_adr%=malloc_adr%
    flag!=FALSE
    REPEAT
      such_adr%={such_adr%+4}
      IF {such_adr%}={adr%}
        {adr%+12}={such_adr%+12}
        {such_adr%+12}=adr%
        flag!=TRUE
      ELSE IF {such_adr%}>{adr%}
        {adr%+8}={such_adr%+8}
        {adr%+4}=such_adr%
        {adr%+12}=FALSE
        {such_adr%+8}=adr%
        {{adr%+8}+4}=adr%
        flag!=TRUE
      ENDIF
    UNTIL flag!
  ENDIF
  bitz%=SHR(bytes%,4)
  startbit%=SHR(back%-malloc_adr%,4)+1
  sbyte%=SHR(startbit%,3)
  IF ROL(SHR(startbit%,3),3)<startbit%
    INC sbyte%
  ENDIF
  bitnr&=ROL(sbyte%,3)-startbit%
  bitm%={malloc_adr%+12}
  DEC sbyte%
  REPEAT
    IF bitz%>7 AND bitnr&=7
      BYTE{bitm%+sbyte%}=0
      SUB bitz%,8
      INC sbyte%
    ELSE
      BYTE{bitm%+sbyte%}=BCLR(BYTE{bitm%+sbyte%},bitnr&)
      DEC bitz%
      DEC bitnr&
      IF bitnr&=-1
        INC sbyte%
        bitnr&=7
      ENDIF
    ENDIF
  UNTIL bitz%=0
  {back%}=real%
  ADD back%,4
  RETURN back%
ENDFUNC
