/[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 1270 - (show annotations)
Sun May 10 00:02:53 2015 UTC (4 years, 4 months ago) by mmu_man
File MIME type: text/plain
File size: 5747 byte(s)
old2mfm: sync with the other copy

Is there any reason there are 2 version of this around anyway???

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

  ViewVC Help
Powered by ViewVC 1.1.26