/[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 840 - (show 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 #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
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