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