UncachedHeaps.Mos 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. MODULE UncachedHeap; (** AUTHOR "Timothée Martiel"; PURPOSE "Secondary heap for uncached memory region of bootloader."; *)
  2. IMPORT SYSTEM, Board, Trace;
  3. CONST
  4. (** Initialize Allocated memory to 0 *)
  5. Initialize = Board.InitializeUncachedHeap;
  6. VAR
  7. start, stop, last: ADDRESS;
  8. (** Returns the beginning address of a reserved memory block of size 'size' *)
  9. PROCEDURE New * (size: SIZE): ADDRESS;
  10. VAR
  11. adr: ADDRESS;
  12. i: LONGINT;
  13. BEGIN
  14. adr := last;
  15. INC(last, size);
  16. ASSERT(last < stop);
  17. ASSERT(start <= last);
  18. IF Initialize THEN
  19. FOR i := 0 TO size - 1 DO SYSTEM.PUT8(adr + i, 0) END
  20. END;
  21. RETURN adr
  22. END New;
  23. (** Free size available on the heap, in bytes. *)
  24. PROCEDURE Free * (): SIZE;
  25. BEGIN
  26. RETURN stop - last
  27. END Free;
  28. PROCEDURE Show *;
  29. BEGIN
  30. Trace.String("Uncached Heap base = ");
  31. Trace.Address(start);
  32. Trace.String("; current = ");
  33. Trace.Address(last);
  34. Trace.String("; end = ");
  35. Trace.Address(stop);
  36. Trace.Ln
  37. END Show;
  38. BEGIN
  39. stop := Board.UncachedHeapEnd;
  40. start := Board.UncachedHeapBase;
  41. last := start;
  42. END UncachedHeap.