working undump
This commit is contained in:
parent
0e42524d76
commit
a43054deec
5
Makefile
5
Makefile
|
@ -1,4 +1,4 @@
|
|||
TARGETS := hello test undump
|
||||
TARGETS := test undump
|
||||
LIBS := binary.pas ihex.pas
|
||||
FPC_FLAGS := -g
|
||||
FPC := fpc $(FPC_FLAGS)
|
||||
|
@ -10,9 +10,6 @@ all: $(TARGETS)
|
|||
clean:
|
||||
rm -f *.o $(TARGETS)
|
||||
|
||||
hello: hello.pas
|
||||
$(FPC) $@.pas
|
||||
|
||||
test: test.pas $(LIBS)
|
||||
$(FPC) $@.pas
|
||||
|
||||
|
|
25
binary.pas
25
binary.pas
|
@ -4,8 +4,10 @@ WStr = String[4]; { String representing a u16. }
|
|||
|
||||
function ValidHexDigit(bval: Byte): Boolean;
|
||||
var
|
||||
IsValid : Boolean = False;
|
||||
IsValid : Boolean;
|
||||
begin
|
||||
IsValid := False;
|
||||
|
||||
if ((bval >= $30) and (bval <= $39)) then
|
||||
IsValid := True;
|
||||
if ((bval >= $41) and (bval <= $46)) then
|
||||
|
@ -19,7 +21,7 @@ end;
|
|||
|
||||
function ReadDigit(bchr: Char): Byte;
|
||||
var
|
||||
bval : Byte = 0;
|
||||
bval : Byte;
|
||||
label
|
||||
exitearly;
|
||||
begin
|
||||
|
@ -37,7 +39,7 @@ begin
|
|||
|
||||
{Perform the conversion.}
|
||||
if (bchr >= 'A') then
|
||||
bval := (bval - $41) + 10
|
||||
bval := bval - $37
|
||||
else
|
||||
bval := bval - $30;
|
||||
|
||||
|
@ -48,7 +50,7 @@ end;
|
|||
|
||||
function ReadByte(bstr : BStr): Byte;
|
||||
var
|
||||
out : Byte = 0;
|
||||
out : Byte;
|
||||
begin
|
||||
out := ReadDigit(bstr[1]) shl 4;
|
||||
out := out + ReadDigit(bstr[2]);
|
||||
|
@ -58,9 +60,10 @@ end;
|
|||
|
||||
function ReadWord(bstr : WStr): Integer;
|
||||
var
|
||||
out : Integer = 0;
|
||||
I : Integer = 1;
|
||||
out : Integer;
|
||||
I : Integer;
|
||||
begin
|
||||
out := 0;
|
||||
for I := 1 to 4 do
|
||||
begin
|
||||
out := out shl 4;
|
||||
|
@ -77,8 +80,8 @@ begin
|
|||
c := Char(0);
|
||||
if (digit < $0A) then
|
||||
c := Char(digit + $30)
|
||||
else if (digit < $0F) then
|
||||
c := Char(digit + $41);
|
||||
else if (digit <= $0F) then
|
||||
c := Char(digit + $37);
|
||||
|
||||
ToDigit := c;
|
||||
end;
|
||||
|
@ -86,8 +89,9 @@ end;
|
|||
|
||||
function WriteByte(bval : Byte): BStr;
|
||||
var
|
||||
s : BStr = '00';
|
||||
s : BStr;
|
||||
begin
|
||||
s := '00';
|
||||
s[1] := ToDigit(bval shr 4);
|
||||
s[2] := ToDigit(bval and $0F);
|
||||
WriteByte := s;
|
||||
|
@ -95,8 +99,9 @@ end;
|
|||
|
||||
function WriteWord(bval : Integer): WStr;
|
||||
var
|
||||
s : WStr = '0000';
|
||||
s : WStr;
|
||||
begin
|
||||
s := '0000';
|
||||
s[1] := ToDigit((bval shr $0C) and $000F);
|
||||
s[2] := ToDigit((bval shr $08) and $000F);
|
||||
s[3] := ToDigit((bval shr $04) and $000F);
|
||||
|
|
58
ihex.pas
58
ihex.pas
|
@ -1,8 +1,6 @@
|
|||
const
|
||||
MaxLnLen : Integer = 64;
|
||||
MaxRLen : Integer = 32;
|
||||
DumpBytes: Integer = 16;
|
||||
IRecEOF : String[11] = ':00000001FF';
|
||||
IRecDat : Byte = 0;
|
||||
|
||||
type
|
||||
LnStr = String[64];
|
||||
|
@ -13,23 +11,43 @@ irec = record
|
|||
Data : array [1..32] of Byte;
|
||||
Count : Byte;
|
||||
MaxCount : Byte;
|
||||
RType : Byte;
|
||||
end;
|
||||
|
||||
|
||||
function GetDumpCnt(Line : LnStr): Byte;
|
||||
function IsWhSp(c: Char): Boolean;
|
||||
var
|
||||
res : Boolean;
|
||||
begin
|
||||
res := False;
|
||||
|
||||
case c of
|
||||
' ' : res := True;
|
||||
#$0A : res := True;
|
||||
#$0D : res := True;
|
||||
end;
|
||||
|
||||
IsWhSp := res;
|
||||
end;
|
||||
|
||||
|
||||
function RdDumpLn(Line : LnStr): irec;
|
||||
var
|
||||
lrec : irec;
|
||||
begin
|
||||
lrec.Addr := ReadWord(Line);
|
||||
while (lrec.Count < DumpBytes) do
|
||||
lrec.RType := IRecDat;
|
||||
lrec.Count := 0;
|
||||
|
||||
Delete(Line, 1, 4);
|
||||
while (Line <> '') do
|
||||
begin
|
||||
if IsWhSp(Line[1]) then Delete(Line, 1, 1);
|
||||
if Line <> '' then
|
||||
begin
|
||||
lrec.Count := lrec.Count + 1;
|
||||
lrec.Data[lrec.Count] := ReadByte(Line);
|
||||
Delete(Line, 1, 2);
|
||||
end;
|
||||
end;
|
||||
|
||||
RdDumpLn := lrec;
|
||||
|
@ -37,23 +55,41 @@ end;
|
|||
|
||||
function IRecCS(rec : irec) : Byte;
|
||||
var
|
||||
cksm : Integer = 0;
|
||||
cksm : Integer;
|
||||
I : Integer;
|
||||
begin
|
||||
cksm := rec.Addr + rec.Count;
|
||||
cksm := rec.Addr + rec.Count + rec.RType;
|
||||
for I := 1 to rec.Count do cksm := cksm + rec.Data[I];
|
||||
cksm := cksm and $00FF;
|
||||
|
||||
IRecCS := Byte(cksm and $00FF);
|
||||
IRecCS := not Byte(cksm) + 1;
|
||||
end;
|
||||
|
||||
procedure wrirec(rec : irec);
|
||||
procedure PrnRec(rec : irec);
|
||||
var
|
||||
I : Byte;
|
||||
begin
|
||||
Write(':');
|
||||
Write(WriteByte(rec.Count));
|
||||
Write(WriteWord(rec.Addr));
|
||||
|
||||
Write(WriteByte(rec.RType));
|
||||
for I := 1 to rec.Count do
|
||||
Write(WriteByte(rec.Data[I]));
|
||||
|
||||
Writeln(WriteByte(IRecCS(rec)));
|
||||
end;
|
||||
|
||||
|
||||
procedure WrRec(rec : irec; var outf : Text);
|
||||
var
|
||||
I : Byte;
|
||||
begin
|
||||
Write(outf, ':');
|
||||
Write(outf, WriteByte(rec.Count));
|
||||
Write(outf, WriteWord(rec.Addr));
|
||||
Write(outf, WriteByte(rec.RType));
|
||||
for I := 1 to rec.Count do
|
||||
Write(outf, WriteByte(rec.Data[I]));
|
||||
|
||||
Writeln(outf, WriteByte(IRecCS(rec)));
|
||||
end;
|
8
test.pas
8
test.pas
|
@ -1,10 +1,16 @@
|
|||
program test;
|
||||
|
||||
{$I 'binary.pas'}
|
||||
|
||||
var
|
||||
I : Byte;
|
||||
begin
|
||||
Writeln('ReadByte(''41'')->', ReadByte('41'));
|
||||
Writeln('WriteByte($41)->', WriteByte($41));
|
||||
Writeln('ReadWord(''4243'')->', ReadWord('4243'));
|
||||
Writeln('WriteByte($4243)->', WriteWord($4243));
|
||||
|
||||
for I := 0 to 32 do
|
||||
begin
|
||||
WriteLn(I, '->', WriteByte(I));
|
||||
end;
|
||||
end.
|
||||
|
|
84
undump.pas
84
undump.pas
|
@ -7,6 +7,88 @@ program undump;
|
|||
{$I 'binary.pas'}
|
||||
{$I 'ihex.pas'}
|
||||
|
||||
type
|
||||
FilePath = String[12];
|
||||
|
||||
Procedure DumpIHex(iname, oname : FilePath);
|
||||
var
|
||||
inf : Text;
|
||||
outf : Text;
|
||||
line : LnStr;
|
||||
rec : IRec;
|
||||
begin
|
||||
Writeln('UNDUMP V1.0');
|
||||
if iname <> '' then
|
||||
begin
|
||||
Assign(inf, iname);
|
||||
Reset(inf);
|
||||
end else inf := Input;
|
||||
|
||||
if oname <> '' then
|
||||
begin
|
||||
Assign(outf, oname);
|
||||
Rewrite(outf);
|
||||
end else outf := Output;
|
||||
|
||||
while not EOF(inf) do
|
||||
begin
|
||||
ReadLn(inf, line);
|
||||
if (Line <> '') then
|
||||
begin
|
||||
rec := RdDumpLn(line);
|
||||
WrRec(rec, outf);
|
||||
end;
|
||||
end;
|
||||
|
||||
Close(inf);
|
||||
Writeln(outf, IRecEOF);
|
||||
Flush(outf);
|
||||
Close(outf);
|
||||
end;
|
||||
|
||||
procedure PrnHelp;
|
||||
begin
|
||||
WriteLn('UNDUMP V1.0');
|
||||
WriteLn('Converts DUMP.COM output to Intel Hex format');
|
||||
WriteLn('');
|
||||
WriteLn('Usage:');
|
||||
WriteLn(' UNDUMP.COM INFILE OUTFILE');
|
||||
Halt;
|
||||
end;
|
||||
|
||||
var
|
||||
i, argc : Integer;
|
||||
rec : irec;
|
||||
opts : record
|
||||
ShoVer : Boolean;
|
||||
InFile : FilePath;
|
||||
OutFile : FilePath;
|
||||
end;
|
||||
param : String[255];
|
||||
begin
|
||||
opts.ShoVer := False;
|
||||
opts.InFile := '';
|
||||
opts.OutFile := '';
|
||||
argc := ParamCount;
|
||||
|
||||
for i := 1 to ParamCount do
|
||||
begin
|
||||
if ParamStr(i) = '-h' or ParamStr(i) = 'H' then
|
||||
begin
|
||||
opts.ShoVer := True;
|
||||
argc := argc - 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
if opts.ShoVer then PrnHelp();
|
||||
|
||||
i := ParamCount - argc + 1;
|
||||
|
||||
if i = 1 then opts.OutFile := ParamStr(ParamCount);
|
||||
if i > 1 then
|
||||
begin
|
||||
InFile := ParamStr(i);
|
||||
OutFile := ParamStr(i+1);
|
||||
end;
|
||||
|
||||
DumpIHex(InFile, OutFile);
|
||||
end.
|
||||
|
|
Loading…
Reference in New Issue