date and time created 81/02/28 21:15:55 by wnj
[unix-history] / usr / src / old / flcopy / flcopy.c
CommitLineData
3fa8c87e 1static char *sccsid ="@(#)flcopy.c 4.3 (Berkeley) %G%";
f7e35322
BJ
2int floppydes;
3char *flopname = "/dev/floppy";
58bb1161
BJ
4long dsize = 77 * 26 * 128;
5int hflag;
6int rflag;
f7e35322
BJ
7
8main(argc,argv)
58bb1161 9register char **argv;
f7e35322
BJ
10{
11 static char buff[512];
58bb1161
BJ
12 register long count;
13 register startad = -26 * 128;
14 register int n, file; register char *cp;
f7e35322 15
3fa8c87e 16 while((cp = *++argv), --argc > 0) {
58bb1161
BJ
17 if(*cp++!='-') continue;
18 while(*cp) switch(*cp++) {
19 case 'h':
20 hflag++;
f7e35322 21 printf("Halftime!\n");
f7e35322 22 if((file = open("floppy",0))<0)
58bb1161
BJ
23 printf("failed to open floppy image, for reading\n"),
24 exit(1);
25 continue;
26 case 't':
3fa8c87e
BJ
27 if(*cp >= '0' && *cp <= '9')
28 dsize = atoi(cp);
29 else if(argc > 1) {
30 dsize = atoi(*++argv);
31 argc--;
32 } else dsize = 77;
33 if (dsize <= 0 || dsize > 77)
58bb1161 34 printf("Bad number of tracks\n"), exit(2);
3fa8c87e 35 dsize *= 26 * 128;
58bb1161
BJ
36 continue;
37 case 'r':
38 rflag++;
39 }
f7e35322 40 }
58bb1161
BJ
41 if(!hflag) {
42 file = creat("floppy",0666);
43 close(file);
44 file = open("floppy",2);
45 if(file < 0)
46 printf("failed to open floppy image"),
47 exit(1);
48 for(count = dsize; count > 0 ; count -= 512) {
f7e35322
BJ
49 n = count > 512 ? 512 : count ;
50 lread(startad,n,buff);
51 write(file,buff,n);
52 startad += 512;
58bb1161 53 }
f7e35322 54 }
58bb1161 55 if(rflag) exit(0);
f7e35322
BJ
56 printf("Change Floppy, Hit return when done.\n");
57 gets(buff);
58 lseek(file,0,0);
58bb1161 59 count = dsize; startad = -26 * 128;
f7e35322
BJ
60 for( ; count > 0 ; count -= 512) {
61 n = count > 512 ? 512 : count ;
62 read(file,buff,n);
63 lwrite(startad,n,buff);
64 startad += 512;
65 }
66}
67rt_init()
68{
69 static initized = 0;
70 int mode = 2;
71
72 if(initized) return;
58bb1161 73 if(rflag) mode = 0;
f7e35322
BJ
74 initized = 1;
75 if((floppydes = open(flopname,mode)) < 0) {
76 printf("Floppy open failed\n");
77 exit(1);
78 }
79}
80
81long trans(logical)
82register int logical;
83{
84 /* Logical to physical adress translation */
85 register int sector, bytes, track;
86
87 logical += 26 * 128;
88 bytes = (logical & 127);
89 logical >>= 7;
90 sector = logical % 26;
91 if(sector >= 13)
92 sector = sector *2 +1;
93 else
94 sector *= 2;
95 sector += 26 + ((track = (logical / 26)) - 1) * 6;
96 sector %= 26;
97 return( (((track *26) + sector) << 7) + bytes);
98}
99lread(startad,count,obuff)
100register startad, count;
101register char * obuff;
102{
103 long trans();
104 extern floppydes;
105 rt_init();
106 while( (count -= 128) >= 0) {
107 lseek(floppydes, trans(startad), 0);
108 read(floppydes,obuff,128);
109 obuff += 128;
110 startad += 128;
111 }
112}
113lwrite(startad,count,obuff)
114register startad, count;
115register char * obuff;
116{
117 long trans();
118 extern floppydes;
119 rt_init();
120 while( (count -= 128) >= 0) {
121 lseek(floppydes, trans(startad), 0);
122 write(floppydes,obuff,128);
123 obuff += 128;
124 startad += 128;
125 }
126}