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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1270 - (hide annotations)
Sun May 10 00:02:53 2015 UTC (4 years, 7 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 dbug 21 #include <stdio.h>
2 mmu_man 1270 #include <stdint.h>
3 mmu_man 840 #include <stdlib.h>
4     #include <string.h>
5 dbug 21 FILE *fd;
6 mmu_man 1270 char *bigbuf;
7 dbug 21 char header[256];
8     char trackbuf[6400];
9 mmu_man 1270 int32_t sides, tracks, sectors, geometry=1;
10 dbug 21 int gap1,gap2,gap3;
11     char old_signature[]="ORICDISK";
12     char new_signature[]="MFM_DISK";
13    
14 Jylam 1190 void init_track(int n);
15     void compute_crc(unsigned char *ptr,int count);
16 dbug 21
17 mmu_man 1270 /* TODO:Fix endianness! */
18    
19 Jylam 1190 int main(int argc,char *argv[])
20 dbug 21 {
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 1270 exit(EXIT_FAILURE);
28 dbug 21 }
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 1270 exit(EXIT_FAILURE);
33 dbug 21 }
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 1270 exit(EXIT_FAILURE);
38 dbug 21 }
39 mmu_man 1270 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 21 fread(header+20,256-20,1,fd);
43 mmu_man 1270 bigbuf = malloc(sides*tracks*sectors*256);
44     if (bigbuf==NULL) {
45     printf("Unable to allocate memory\n");
46     exit(EXIT_FAILURE);
47     }
48 dbug 21 fread(bigbuf,sides*tracks*sectors,256,fd);
49     fseek(fd,0,SEEK_SET);
50 mmu_man 1270 printf("read old.\n");
51 dbug 21
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 1270 exit(EXIT_FAILURE);
62 dbug 21 }
63     init_track(sectors);
64    
65 mmu_man 1270 printf("writing header...\n");
66 dbug 21 fwrite(new_signature,8,1,fd);
67 mmu_man 1270 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 21 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 1270 printf("writing size %d track %d sector %d...\n", s, t, i);
77 dbug 21 trackbuf[offset+4]=t;
78     trackbuf[offset+5]=s;
79     trackbuf[offset+6]=i+1;
80     trackbuf[offset+7]=1;
81 mmu_man 1270 compute_crc(trackbuf+offset,4+4);
82 dbug 21 offset+=4+6;
83     offset+=gap2;
84     memcpy(trackbuf+offset+4,bigbuf+((s*tracks+t)*sectors+i)*256,256);
85 mmu_man 1270 compute_crc(trackbuf+offset,4+256);
86 dbug 21 offset+=256+6;
87     offset+=gap3;
88     }
89     fwrite(trackbuf,6400,1,fd);
90     }
91 mmu_man 1270 printf("done.\n");
92     free(bigbuf);
93     return EXIT_SUCCESS;
94 dbug 21 }
95    
96 Jylam 1190 void init_track(int n)
97 dbug 21 {
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 mmu_man 1270 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 dbug 21 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
134 mmu_man 1270 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
135 dbug 21 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
136 mmu_man 1270 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
137 dbug 21 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 mmu_man 1270
153     void compute_crc(unsigned char *ptr,int count)
154 dbug 21 {
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