home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 10_11 / mmr / map.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-07-19  |  3.0 KB  |  86 lines

  1. (* ------------------------------------------------------------------------- *)
  2. (*                              MAP.PAS (v3.1)                               *)
  3. (*            Ausgabe eines Belegungsplanes des PC-Hauptspeichers            *)
  4. (*      Copyright (c) 1988  Karsten Gieselmann  &  TOOLBOX                   *)
  5. (* ------------------------------------------------------------------------- *)
  6.  
  7. {$R-,S-,I-,V-,B-,N-}                       (* größtmögliche Geschwindigkeit! *)
  8.  
  9. PROGRAM Map;
  10.  
  11. USES Dos, ProgMap;                                        (* benötigte Units *)
  12.  
  13. CONST
  14.   LastIntr = $7F;              (* Interruptvektor-Check bis zu dieser Nummer *)
  15.  
  16. VAR
  17.   IntrCount,                             (* Zähler für angezapfte Interrupts *)
  18.   i           : BYTE;
  19.   FreeMemory  : LONGINT;          (* Verbleibende RAM-Speichergröße in Bytes *)
  20.   ProgPtr     : EntryPtr;
  21.   IntrSegment,
  22.   NextSegment : WORD;
  23.   Hooked      : BOOLEAN;                       (* Interruptvektor umgelenkt? *)
  24.  
  25.  
  26. (* ------------------- Dezimal-Hexadezimal-Konversion ---------------------- *)
  27.  
  28. CONST
  29.   HexDigit : ARRAY [0..$F] OF CHAR = '0123456789ABCDEF';
  30.  
  31. FUNCTION HexB (B : BYTE) : STRING;
  32. BEGIN
  33.   HexB[0] := #2;
  34.   HexB[1] := HexDigit[B SHR  4];
  35.   HexB[2] := HexDigit[B AND $F];
  36. END;
  37.  
  38. FUNCTION HexW (W : WORD) : STRING;
  39. BEGIN
  40.   HexW[0] := #4;
  41.   HexW[1] := HexDigit[Hi(W) SHR  4];
  42.   HexW[2] := HexDigit[Hi(W) AND $F];
  43.   HexW[3] := HexDigit[Lo(W) SHR  4];
  44.   HexW[4] := HexDigit[Lo(W) AND $F];
  45. END;
  46.  
  47.  
  48. (* ----------------------------- Hauptprogramm ----------------------------- *)
  49.  
  50. BEGIN
  51.   MakeMemoryMap (ProgPtr);
  52.   WriteLn (^M^J'MAP  v3.1  -  Speicherbelegungsplan'^M^J);
  53.   Write   (' Adresse    Programm   Seg    Bytes');
  54.   WriteLn ('              Interrupt-Vektoren');
  55.   Write   ('─────────   ────────   ───   ──────');
  56.   WriteLn ('   ──────────────────────────────────────');
  57.   WHILE ProgPtr <> NIL DO BEGIN
  58.     WITH ProgPtr^ DO
  59.       IF Next <> NIL THEN BEGIN
  60.         Write (HexW(Segment), ':0000   ');
  61.         Write (Name, '':8-Length(Name));
  62.         Write (Segs:6, LONGINT(Paragraphs) SHL 4:9, ' ');
  63.         IntrCount := 0;
  64.         NextSegment := Next^.Segment;
  65.         IF Name <> 'DOS' THEN            (* das DOS zapft keine Vektoren an! *)
  66.           FOR i:=$00 TO LastIntr DO BEGIN
  67.             IntrSegment := MemW[0:i SHL 2+2] + MemW[0:i SHL 2] SHR 4;
  68.             IF Segment <= IntrSegment THEN
  69.               IF IntrSegment < NextSegment THEN BEGIN          (* angezapft! *)
  70.                 IF IntrCount MOD 10 = 0 THEN
  71.                   IF IntrCount <> 0 THEN
  72.                     Write (^M^J,'':36);
  73.                   Write (HexB(i):4);
  74.                   Inc (IntrCount);
  75.               END;
  76.           END;
  77.         WriteLn
  78.       END ELSE BEGIN               (* letzter Eintrag ist laufendes Progamm! *)
  79.         FreeMemory := LONGINT(Paragraphs + UnUsed) * 16;
  80.         WriteLn (^M^J'Freier RAM-Speicher:', FreeMemory:15);
  81.         WriteLn (^M^J'Nächste Ladeadresse: ', HexW(Segment));
  82.       END;
  83.     ProgPtr := ProgPtr^.Next;
  84.   END;
  85. END.
  86.