IMPLEMENTATION MODULE Dump;
(* bp 8.3.89 *)

FROM SYSTEM IMPORT ADDRESS,ADR,CAST;

(* $R- $S- $V- $F- $Z- *)

(* from .def
VAR
  BLength, (* zusammengefasste Bytes 1, 2 od. 4  Init: 2 *)
  ByteCount, (* Bytes je Zeile 16, 32  Init: 16 *)
  AddrLen, (* Anz Chars für Addresse Init: 6 *)
  	: CARDINAL;
  Offset: LONGINT; (* ScheinAddr = RealVon+Offset  Init: 0 *)
*)

TYPE
	UByte = [0..255];
	CharPtr = POINTER TO CHAR;
	BytePtr = POINTER TO UByte;
	WordPtr = POINTER TO CARDINAL;
	LongPtr = POINTER TO LONGCARD;

VAR Pos:BytePtr;

PROCEDURE PutChar(ch{5}:UByte):UByte;
BEGIN
  IF (ch<32) OR ( (ch>=80H) AND (ch<0A0H) ) THEN
    RETURN ORD('.')
  ELSE
    RETURN ch
  END
END PutChar;

PROCEDURE Put(b{4}:UByte);
BEGIN
  Pos^:=b;
  INC(Pos)
END Put;

PROCEDURE PHex(a:UByte);
VAR b:UByte;
BEGIN
  b:=(a DIV 16)+30H;
  IF b<3AH THEN Put(b) ELSE Put(b+7) END;
  b:=(a MOD 16) +30H;
  IF b<3AH THEN Put(b) ELSE Put(b+7) END;
END PHex;

PROCEDURE Dump(VAR Str:ARRAY OF CHAR; RealVon:ADDRESS);
	(* ScheinAddr = RealVon+Offset *)
VAR
    i:INTEGER;
    Byte:UByte;
    Start: BytePtr;
    Schein: RECORD
    		CASE :INTEGER OF
    		| 0: all:LONGINT;
    		| 1: hh, hl, lh, ll:UByte;
    		END
    	    END;
BEGIN
  Pos:=ADR(Str);
  Start:=RealVon;
  Byte:=0;
  Schein.all:=RealVon+Offset;
  IF AddrLen>6 THEN PHex(Schein.hh) END;
  IF AddrLen>4 THEN PHex(Schein.hl) END;
  PHex(Schein.lh);
  PHex(Schein.ll);
  Put(32);
  FOR i:=1 TO ByteCount DO
    IF Byte=0 THEN Put(32) END;
    Byte:=(Byte+1) REM BLength;
    PHex(Start^);
    INC(Start);
  END;
  Put(32); Put(32);
  Start:=RealVon;
  FOR i:=1 TO ByteCount DO
    Put(PutChar(Start^));
    INC(Start)
  END;
  Put(0);
END Dump;

BEGIN (* main *)
  BLength:=2;
  ByteCount:=16;
  AddrLen:=6;
  Offset:=0;
END Dump.mod

