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