home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / das_buch / dos / memdump.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-05-13  |  2.9 KB  |  72 lines

  1. {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-}
  2. {$M 16384,0,$10000}
  3. (*===================================================================*)
  4. (*                           MEMDUMP.PAS                             *)
  5. (*             Copyright (C) 1993 te-wi Verlag, München              *)
  6. (*-------------------------------------------------------------------*)
  7. (* Das Programm erzeugt einen Dump eines beliebigen Speicherbereichs *)
  8. (*   Die Größe der Dateien ist auf 64 kByte (ein Segment) begrenzt.  *)
  9. (*    Das Programm darf nicht im Protected Mode compiliert werden!   *)
  10. (*===================================================================*)
  11.  
  12. PROGRAM MemDump;
  13.  
  14. USES
  15.   Hex;
  16.  
  17. VAR
  18.   i      : INTEGER;
  19.   p      : POINTER;
  20.   Segment: WORD;
  21.   f      : FILE;
  22.   len    : WORD;
  23.   s      : STRING;
  24.  
  25. PROCEDURE ErrorMsg;
  26. BEGIN
  27.   WriteLn(^M^J'MEMDUMP Version 1.0'^J);
  28.   WriteLn('Fehler: Falscher oder fehlender Kommandozeilenparameter!');
  29.   WriteLn('Aufruf: MEMDUMP Segmentadresse [Länge]'^J);
  30.   WriteLn(' Bei Eingabe von hexadezimalen Werten muß ein Dollarzeichen'
  31.         + ' ($)');
  32.   WriteLn(' vor die Zahl gestellt werden. Es wird immer ab dem Offset'
  33.         + ' $0000');
  34.   WriteLn(' gelesen. Wird keine Länge oder die Zahl 0 angegeben, wird'
  35.         + ' ein');
  36.   WriteLn(' volles Segment (65535 Bytes) abgespeichert.');
  37. END;
  38.  
  39. BEGIN
  40.   len := 0;                           (* Dateilänge mit 0 vorbelegen *)
  41.   IF ParamCount = 0 THEN ErrorMsg    (* Keine Kommandozeile: Meldung *)
  42.   ELSE
  43.   BEGIN
  44.     IF Pos('?', ParamStr(1)) > 0 THEN ErrorMsg
  45.     ELSE
  46.     BEGIN
  47.       Val(ParamStr(1), Segment, i);
  48.       IF i <> 0 THEN ErrorMsg                     (* Fehler: Meldung *)
  49.       ELSE
  50.       BEGIN
  51.         IF ParamCount > 1 THEN Val(ParamStr(2), len, i);(*Länge best.*)
  52.         IF (i <> 0) OR (len = 0) THEN len := 65535;(* Länge fixieren *)
  53.         GetMem(p, len);                            (* Speicher holen *)
  54.         Move(BYTE(Ptr(Segment, $0000)^), p^, len);(* in Puffer lesen *)
  55.         s := Word2Hex(Segment);                           (* Hexwert *)
  56.         IF Segment < $A000 THEN s := 'RAM-' + s
  57.                            ELSE s := 'ROM-' + s;  (* Namen festlegen *)
  58.         IF Length(s) > 8 THEN s[0] := #8;      (* Namenslänge max. 8 *)
  59.         s := s + '.BIN';                      (* Endung fixiert .BIN *)
  60.         Assign(f, s);                      (* Dateivariable zuordnen *)
  61.         ReWrite(f, 1);                           (* Record-Länge = 1 *)
  62.         BlockWrite(f, p^, len);         (* Puffer in Datei schreiben *)
  63.         Close(f);                          (* Datei wieder schließen *)
  64.         WriteLn(s, ' erzeugt');                  (* Meldung ausgeben *)
  65.         FreeMem(p, len);                (* Speicher wieder freigeben *)
  66.       END;                          (* ... und das war's auch schon! *)
  67.     END;
  68.   END;
  69. END.
  70.  
  71. (*===================================================================*)
  72.