PROGRAM SourceRetter;

{$opt b- }
{$path "ram:include/", "pascal:include/"}
{$include "libraries/dos.h", "exec/execbase.h"}
{$link "pas:Rescue.l" - Pfadname ist nach Bedarf zu ändern! }

CONST MinExtMem=$c00000;

TYPE Kennung = RECORD
                 s: String[14];
                 Zahl1, Zahl2: integer;
                 Anfang, Ende: Long
               END;

VAR
 Base: ^ExecBase;

PROCEDURE WriteHex(L:Long);
  Var i: integer;
      d: Long;
  BEGIN
    d := $100000;
    L := L AND $FFFFFF;
    write('$');
    For i := 1 to 6 Do
      Begin
        write( '0123456789ABCDEF'.[L div d +1] );
        L := L mod d;
        d := d div 16
      End
  END;

PROCEDURE SaveMemory(a,e:Long);
  VAR Name:string[80];
      i:Long;
      fi: BPTR;

  BEGIN
    Repeat
      write('Filename: '); readln(Name);
      If Name<>'' Then
        Begin
          fi:=Open(Name,MODE_NEWFILE);
          If fi=0 Then
            writeln('File Error!')
          Else
            Begin
              writeln('Saving...');
              i:=_Write(fi,Ptr(a),e-a);
              _Close(fi);
              If i=e-a Then name:=''   { OK }
              Else
                writeln('File Error!');
            End
        End
    Until name='';
    writeln('Searching...');
  END;


FUNCTION Finde(a0,a1:Long):Long; External;


PROCEDURE Suchen(a,e:Long);
  VAR i:  Long;
      kp: ^Kennung;
  BEGIN
    i:=a;
    i := Finde( i, e );
    While i<>0 Do
      Begin
        kp := Ptr( i );
        write('Found: ');
        WriteHex(kp^.Anfang);
        write(' - ');
        WriteHex(kp^.Ende);
        writeln('  (',kp^.Ende-kp^.Anfang,' Bytes)');
        SaveMemory(kp^.Anfang,kp^.Ende);

        i := Finde( i+2, e );
      End;
  END;

BEGIN
  Base := SysBase;
  writeln('Rescue - Last hope for KICK-Pascal Sources');
  writeln;
  writeln('Searching in ChipMem...');
  Suchen( $000000, Base^.MaxLocMem );
  writeln('Searching in FastMem...');
  Suchen(MinExtMem, Long( Base^.MaxExtMem ) );
END.

