(*************************************************************************

             ===============================================
             Hex-encode binary files in debug-script batches
             ===============================================
                 Copyright (c) 1993,1994 by Jos‚ Campione
                   Ottawa-Orleans Personal Systems Group
                          Fidonet: 1:163/513.3

        This program reads a binary file and creates a hex-encoded 
        text file. This text file is also a batch file and a debug 
        script which, when run, will use debug.exe or debug.com to 
        reconstruct the binary file. 

**************************************************************************)
{$M 2048,0,0}
program debugbat;

uses crt,dos;

const
  maxsize = $FFEF;

type
  string2 = string[2];

var
  ifile : file of byte;
  ofile : text;
  n : word;
  s : word;
  b : byte;
  fsize : word;
  dir : dirstr;
  nam : namestr;
  ext : extstr;
  filename : string[12];
  i : integer;

function b2x(b: byte): string2;
const hexdigit: array[0..15] of char = '0123456789ABCDEF';
begin
  b2x:= hexdigit[b shr 4] + hexdigit[b and $0F];
end;

procedure myhalt(e: byte);
begin
  gotoxy(1,wherey);
  case e of
    0 : writeln('done.');
    1 : writeln('error in command line.');
    2 : writeln('file exceeds the 65K limit.');
    else begin
      e:= 255;
      writeln('Unknown error.');
    end;
  end;
  halt(e);
end;

begin
  writeln;
  writeln('DEBUGBAT v.1.0. Copyright (c) Feb/93 by J. Campione.');
  write('Wait... ');
  n := 0;
  s := $F0;
  {$I-}
  assign(ifile,paramstr(1));
  reset(ifile);
  {$I+}
  if (paramcount <> 1) or (ioresult <> 0) or (paramstr(1) = '') then myhalt(1);
  fsplit(paramstr(1),dir,nam,ext);
  for i:= 1 to length(ext) do ext[i]:= upcase(ext[i]);
  for i:= 1 to length(nam) do nam[i]:= upcase(nam[i]);
  if ext = '.EXE' then filename:= nam + '.EXX'
                  else filename:= nam + ext;
  fsize:= filesize(ifile);
  if fsize > maxsize then myhalt(2);
  assign(ofile, nam + '.BAT');
  rewrite(ofile);
  writeln(ofile,'@echo off');
  writeln(ofile,'rem');
  writeln(ofile,'rem *************************************************************************');
  writeln(ofile,'rem File ',nam + '.BAT',' was created by program DEBUGBAT.EXE v.1.0');
  writeln(ofile,'rem Copyright (c) Feb. 1993 by J. Campione (1:163/513.3)');
  writeln(ofile,'rem Running this file uses DEBUG to reconstruct file ',nam + ext);
  writeln(ofile,'rem *************************************************************************');
  writeln(ofile,'rem');
  writeln(ofile,'echo DEBUGBAT v.1.0. Copyright (c) Feb/93 by J. Campione.');
  writeln(ofile,'if not exist %1debug.exe goto error1');
  writeln(ofile,'goto decode');
  writeln(ofile,':error1');
  writeln(ofile,'if not exist %1debug.com goto error2');
  writeln(ofile,':decode');
  writeln(ofile,'echo Wait...');
  writeln(ofile,'debug < %0.BAT > nul');
  writeln(ofile,'goto name');
  writeln(ofile,':error2');
  writeln(ofile,'echo Run %0.BAT with DEBUG''s path in the command line');
  writeln(ofile,'echo example:   %0 c:\dos\    ... notice the trailing slash!');
  write(ofile,'goto end');
  while not eof(ifile) do begin
    n:= n + 1;
    read(ifile,b);
    if n mod 16 = 1 then begin
      s := s + 16;
      writeln(ofile);
      write(ofile,'E ',b2x(hi(s)),b2x(lo(s)));
    end;
    write(ofile,' ',b2x(b));
  end;
  writeln(ofile);
  writeln(ofile,'RCX');
  writeln(ofile,b2x(hi(n)),b2x(lo(n)));
  if ext = '.EXE' then begin
    filename:= nam + '.EXX';
  end;
  writeln(ofile,'N ',filename);
  writeln(ofile,'W');
  writeln(ofile,'Q');
  writeln(ofile,':name');
  if ext = '.EXE' then begin
    writeln(ofile,'if exist ',nam + ext,' del ',nam + ext);
    writeln(ofile,'rename ',nam + '.EXX ',nam + ext);
  end;
  writeln(ofile,':end');
  close(ifile);
  close(ofile);
  myhalt(0);
end.

