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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1190 - (show annotations)
Thu Sep 18 20:41:37 2014 UTC (5 years, 4 months ago) by Jylam
File MIME type: text/plain
File size: 5299 byte(s)
Fix gcc warnings

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

  ViewVC Help
Powered by ViewVC 1.1.26