/[projet1]/public/pc/tools/osdk/main/old2mfm/sources/old2mfm.c
Defence Force logotype

Contents of /public/pc/tools/osdk/main/old2mfm/sources/old2mfm.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 908 - (show annotations)
Sun Jan 20 18:45:23 2013 UTC (6 years, 9 months ago) by mmu_man
File MIME type: text/plain
File size: 5661 byte(s)
Some preventive fixes

* Make sure we use types of intended size when reading into variables
* Use malloc() to allocate the buffer just in case, with proper error handling
* Return EXIT_SUCCESS on exit
* Some temporary debug output

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

  ViewVC Help
Powered by ViewVC 1.1.26