home *** CD-ROM | disk | FTP | other *** search
- (*---------------------------------------------------------------------------*)
- (* MAP.PAS *)
- (* Ausgabe einer Belegungstabelle des PC-Hauptspeichers (MS-DOS/Turbo) *)
- (* (c) 1987 Karsten Gieselmann & PASCAL International *)
- (*---------------------------------------------------------------------------*)
- PROGRAM Map (Output);
- (* {$P512} *) (* fuer DOS-Ein/Ausgabeumleitung Klammern entfernen! *)
- {$I MAKEMAP.INC} (* einbinden der die Liste liefernden Routine *)
-
- Const LastIntr = $7F; (* Test auf Anzapfen bis zu diesem Vektor *)
- Type StringType = String[4]; (* Typ fuer die Dez-Hex-Transformation *)
- Var IntrCount, (* Zahl der angezapften Interrupts für ein Programm *)
- i :Byte;
- FreeMemory :Real; (* Groesse des verbleibenden RAM-Speichers in Bytes *)
- ProgPtr :Entry;
- IntrSegment,
- NextSegment :Integer;
- Hooked :Boolean;
-
- (* wandelt ein Dezimalbyte in den entsprechenden Hexadezimalwert: *)
- Function HexByte (b :Byte) :StringType;
- Const HexDigit :Array [0..15] of Char = '0123456789ABCDEF';
- Begin HexByte := HexDigit[b shr 4] + HexDigit[b and $0F] End;
-
- (* wandelt ein Dezimalwort in den entsprechenden Hexadezimalwert: *)
- Function HexWord (w :Integer) :StringType;
- Begin HexWord := HexByte (w shr 8) + HexByte (w and $FF) End;
-
- (* rechnet in Paragraphen gegebene Speichergroesse in Bytes um: *)
- Function ByteSize (Paragraphs :Integer) :Real;
- Begin
- If Paragraphs < 0 then ByteSize := (Paragraphs + 65536.0) * 16.0
- else ByteSize := Paragraphs * 16.0
- End;
-
- Begin (* Map *)
- MakeMemoryMap (ProgPtr); LowVideo;
- WriteLn; Write ('MAP v2.0 - Speicherbelegungstabelle');
- WriteLn (' (c) 1987 K.Gieselmann & PASCAL Int.');
- WriteLn;
- Write (' Adresse Programm Seg Bytes ');
- Write (' Interrupt-Vektoren'^M^J);
- Write ('───────── ──────── ─── ────── ');
- Write ('──────────────────────────────────────────');
- While ProgPtr <> Nil do Begin
- With ProgPtr^ do
- If ProgPtr^.Next <> Nil then Begin
- Write (HexWord(Segment), ':0000 ');
- Write (Name, '':8-Length(Name));
- Write (Segs:6, ByteSize(Paragraphs):9:0, ' ');
- IntrCount := 1; NextSegment := Next^.Segment;
- If Name <> 'DOS' then (* das DOS zapft keine Vektoren an! *)
- For i:=$00 to LastIntr do Begin
- IntrSegment := MemW[0:i*4+2] + MemW[0:i*4] shr 4;
- If not Lower (IntrSegment, Segment) then
- If not Lower (NextSegment, IntrSegment) then Begin
- If IntrCount mod 12 = 0 then Write ('':36);
- Write (HexByte(i):4); IntrCount := succ (IntrCount)
- End
- End;
- If IntrCount mod 12 <> 0 then WriteLn
- End
- else begin (* letzter Eintrag ist laufendes Progamm! *)
- FreeMemory := ByteSize (Paragraphs + FreeBlocks);
- WriteLn (^J'Freier RAM-Speicher:', FreeMemory:15:0);
- WriteLn (^J'Nächste Ladeadresse: ', HexWord(Segment))
- End;
- ProgPtr := ProgPtr^.Next
- End;
- WriteLn
- End.