#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

typedef unsigned int uint;
typedef unsigned long ulong;

uint rewrite(FILE *FO,FILE *FI,uint Length,uint Sum);

char WRERROR[]="Can't open %s for output!\n";

void main(int argc,char **argv)
{
  FILE *FI,*FO;
  ulong Length;
  uint FN,Type,C,Sum;
  char Name[80];

  if(argc!=2)
  {
    puts("\nBUTCHER  by  Marat Fayzullin");
    puts("Copyright by FMS  v.1.1 1994");
    puts("USAGE: butcher <filename.zx>\n");
    exit(1);
  }

  if(!(FI=fopen(argv[1],"rb")))
  { printf("Can't open %s for input!\n",argv[1]);exit(1); }

  for(FN=0;(C=fgetc(FI))<256;FN++)
  {
    Length=C+256*fgetc(FI)+2;
    Sum=Type=fgetc(FI);
    
    if(!Type)
    {
      sprintf(Name,"%u.header",FN);
      if(!(FO=fopen(Name,"wb")))
      { printf(WRERROR,FN);fclose(FI);exit(1); }
      printf("[00h] Header block %s [%lu]\n",Name,Length);
      fputc(Type,FO);
      Sum=rewrite(FO,FI,17,Sum);
      fputc(C=fgetc(FI),FO);
      rewrite(FO,FI,Length-19,0);
    }
    else
    {
      sprintf(Name,"%u.bytes",FN);
      if(!(FO=fopen(Name,"wb")))
      { printf(WRERROR,FN);fclose(FI);exit(1); }
      printf("[%Xh] Data block %s [%lu]\n",Type,Name,Length);
      fputc(Type,FO);
      Sum=rewrite(FO,FI,Length-2,Sum);
      C=fgetc(FI);fputc(Sum,FO);
    }
    if(Sum==C^Type) printf("CRC=%X\n",Sum);
    else printf("CRC error: %X!=%X\n",C^Type,Sum);
    fclose(FO);
  }
  fclose(FI);
}

uint rewrite(FILE *FO,FILE *FI,uint Length,uint Sum)
{
  uint C;

  while(Length)
  { fputc(C=fgetc(FI),FO);Sum^=C;Length--; }
  return(Sum&0xFF);
}

