10 REM > BLib.MAlloc/src 1.05 15Sep2011
   20 REM Version C: scans for exact match first
   30 REM
   40 REM v1.05 15Sep2011 JGH Extends last slot into free space, adds names to heap on first call
   50 REM v1.04 12Aug2006 JGH Checks for size of free memory
   60 REM v1.03 23Jul2006 JGH m_zalloc() added
   70 REM v1.02 15Sep1989 JGH m_realloc() added
   80 REM v1.01 08Sep1989 JGH Bug in reuse of released memory fixed
   90 REM v1.00 06Sep1989 JGH m_alloc() and m_free() written
  100 :
  110 REM Memory Allocation Routines
  120 REM ~~~~~~~~~~~~~~~~~~~~~~~~~~
  130 REM *BUG* When scanning heap, when link=0, !0 is read from
  140 :
  150 :
  160 DEFFNm_alloc(size%):LOCALA%,B%,E%:m_heap%=m_heap% :REM Create m_heap%
  170 IFm_heap%=0:PROCm_free(0)                         :REM If first call, add names to heap
  180 DIME%-1:IFsize%<1:=(HIMEM-E%-1280)AND(size%=0)    :REM Return free space
  190 size%=(size%+3)AND-4:
  200 
  210 A%=m_heap%
  220 REM IFA%:IFA%!4:REPEATB%=A%:A%=A%!4:UNTIL!A%=size%ORA%!4=0:IF!A%=size%:B%!4=A%!4:=A%+4  :REM Scan for exact slot
  230 
  240 
  250 A%=m_heap%
  260 IFA%:IF!A%<size%:REPEATB%=A%:A%=A%!4:UNTIL!A%>=size%ORA%=0 :REM Scan for big enough slot
  270                                                            :REM Extend last slot
  280 IFA%:IF!A%<=size%:IFA%+!A%+4=E%:DIME%size%-!A%:!A%=size%:m_heap%=A%!4:=A%+4
  290                                                            :REM Slot bigger than needed, split it
  300 IFA%:IF!A%>size%+7:A%!(size%+8)=A%!4:A%!(size%+4)=!A%-size%-4:A%!4=A%+size%+4:!A%=size%
  310 IFA%=0:IFHIMEM-E%-size%-1280<0:=0                          :REM No slot, no free space
  320 IFA%=0:DIMA%size%+3:!A%=size%:=A%+4                        :REM No slot, claim new space
  330 IFB%:B%!4=A%!4 ELSE m_heap%=A%!4               :REM Get link, point to next slot
  340 =A%+4                                          :REM Return this claimed slot
  350 :
  360 DEFPROCm_free(ptr%):m_heap%=m_heap%:IFptr%=0:ENDPROC
  370 !ptr%=m_heap%:m_heap%=ptr%-4
  380 IF!ptr%=ptr%+ptr%!-4:ptr%!-4=ptr%!-4+!!ptr%+4:!ptr%=!(!ptr%+4)
  390 ENDPROC
  400 :
  410 DEFFNm_realloc(ptr%,size%):PROCm_free(ptr%):=FNm_alloc(size%)
  420 :
  430 DEFFNm_zalloc(size%):LOCALA%:A%=FNm_alloc(size%):IFA%=0ORsize%<1:=A%
  440 REPEATsize%=size%-1:A%?size%=0:UNTILsize%<0:=A%