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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 840 - (hide annotations)
Tue Sep 18 13:34:14 2012 UTC (7 years, 2 months ago) by mmu_man
File MIME type: text/plain
File size: 5166 byte(s)
Fix warnings.

1 dbug 21 #include <stdio.h>
2 mmu_man 840 #include <stdlib.h>
3     #include <string.h>
4 dbug 21 FILE *fd;
5     char bigbuf[1024*1024];
6     char header[256];
7     char trackbuf[6400];
8     int sides, tracks, sectors, geometry=1;
9     int gap1,gap2,gap3;
10     char old_signature[]="ORICDISK";
11     char new_signature[]="MFM_DISK";
12    
13    
14     main(int argc,char *argv[])
15     {
16     int i,s,t,offset;
17    
18     printf("Old -> MFM v1.2\n");
19     if (argc!=2) {
20     printf("Usage: oric2mfm <diskimage>\n");
21     printf("(converts old Euphoric disk image format to new MFM format)\n");
22     exit(1);
23     }
24     fd=fopen(argv[1],"r+b");
25     if (fd==NULL) {
26     printf("Unable to open %s for read/write operation\n",argv[1]);
27     exit(1);
28     }
29     fread(header,8,1,fd);
30     if (strncmp(header,old_signature,8)!=0) {
31     printf("%s is not an old disk image\n",argv[1]);
32     exit(1);
33     }
34     fread(&sides,1,4,fd); fread(&tracks,1,4,fd); fread(&sectors,1,4,fd);
35     fread(header+20,256-20,1,fd);
36     fread(bigbuf,sides*tracks*sectors,256,fd);
37     fseek(fd,0,SEEK_SET);
38    
39     switch (sectors) {
40     case 15: case 16: case 17:
41     gap1=72; gap2=34; gap3=50;
42     break;
43     case 18:
44     gap1=12; gap2=34; gap3=46;
45     break;
46     default:
47     printf("unrealistic sectors per track number\n");
48     exit(1);
49     }
50     init_track(sectors);
51    
52     fwrite(new_signature,8,1,fd);
53     fwrite(&sides,1,4,fd); fwrite(&tracks,1,4,fd); fwrite(&geometry,1,4,fd);
54     fwrite(header+20,256-20,1,fd);
55    
56     for(s=0;s<sides;s++)
57     for(t=0;t<tracks;t++) {
58     offset=gap1;
59     for(i=0;i<sectors;i++) {
60     trackbuf[offset+4]=t;
61     trackbuf[offset+5]=s;
62     trackbuf[offset+6]=i+1;
63     trackbuf[offset+7]=1;
64     compute_crc(trackbuf+offset,4+4);
65     offset+=4+6;
66     offset+=gap2;
67     memcpy(trackbuf+offset+4,bigbuf+((s*tracks+t)*sectors+i)*256,256);
68     compute_crc(trackbuf+offset,4+256);
69     offset+=256+6;
70     offset+=gap3;
71     }
72     fwrite(trackbuf,6400,1,fd);
73     }
74     }
75    
76     init_track(int n)
77     {
78     int i,j,offset=0;
79    
80     for (i=0;i<gap1-12;i++) trackbuf[offset++]=0x4E;
81     for (j=0;j<n;j++) {
82     for (i=0;i<12;i++) trackbuf[offset++]=0;
83     for (i=0;i<3;i++) trackbuf[offset++]=0xA1;
84     trackbuf[offset++]=0xFE;
85     for (i=0;i<6;i++) offset++;
86     /* for (i=0;i<gap2-12;i++) trackbuf[offset++]=0x4E;
87     */ for (i=0;i<gap2-12;i++) trackbuf[offset++]=0x22;
88     for (i=0;i<12;i++) trackbuf[offset++]=0;
89     for (i=0;i<3;i++) trackbuf[offset++]=0xA1;
90     trackbuf[offset++]=0xFB;
91     for (i=0;i<258;i++) offset++;
92     for (i=0;i<gap3-12;i++) trackbuf[offset++]=0x4E;
93     }
94     while (offset<6400) trackbuf[offset++]=0x4E;
95     }
96    
97     unsigned int crctab[256] =
98     {
99     0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
100     0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
101     0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
102     0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
103     0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
104     0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
105     0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
106     0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
107     0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
108     0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
109     0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
110     0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
111     0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
112     0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
113     0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
114     0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
115     0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
116     0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
117     0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
118     0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
119     0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
120     0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
121     0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
122     0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
123     0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
124     0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
125     0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
126     0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
127     0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
128     0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
129     0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
130     0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
131     };
132    
133     compute_crc(unsigned char *ptr,int count)
134     {
135     int i;
136     unsigned short crc=0xFFFF,byte;
137     for (i=0;i<count;i++) {
138     byte= *ptr++;
139     crc=(crc<<8)^crctab[(crc>>8)^byte];
140     }
141     *ptr++=crc>>8;
142     *ptr++=crc&0xFF;
143     }

  ViewVC Help
Powered by ViewVC 1.1.26