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

  ViewVC Help
Powered by ViewVC 1.1.26