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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1278 - (hide annotations)
Fri May 29 18:10:35 2015 UTC (4 years, 6 months ago) by mmu_man
File MIME type: text/plain
File size: 5780 byte(s)
old2mfm: comment out debug printfs

1 dbug 906 #include <stdio.h>
2 mmu_man 908 #include <stdint.h>
3     #include <stdlib.h>
4     #include <string.h>
5 dbug 906 FILE *fd;
6 mmu_man 908 char *bigbuf;
7 dbug 906 char header[256];
8     char trackbuf[6400];
9 mmu_man 908 int32_t sides, tracks, sectors, geometry=1;
10 dbug 906 int gap1,gap2,gap3;
11     char old_signature[]="ORICDISK";
12     char new_signature[]="MFM_DISK";
13    
14 dbug 1045 void init_track(int n);
15     void compute_crc(unsigned char *ptr,int count);
16    
17 mmu_man 908 /* TODO:Fix endianness! */
18 dbug 906
19 mmu_man 908 int main(int argc,char *argv[])
20 dbug 906 {
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 mmu_man 908 exit(EXIT_FAILURE);
28 dbug 906 }
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 mmu_man 908 exit(EXIT_FAILURE);
33 dbug 906 }
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 mmu_man 908 exit(EXIT_FAILURE);
38 dbug 906 }
39 mmu_man 908 fread(&sides,1,sizeof(int32_t),fd);
40     fread(&tracks,1,sizeof(int32_t),fd);
41     fread(&sectors,1,sizeof(int32_t),fd);
42 dbug 906 fread(header+20,256-20,1,fd);
43 mmu_man 908 bigbuf = malloc(sides*tracks*sectors*256);
44     if (bigbuf==NULL) {
45     printf("Unable to allocate memory\n");
46     exit(EXIT_FAILURE);
47     }
48 dbug 906 fread(bigbuf,sides*tracks*sectors,256,fd);
49     fseek(fd,0,SEEK_SET);
50 mmu_man 1278 /*printf("read old.\n");*/
51 dbug 906
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 mmu_man 908 exit(EXIT_FAILURE);
62 dbug 906 }
63     init_track(sectors);
64    
65 mmu_man 1278 /*printf("writing header...\n");*/
66 dbug 906 fwrite(new_signature,8,1,fd);
67 mmu_man 908 fwrite(&sides,1,sizeof(int32_t),fd);
68     fwrite(&tracks,1,sizeof(int32_t),fd);
69     fwrite(&geometry,1,sizeof(int32_t),fd);
70 dbug 906 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 mmu_man 1278 /*printf("writing size %d track %d sector %d...\n", s, t, i);*/
77 dbug 906 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 mmu_man 1278 /*printf("done.\n");*/
92 mmu_man 908 free(bigbuf);
93     return EXIT_SUCCESS;
94 dbug 906 }
95    
96 dbug 1045 void init_track(int n)
97 dbug 906 {
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 dbug 1045 void compute_crc(unsigned char *ptr,int count)
154 dbug 906 {
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