/[projet1]/public/pc/tools/oric/old2mfm/old2mfm.c
Defence Force logotype

Diff of /public/pc/tools/oric/old2mfm/old2mfm.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1269 by Jylam, Thu Sep 18 20:41:37 2014 UTC revision 1270 by mmu_man, Sun May 10 00:02:53 2015 UTC
# Line 1  Line 1 
1  #include <stdio.h>  #include <stdio.h>
2    #include <stdint.h>
3  #include <stdlib.h>  #include <stdlib.h>
4  #include <string.h>  #include <string.h>
5  FILE *fd;  FILE *fd;
6  char bigbuf[1024*1024];  char *bigbuf;
7  char header[256];  char header[256];
8  char trackbuf[6400];  char trackbuf[6400];
9  int sides, tracks, sectors, geometry=1;  int32_t sides, tracks, sectors, geometry=1;
10  int gap1,gap2,gap3;  int gap1,gap2,gap3;
11  char old_signature[]="ORICDISK";  char old_signature[]="ORICDISK";
12  char new_signature[]="MFM_DISK";  char new_signature[]="MFM_DISK";
# Line 13  char new_signature[]="MFM_DISK"; Line 14  char new_signature[]="MFM_DISK";
14  void init_track(int n);  void init_track(int n);
15  void compute_crc(unsigned char *ptr,int count);  void compute_crc(unsigned char *ptr,int count);
16    
17    /* TODO:Fix endianness! */
18    
19  int main(int argc,char *argv[])  int main(int argc,char *argv[])
20  {  {
21          int i,s,t,offset;          int i,s,t,offset;
# Line 21  int main(int argc,char *argv[]) Line 24  int main(int argc,char *argv[])
24          if (argc!=2) {          if (argc!=2) {
25                  printf("Usage: oric2mfm <diskimage>\n");                  printf("Usage: oric2mfm <diskimage>\n");
26                  printf("(converts old Euphoric disk image format to new MFM format)\n");                  printf("(converts old Euphoric disk image format to new MFM format)\n");
27                  exit(1);                  exit(EXIT_FAILURE);
28          }          }
29          fd=fopen(argv[1],"r+b");          fd=fopen(argv[1],"r+b");
30          if (fd==NULL) {          if (fd==NULL) {
31                  printf("Unable to open %s for read/write operation\n",argv[1]);                  printf("Unable to open %s for read/write operation\n",argv[1]);
32                  exit(1);                  exit(EXIT_FAILURE);
33          }          }
34          fread(header,8,1,fd);          fread(header,8,1,fd);
35          if (strncmp(header,old_signature,8)!=0) {          if (strncmp(header,old_signature,8)!=0) {
36                  printf("%s is not an old disk image\n",argv[1]);                  printf("%s is not an old disk image\n",argv[1]);
37                  exit(1);                  exit(EXIT_FAILURE);
38          }          }
39          fread(&sides,1,4,fd); fread(&tracks,1,4,fd); fread(&sectors,1,4,fd);          fread(&sides,1,sizeof(int32_t),fd);
40            fread(&tracks,1,sizeof(int32_t),fd);
41            fread(&sectors,1,sizeof(int32_t),fd);
42          fread(header+20,256-20,1,fd);          fread(header+20,256-20,1,fd);
43            bigbuf = malloc(sides*tracks*sectors*256);
44            if (bigbuf==NULL) {
45                    printf("Unable to allocate memory\n");
46                    exit(EXIT_FAILURE);
47            }
48          fread(bigbuf,sides*tracks*sectors,256,fd);          fread(bigbuf,sides*tracks*sectors,256,fd);
49          fseek(fd,0,SEEK_SET);          fseek(fd,0,SEEK_SET);
50    printf("read old.\n");
51    
52          switch (sectors) {          switch (sectors) {
53                  case 15: case 16: case 17:                  case 15: case 16: case 17:
# Line 47  int main(int argc,char *argv[]) Line 58  int main(int argc,char *argv[])
58                          break;                          break;
59                  default:                  default:
60                          printf("unrealistic sectors per track number\n");                          printf("unrealistic sectors per track number\n");
61                          exit(1);                          exit(EXIT_FAILURE);
62          }          }
63          init_track(sectors);          init_track(sectors);
64    
65    printf("writing header...\n");
66          fwrite(new_signature,8,1,fd);          fwrite(new_signature,8,1,fd);
67          fwrite(&sides,1,4,fd); fwrite(&tracks,1,4,fd); fwrite(&geometry,1,4,fd);          fwrite(&sides,1,sizeof(int32_t),fd);
68            fwrite(&tracks,1,sizeof(int32_t),fd);
69            fwrite(&geometry,1,sizeof(int32_t),fd);
70          fwrite(header+20,256-20,1,fd);          fwrite(header+20,256-20,1,fd);
71    
72          for(s=0;s<sides;s++)          for(s=0;s<sides;s++)
73            for(t=0;t<tracks;t++) {            for(t=0;t<tracks;t++) {
74              offset=gap1;              offset=gap1;
75              for(i=0;i<sectors;i++) {              for(i=0;i<sectors;i++) {
76    printf("writing size %d track %d sector %d...\n", s, t, i);
77                trackbuf[offset+4]=t;                trackbuf[offset+4]=t;
78                trackbuf[offset+5]=s;                trackbuf[offset+5]=s;
79                trackbuf[offset+6]=i+1;                trackbuf[offset+6]=i+1;
80                trackbuf[offset+7]=1;                trackbuf[offset+7]=1;
81                compute_crc((unsigned char*)(trackbuf+offset),4+4);                compute_crc(trackbuf+offset,4+4);
82                offset+=4+6;                offset+=4+6;
83                offset+=gap2;                offset+=gap2;
84                memcpy(trackbuf+offset+4,bigbuf+((s*tracks+t)*sectors+i)*256,256);                memcpy(trackbuf+offset+4,bigbuf+((s*tracks+t)*sectors+i)*256,256);
85                compute_crc((unsigned char*)(trackbuf+offset),4+256);                compute_crc(trackbuf+offset,4+256);
86                offset+=256+6;                offset+=256+6;
87                offset+=gap3;                offset+=gap3;
88              }              }
89              fwrite(trackbuf,6400,1,fd);              fwrite(trackbuf,6400,1,fd);
90            }            }
91      return 0;  printf("done.\n");
92            free(bigbuf);
93            return EXIT_SUCCESS;
94  }  }
95    
96  void init_track(int n)  void init_track(int n)
# Line 109  unsigned int crctab[256] = Line 126  unsigned int crctab[256] =
126          0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,          0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
127          0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,          0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
128          0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,          0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
129          0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,          0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
130          0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,          0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
131          0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,          0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
132          0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,          0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
133          0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,          0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
134          0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,          0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
135          0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,          0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
136          0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,          0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
137          0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,          0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
138          0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,          0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
139          0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,          0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
# Line 132  unsigned int crctab[256] = Line 149  unsigned int crctab[256] =
149          0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,          0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
150          0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0          0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
151  };  };
152            
153  void compute_crc(unsigned char *ptr, int count)  void compute_crc(unsigned char *ptr,int count)
154  {  {
155          int i;          int i;
156          unsigned short crc=0xFFFF,byte;          unsigned short crc=0xFFFF,byte;

Legend:
Removed from v.1269  
changed lines
  Added in v.1270

  ViewVC Help
Powered by ViewVC 1.1.26