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