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

typedef struct header_st {
        int magic; // 0xa55a5aa5
        int len;   // len of ver file
        int version; 
        int volume; //1
        int zero1;
        int a2c; //2c
        int zeros[5];
        int nfiles; //1
        int dirdepth; //1
        char dirname[64];
        int filestoprocess; //1
	char filename[56];
	int file_length;
	int file_crc;
        int magic1; // 0xa55a5aa5
        int ver_crc; // up to and including magic1
} header_type;

void wscpy(char *d, char *s) {
	while (*s) {
		*d++=*s++;
		d++;
        }
}
unsigned int crc32b(unsigned char *message, int len) {
	int i, j;
	unsigned int byte, crc, mask;

	i = 0;
	crc = 0xFFFFFFFF;
	while (len--) {
		byte = message[i];            // Get next byte.
		crc = crc ^ byte;
		for (j = 7; j >= 0; j--) {    // Do eight times.
			mask = -(crc & 1);
			crc = (crc >> 1) ^ (0xEDB88320 & mask);
		}
		i = i + 1;
	}
	return ~crc;
}

int crc16a(unsigned char * data_p, int len) {
    unsigned char x;
    unsigned short crc = 0xFFFF;

    while (len--){
        x = crc >> 8 ^ *data_p++;
        x ^= x>>4;
        crc = (crc << 8) ^ ((unsigned short)(x << 12)) ^ ((unsigned short)(x <<5)) ^ ((unsigned short)x);
    }
    return crc;
}


unsigned short crc16(const unsigned char *data, int len) { 
  unsigned short crc = 0xFFFF; 
  int i; 
  if (len) do { 
    crc ^= *data++; 
    for (i=0; i<8; i++) { 
      if (crc & 1) crc = (crc >> 1) ^ 0x8408; 
      else crc >>= 1; 
    } 
  } while (--len); 
  return(~crc); 
} 


int main(int argc, char *argv[]) {

	header_type h;
        FILE *fin,*fout;

	memset(&h, 0, sizeof(h));

        char *dir="OPN100";
	char *datfile="NA100OPN.DAT";

	if(argc>=2)
		datfile=argv[1];

	if(argc>=3)
                dir=argv[2];

	h.magic=0xa55a5aa5;
	h.len=sizeof(h);
	h.version=0x04000000;
	h.volume=1;
	h.a2c=0x2c;
	h.nfiles=1;
	h.dirdepth=1;
	wscpy(h.dirname,dir);
	h.filestoprocess=1;
	wscpy(h.filename,datfile);
	fin=fopen(datfile,"rb");
        fseek(fin, 0L, SEEK_END);
        h.file_length = ftell(fin);
        unsigned char *p=malloc(h.file_length);
        rewind(fin);
        fread(p,1,h.file_length,fin);
	h.file_crc=crc32b(p,h.file_length);
        h.magic1=0xa55a5aa5;
	h.ver_crc=crc32b((unsigned char *)&h, h.len-4);

	fout=fopen("NA090OPN.VER","wb");
	fwrite(&h,1,h.len,fout);
	fclose(fout);
}
