home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 02 / mmr / map.pas < prev    next >
Pascal/Delphi Source File  |  1987-11-11  |  3KB  |  72 lines

  1. (*---------------------------------------------------------------------------*)
  2. (*                                 MAP.PAS                                   *)
  3. (*    Ausgabe einer Belegungstabelle des PC-Hauptspeichers (MS-DOS/Turbo)    *)
  4. (*           (c) 1987  Karsten Gieselmann  &  PASCAL International           *)
  5. (*---------------------------------------------------------------------------*)
  6. PROGRAM Map (Output);
  7. (* {$P512} *)           (* fuer DOS-Ein/Ausgabeumleitung Klammern entfernen! *)
  8. {$I MAKEMAP.INC}               (* einbinden der die Liste liefernden Routine *)
  9.  
  10. Const LastIntr = $7F;              (* Test auf Anzapfen bis zu diesem Vektor *)
  11. Type  StringType = String[4];         (* Typ fuer die Dez-Hex-Transformation *)
  12. Var   IntrCount,         (* Zahl der angezapften Interrupts für ein Programm *)
  13.       i           :Byte;
  14.       FreeMemory  :Real; (* Groesse des verbleibenden RAM-Speichers in Bytes *)
  15.       ProgPtr     :Entry;
  16.       IntrSegment,
  17.       NextSegment :Integer;
  18.       Hooked      :Boolean;
  19.  
  20. (*         wandelt ein Dezimalbyte in den entsprechenden Hexadezimalwert:    *)
  21. Function HexByte (b :Byte) :StringType;
  22.    Const HexDigit :Array [0..15] of Char = '0123456789ABCDEF';
  23. Begin   HexByte := HexDigit[b shr 4] + HexDigit[b and $0F]   End;
  24.  
  25. (*          wandelt ein Dezimalwort in den entsprechenden Hexadezimalwert:   *)
  26. Function HexWord (w :Integer) :StringType;
  27. Begin   HexWord := HexByte (w shr 8) + HexByte (w and $FF)   End;
  28.  
  29. (*         rechnet in Paragraphen gegebene Speichergroesse in Bytes um:      *)
  30. Function ByteSize (Paragraphs :Integer) :Real;
  31. Begin
  32.    If Paragraphs < 0 then  ByteSize := (Paragraphs + 65536.0) * 16.0
  33.    else  ByteSize := Paragraphs * 16.0
  34. End;
  35.  
  36. Begin (* Map *)
  37.    MakeMemoryMap (ProgPtr);   LowVideo;
  38.    WriteLn;   Write ('MAP  v2.0  -  Speicherbelegungstabelle');
  39.    WriteLn ('   (c) 1987   K.Gieselmann & PASCAL Int.');
  40.    WriteLn;
  41.    Write (' Adresse    Programm   Seg    Bytes    ');
  42.    Write ('          Interrupt-Vektoren'^M^J);
  43.    Write ('─────────   ────────   ───   ──────   ');
  44.    Write ('──────────────────────────────────────────');
  45.    While ProgPtr <> Nil do Begin
  46.       With ProgPtr^ do
  47.          If ProgPtr^.Next <> Nil then Begin
  48.             Write (HexWord(Segment), ':0000   ');
  49.             Write (Name, '':8-Length(Name));
  50.             Write (Segs:6, ByteSize(Paragraphs):9:0, ' ');
  51.             IntrCount := 1;   NextSegment := Next^.Segment;
  52.             If Name <> 'DOS' then        (* das DOS zapft keine Vektoren an! *)
  53.                For i:=$00 to LastIntr do Begin
  54.                   IntrSegment := MemW[0:i*4+2] + MemW[0:i*4] shr 4;
  55.                   If not Lower (IntrSegment, Segment) then
  56.                      If not Lower (NextSegment, IntrSegment) then Begin
  57.                         If IntrCount mod 12 = 0 then  Write ('':36);
  58.                         Write (HexByte(i):4);   IntrCount := succ (IntrCount)
  59.                      End
  60.                End;
  61.             If IntrCount mod 12 <> 0 then  WriteLn
  62.          End
  63.          else begin                (* letzter Eintrag ist laufendes Progamm! *)
  64.             FreeMemory := ByteSize (Paragraphs + FreeBlocks);
  65.             WriteLn (^J'Freier RAM-Speicher:', FreeMemory:15:0);
  66.             WriteLn (^J'Nächste Ladeadresse: ', HexWord(Segment))
  67.          End;
  68.       ProgPtr := ProgPtr^.Next
  69.    End;
  70.    WriteLn
  71. End.
  72.