10 REM > BLib.MAllocB/src 1.05 15Sep2011
   20 REM Version B: scans list before checking last slot
   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 size%=(size%+3)AND-4:DIME%-1:IFsize%=0:=HIMEM-E%-1280    :REM Return free space
  190 A%=m_heap%
  200 IFA%:IF!A%<size%:REPEATB%=A%:A%=A%!4:UNTIL!A%>=size%ORA%=0 :REM Scan for big enough slot
  210                                                            :REM Extend last slot
  220 IFA%:IF!A%<=size%:IFA%+!A%+4=E%:DIME%size%-!A%:!A%=size%:m_heap%=A%!4:=A%+4
  230                                                            :REM Slot bigger than needed, split it
  240 IFA%:IF!A%>size%+7:A%!(size%+8)=A%!4:A%!(size%+4)=!A%-size%-4:A%!4=A%+size%+4:!A%=size%
  250 IFA%=0:IFHIMEM-E%-size%-1280<0:=0                          :REM No slot, no free space
  260 IFA%=0:DIMA%size%+3:!A%=size%:=A%+4                        :REM No slot, claim new space
  270 IFB%:B%!4=A%!4 ELSE m_heap%=A%!4               :REM Get link, point to next slot
  280 =A%+4                                          :REM Return this claimed slot
  290 :
  300 DEFPROCm_free(ptr%):m_heap%=m_heap%:IFptr%=0:ENDPROC
  310 !ptr%=m_heap%:m_heap%=ptr%-4
  320 IF!ptr%=ptr%+ptr%!-4:ptr%!-4=ptr%!-4+!!ptr%+4:!ptr%=!(!ptr%+4)
  330 ENDPROC
  340 :
  350 DEFFNm_realloc(ptr%,size%):PROCm_free(ptr%):=FNm_alloc(size%)
  360 :
  370 DEFFNm_zalloc(size%):LOCALA%:A%=FNm_alloc(size%):IFA%=0ORsize%<1:=A%
  380 REPEATsize%=size%-1:A%?size%=0:UNTILsize%<0:=A%