Browse Source

* factored out the file header writing to a new method TTZXWriter.AppendHeader to avoid code repetition

git-svn-id: branches/z80@44594 -
nickysn 5 years ago
parent
commit
0ace5d96a7
1 changed files with 21 additions and 30 deletions
  1. 21 30
      utils/ihx2tzx/tzxwriter.pas

+ 21 - 30
utils/ihx2tzx/tzxwriter.pas

@@ -39,6 +39,7 @@ type
   public
     constructor Create(OutStream : TStream);
     procedure AppendStandardSpeedDataBlock(const Buffer; Count: Word);
+    procedure AppendHeader(FileType: Byte; const FileName: string; DataBlockLength, Parameter1, Parameter2: Word);
     procedure AppendProgramFile(const FileName: string; AutostartLine, VarAreaOffset: Word; const Buffer; Count: Word);
     procedure AppendCodeFile(const FileName: string; StartAddress: Word; const Buffer; Count: Word);
   end;
@@ -68,33 +69,42 @@ begin
   FOutStream.Write(Buffer, Count);
 end;
 
-procedure TTZXWriter.AppendProgramFile(const FileName: string; AutostartLine,
-  VarAreaOffset: Word; const Buffer; Count: Word);
+procedure TTZXWriter.AppendHeader(FileType: Byte; const FileName: string;
+  DataBlockLength, Parameter1, Parameter2: Word);
 var
   HeaderBlock: array [0..18] of Byte;
   I: Integer;
   Checksum: Byte;
-  DataBlock: array of Byte;
 begin
   HeaderBlock[0] := 0;  { header }
-  HeaderBlock[1] := 0;  { Program file }
+  HeaderBlock[1] := FileType;
   { file name }
   for I := 1 to 10 do
     if I <= Length(FileName) then
       HeaderBlock[I + 1] := Ord(FileName[I])
     else
       HeaderBlock[I + 1] := Ord(' ');
-  HeaderBlock[12] := Byte(Count);
-  HeaderBlock[13] := Byte(Count shr 8);
-  HeaderBlock[14] := Byte(AutostartLine);
-  HeaderBlock[15] := Byte(AutostartLine shr 8);
-  HeaderBlock[16] := Byte(VarAreaOffset);
-  HeaderBlock[17] := Byte(VarAreaOffset shr 8);
+  HeaderBlock[12] := Byte(DataBlockLength);
+  HeaderBlock[13] := Byte(DataBlockLength shr 8);
+  HeaderBlock[14] := Byte(Parameter1);
+  HeaderBlock[15] := Byte(Parameter1 shr 8);
+  HeaderBlock[16] := Byte(Parameter2);
+  HeaderBlock[17] := Byte(Parameter2 shr 8);
   Checksum := 0;
   for I := 0 to 17 do
     Checksum := Checksum xor HeaderBlock[I];
   HeaderBlock[18] := Checksum;
   AppendStandardSpeedDataBlock(HeaderBlock, SizeOf(HeaderBlock));
+end;
+
+procedure TTZXWriter.AppendProgramFile(const FileName: string; AutostartLine,
+  VarAreaOffset: Word; const Buffer; Count: Word);
+var
+  I: Integer;
+  Checksum: Byte;
+  DataBlock: array of Byte;
+begin
+  AppendHeader(0, FileName, Count, AutostartLine, VarAreaOffset);
   SetLength(DataBlock, Count + 2);
   Move(Buffer, DataBlock[1], Count);
   DataBlock[0] := $FF;  { data }
@@ -108,30 +118,11 @@ end;
 procedure TTZXWriter.AppendCodeFile(const FileName: string; StartAddress: Word;
   const Buffer; Count: Word);
 var
-  HeaderBlock: array [0..18] of Byte;
   I: Integer;
   Checksum: Byte;
   DataBlock: array of Byte;
 begin
-  HeaderBlock[0] := 0;  { header }
-  HeaderBlock[1] := 3;  { Code file }
-  { file name }
-  for I := 1 to 10 do
-    if I <= Length(FileName) then
-      HeaderBlock[I + 1] := Ord(FileName[I])
-    else
-      HeaderBlock[I + 1] := Ord(' ');
-  HeaderBlock[12] := Byte(Count);
-  HeaderBlock[13] := Byte(Count shr 8);
-  HeaderBlock[14] := Byte(StartAddress);
-  HeaderBlock[15] := Byte(StartAddress shr 8);
-  HeaderBlock[16] := Byte(32768);
-  HeaderBlock[17] := Byte(32768 shr 8);
-  Checksum := 0;
-  for I := 0 to 17 do
-    Checksum := Checksum xor HeaderBlock[I];
-  HeaderBlock[18] := Checksum;
-  AppendStandardSpeedDataBlock(HeaderBlock, SizeOf(HeaderBlock));
+  AppendHeader(3, FileName, Count, StartAddress, 32768);
   SetLength(DataBlock, Count + 2);
   Move(Buffer, DataBlock[1], Count);
   DataBlock[0] := $FF;  { data }