MODULE FreeMem;

(** ------------------------------------------------------------------

             Commodore Amiga free memory demonstration module

      (c) Copyright 1986 Modula-2 Software Ltd.  All Rights Reserved
      (c) Copyright 1986 TDI Software, Inc.      All Rights Reserved

    ------------------------------------------------------------------ **)


(* VERSION FOR COMMODORE AMIGA

     Original Author : Paul Curtis, Modula-2 Software Ltd.  23-Jan-86

     Version         : 0.00b  10-Jul-86  Paul Curtis, Modula-2 Software Ltd.
                         Compiler 2.20a modifications.
                       0.00a  23-Jan-86  Paul Curtis, Modula-2 Software Ltd.
                         Original

  *)


FROM SYSTEM IMPORT NULL;
FROM AMIGAX IMPORT ExecBase;
FROM ExecBase IMPORT ExecBasePtr;
FROM Interrupts IMPORT Forbid, Permit;
FROM Memory IMPORT MemChunkPtr, MemHeaderPtr;
FROM InOut IMPORT WriteString, WriteLn;
FROM LongInOut IMPORT WriteLongCard;
FROM Libraries IMPORT CloseLibrary;
FROM DOSLibrary IMPORT DOSBase;


(*$S-,$T-,$A+*)


CONST
  MaxSize = 18;

VAR
  size: LONGINT;
  chunkCounts: ARRAY [0..MaxSize] OF LONGCARD;
  chunk: MemChunkPtr;
  header: MemHeaderPtr;
  i: CARDINAL;
  l: LONGCARD;
  s: ARRAY [0..19] OF CHAR;
  EB: ExecBasePtr;


BEGIN
  EB := ExecBasePtr(ExecBase);
  FOR i := 0 TO MaxSize DO
    chunkCounts[i] := 0;
  END;

  Forbid;  (* as this list is a dynamic resource *)

  header := MemHeaderPtr(EB^.MemList.lhHead);
  WHILE header^.mhNode.lnSucc <> NULL DO
    chunk := header^.mhFirst;
    WHILE chunk <> NULL DO
      l := 1;  FOR i := 1 TO MaxSize DO l := l * 2; END;
      i := MaxSize;
      WHILE chunk^.mcBytes < l DO
        l := l DIV 2;  DEC(i);
      END;
      INC(chunkCounts[i]);
      chunk := chunk^.mcNext;
    END;
    header := MemHeaderPtr(header^.mhNode.lnSucc)
  END;

  Permit;

  WriteString("Free memory   Version  0.00a"); WriteLn; WriteLn;

  l := 1;
  FOR i := 0 TO MaxSize DO
    WriteLongCard(l,10);
    WriteLongCard(chunkCounts[i],10);
    WriteLn;
    l := l * 2;
  END;
  WriteLn;

  (* close the DOS library opened by Terminal *)
  CloseLibrary(DOSBase);

END FreeMem.
