95 lines
1.8 KiB
Plaintext
95 lines
1.8 KiB
Plaintext
const
|
|
IRecEOF : String[11] = ':00000001FF';
|
|
IRecDat : Byte = 0;
|
|
|
|
type
|
|
LnStr = String[64];
|
|
|
|
{irec stores an individual record.}
|
|
irec = record
|
|
Addr : Integer;
|
|
Data : array [1..32] of Byte;
|
|
Count : Byte;
|
|
MaxCount : Byte;
|
|
RType : Byte;
|
|
end;
|
|
|
|
|
|
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);
|
|
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;
|
|
end;
|
|
|
|
function IRecCS(rec : irec) : Byte;
|
|
var
|
|
cksm : Integer;
|
|
I : Integer;
|
|
begin
|
|
cksm := rec.Addr + rec.Count + rec.RType;
|
|
for I := 1 to rec.Count do cksm := cksm + rec.Data[I];
|
|
cksm := cksm and $00FF;
|
|
|
|
IRecCS := not Byte(cksm) + 1;
|
|
end;
|
|
|
|
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; |