home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------------------------- *)
- (* MAP.PAS (v3.1) *)
- (* Ausgabe eines Belegungsplanes des PC-Hauptspeichers *)
- (* Copyright (c) 1988 Karsten Gieselmann & TOOLBOX *)
- (* ------------------------------------------------------------------------- *)
-
- {$R-,S-,I-,V-,B-,N-} (* größtmögliche Geschwindigkeit! *)
-
- PROGRAM Map;
-
- USES Dos, ProgMap; (* benötigte Units *)
-
- CONST
- LastIntr = $7F; (* Interruptvektor-Check bis zu dieser Nummer *)
-
- VAR
- IntrCount, (* Zähler für angezapfte Interrupts *)
- i : BYTE;
- FreeMemory : LONGINT; (* Verbleibende RAM-Speichergröße in Bytes *)
- ProgPtr : EntryPtr;
- IntrSegment,
- NextSegment : WORD;
- Hooked : BOOLEAN; (* Interruptvektor umgelenkt? *)
-
-
- (* ------------------- Dezimal-Hexadezimal-Konversion ---------------------- *)
-
- CONST
- HexDigit : ARRAY [0..$F] OF CHAR = '0123456789ABCDEF';
-
- FUNCTION HexB (B : BYTE) : STRING;
- BEGIN
- HexB[0] := #2;
- HexB[1] := HexDigit[B SHR 4];
- HexB[2] := HexDigit[B AND $F];
- END;
-
- FUNCTION HexW (W : WORD) : STRING;
- BEGIN
- HexW[0] := #4;
- HexW[1] := HexDigit[Hi(W) SHR 4];
- HexW[2] := HexDigit[Hi(W) AND $F];
- HexW[3] := HexDigit[Lo(W) SHR 4];
- HexW[4] := HexDigit[Lo(W) AND $F];
- END;
-
-
- (* ----------------------------- Hauptprogramm ----------------------------- *)
-
- BEGIN
- MakeMemoryMap (ProgPtr);
- WriteLn (^M^J'MAP v3.1 - Speicherbelegungsplan'^M^J);
- Write (' Adresse Programm Seg Bytes');
- WriteLn (' Interrupt-Vektoren');
- Write ('───────── ──────── ─── ──────');
- WriteLn (' ──────────────────────────────────────');
- WHILE ProgPtr <> NIL DO BEGIN
- WITH ProgPtr^ DO
- IF Next <> NIL THEN BEGIN
- Write (HexW(Segment), ':0000 ');
- Write (Name, '':8-Length(Name));
- Write (Segs:6, LONGINT(Paragraphs) SHL 4:9, ' ');
- IntrCount := 0;
- NextSegment := Next^.Segment;
- IF Name <> 'DOS' THEN (* das DOS zapft keine Vektoren an! *)
- FOR i:=$00 TO LastIntr DO BEGIN
- IntrSegment := MemW[0:i SHL 2+2] + MemW[0:i SHL 2] SHR 4;
- IF Segment <= IntrSegment THEN
- IF IntrSegment < NextSegment THEN BEGIN (* angezapft! *)
- IF IntrCount MOD 10 = 0 THEN
- IF IntrCount <> 0 THEN
- Write (^M^J,'':36);
- Write (HexB(i):4);
- Inc (IntrCount);
- END;
- END;
- WriteLn
- END ELSE BEGIN (* letzter Eintrag ist laufendes Progamm! *)
- FreeMemory := LONGINT(Paragraphs + UnUsed) * 16;
- WriteLn (^M^J'Freier RAM-Speicher:', FreeMemory:15);
- WriteLn (^M^J'Nächste Ladeadresse: ', HexW(Segment));
- END;
- ProgPtr := ProgPtr^.Next;
- END;
- END.
-