(* D64DUMP.PAS -- simple disk image viewer
** Copyright (c) 1995,1996 Jochen Metzinger
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2, or (at your option)
** any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*)

PROGRAM D64dump;

USES global, errors, d64, dump;

VAR
 tr: INTEGER;
 sk: BYTE;
 sector: BLOCK;

PROCEDURE usage;
BEGIN
 WriteLn('D64DUMP  Version 0.3  View disk images');
 WriteLn('Copyright (c) 1995,1996 Jochen Metzinger ');
 WriteLn;
 WriteLn(short_usage);
 WriteLn;
 WriteLn('  image       disk image');
 HALT(1);
END; (* usage *)

PROCEDURE Init;
 VAR i, j: WORD; par: STRING;
  in_name: STRING;
BEGIN
 short_usage := 'D64DUMP [/?] image';
 in_name := '';
 IF ParamCount = 0 THEN
  usage;
 FOR i := 1 TO ParamCount DO BEGIN
  par := ParamStr(i);
  IF (par[1] = '/') OR (par[1] = '-') THEN
   BEGIN
    IF Length(par) = 1 THEN
     FATAL('unknown option '+par);
    FOR j := 2 TO Length(par) DO
     CASE UpCase(par[j]) OF
      '?', 'H': usage;
      ELSE FATAL('unknown option '+par);
     END; (* case *)
   END
  ELSE IF in_name = '' THEN
   in_name := AddExt(par, '.D64')
 END; (* for *)
 IF in_name = '' THEN usage;
 d64_open(in_name);
 err_stop;
 Write(in_name,' [15');
 IF d64_double_sided THEN Write('7') ELSE Write('4');
 Write('1 mode]');
 IF d64_read_only THEN Write(' RO');
 WriteLn;
 short_usage := '';
END; (* init *)

BEGIN
 Init;
 sector[0] := 18;
 sector[1] :=  0;
 REPEAT
  Write(' TR SK :');
  Read(tr);
  IF tr < 0 THEN
   BEGIN (* exit *)
    d64_close;
    EXIT;
   END
  ELSE IF tr = 0 THEN
   BEGIN (* next *)
    ReadLn;
    tr := sector[0];
    sk := sector[1];
   END
  ELSE
   ReadLn(sk);
  d64_read(tr,sk,sector);
  IF is_err
   THEN err_recover
   ELSE DumpVar(sector,256,0)
 UNTIL FALSE;
END. (* D64dump *)
