www.pudn.com > virtual_gameboy-0.8.8.zip > GBLIST.C


/** GameBoy Cartridge Lister/Tester **************************/   
/**                                                         **/
/**                         gblist.c                        **/
/**                                                         **/
/** This program will list and [optionally] test a group of **/
/** cartridges finding those which fail CRC or complement   **/
/** check, or have invalid size.                            **/
/**                                                         **/
/** Copyright (C) Marat Fayzullin 1996                      **/
/**     You are not allowed to distribute this software     **/
/**     commercially. Please, notify me, if you make any    **/
/**     changes to this file.                               **/
/*************************************************************/

#include 
#include 

typedef unsigned char byte;
typedef unsigned short word;

int CheckCRC=0,UseANSI=0,FixCRC=0;

void Error(char *File,char *Text)
{
  printf
  (
    "|%-20s|%s %-48s %s|\n",
    File,UseANSI? "\033[31m":"",Text,UseANSI? "\033[0m":""
  );
}

int main(int argc,char *argv[])
{
  static char *Types[] =
  { "R...","R..1","RW.1","RWB1","????","R..2","R.B2" };
  static char *RAMSizes[] =
  { " 0kB"," 2kB"," 8kB","32kB","    " };

  static byte Buf[0x4000];
  char S[15];
  FILE *F;
  int J,I,K;

  char Name[50],*Type,Comment[1024];
  word Checksum,Producer,RealCRC;
  byte Version,Complement,RealComp;
  int RAMSize,ROMBanks;

  if(argc<2)
  {
    fprintf(stderr,"GBLIST .GB File Processor by Marat Fayzullin\n");
    fprintf(stderr,"Usage: %s [-caf] files...\n", argv[0]);
    fprintf(stderr,"    -a - Use ANSI escape sequences for colors\n");
    fprintf(stderr,"    -c - Check CRC\n");
    fprintf(stderr,"    -f - Fix CRC\n");
    return(1);
  }

  CheckCRC=UseANSI=FixCRC=0;

  for(I=1;I' ')? Buf[I]:' ';
          Name[I-0x134]='\0';

          if((Buf[0x0147]<=7)&&(Buf[0x0147]!=4))
          {
            Type=Types[Buf[0x0147]];
            ROMBanks=2<0;I--)
              if(fread(Buf,1,0x4000,F)!=0x4000) break;
              else for(K=0;K<0x4000;K++) RealCRC+=Buf[K];

            if(I) strcat(Comment,"[File Too Short]");
            else
              if(fgetc(F)!=EOF) strcat(Comment,"File is too long. ");
              else
                if(Checksum!=RealCRC)
                  sprintf
                  (
                    Comment+strlen(Comment),
                    "Wrong CRC: %04X!=%04X.",
                    RealCRC,Checksum
                  );
          }

          /*** Printing out the information line ***/
          if(*Comment)
            printf
            (
              "|%-20s|%s %-48s %s|\n",
              argv[J],UseANSI? "\033[35m":"",Comment,UseANSI? "\033[0m":""
            );
          else       
            printf
            (
              "|%-20s| %-16s |%s|%3dkB|%4s|%04X|%2d|%04X-%02X|\n",
              argv[J],Name,Type,ROMBanks*16,S,Producer,Version,
              Checksum,Complement
            );
        }
        fclose(F);
      }

  puts("+--------------------+------------------+----+-----+----+----+--+-------+");
}