xref: /csrg-svn/old/flcopy/flcopy.c (revision 13911)
113837Ssam #ifndef lint
2*13911Ssam static char *sccsid ="@(#)flcopy.c	4.6 (Berkeley) 07/10/83";
313837Ssam #endif
41016Sbill 
513837Ssam #include <sys/file.h>
613837Ssam 
75077Ssam int	floppydes;
85077Ssam char	*flopname = "/dev/floppy";
95077Ssam long	dsize = 77 * 26 * 128;
105077Ssam int	hflag;
115077Ssam int	rflag;
125077Ssam 
135077Ssam main(argc, argv)
145077Ssam 	register char **argv;
151016Sbill {
161016Sbill 	static char buff[512];
171579Sbill 	register long count;
181579Sbill 	register startad = -26 * 128;
195077Ssam 	register int n, file;
205077Ssam 	register char *cp;
211016Sbill 
225077Ssam 	while ((cp = *++argv), --argc > 0) {
2313837Ssam 		while (*cp) {
245077Ssam 			switch(*cp++) {
255077Ssam 
2613837Ssam 			case '-':
2713837Ssam 				continue;
2813837Ssam 
295077Ssam 			case 'h':
305077Ssam 				hflag++;
315077Ssam 				printf("Halftime!\n");
3213837Ssam 				if ((file = open("floppy", 0)) < 0) {
3313837Ssam 					printf("can't open \"floppy\"\n");
3413837Ssam 					exit(1);
3513837Ssam 				}
365077Ssam 				continue;
375077Ssam 
3813837Ssam 			case 'f':
3913837Ssam 				if (argc < 1) {
4013837Ssam 					printf(
4113837Ssam 					    "flcopy: -f: missing file name\n");
4213837Ssam 					exit(1);
4313837Ssam 				}
4413837Ssam 				flopname = *++argv;
4513837Ssam 				argc--;
4613837Ssam 				break;
4713837Ssam 
485077Ssam 			case 't':
495077Ssam 				if (*cp >= '0' && *cp <= '9')
505077Ssam 					dsize = atoi(cp);
515077Ssam 				else if (argc > 1) {
525077Ssam 					dsize = atoi(*++argv);
535077Ssam 					argc--;
545077Ssam 				} else
555077Ssam 					dsize = 77;
565077Ssam 				if (dsize <= 0 || dsize > 77) {
575077Ssam 					printf("Bad number of tracks\n");
585077Ssam 					exit(2);
595077Ssam 				}
605077Ssam 				dsize *= 26 * 128;
615077Ssam 				continue;
625077Ssam 
635077Ssam 			case 'r':
645077Ssam 				rflag++;
655077Ssam 			}
6613837Ssam 			break;
6713837Ssam 		}
681016Sbill 	}
695077Ssam 	if (!hflag) {
7013837Ssam 		file = open("floppy", O_RDWR|O_CREAT|O_TRUNC, 0666);
715077Ssam 		if (file < 0) {
725077Ssam 			printf("can't open \"floppy\"\n");
735077Ssam 			exit(1);
745077Ssam 		}
755077Ssam 		for (count = dsize; count > 0 ; count -= 512) {
765077Ssam 			n = count > 512 ? 512 : count;
775077Ssam 			lread(startad, n, buff);
785077Ssam 			write(file, buff, n);
795077Ssam 			startad += 512;
805077Ssam 		}
811016Sbill 	}
825077Ssam 	if (rflag)
835077Ssam 		exit(0);
841016Sbill 	printf("Change Floppy, Hit return when done.\n");
851016Sbill 	gets(buff);
865077Ssam 	lseek(file, 0, 0);
875077Ssam 	count = dsize;
885077Ssam 	startad = -26 * 128;
895077Ssam 	for ( ; count > 0 ; count -= 512) {
905077Ssam 		n = count > 512 ? 512 : count;
915077Ssam 		read(file, buff, n);
925077Ssam 		lwrite(startad, n, buff);
931016Sbill 		startad += 512;
941016Sbill 	}
95*13911Ssam 	exit(0);
961016Sbill }
975077Ssam 
981016Sbill rt_init()
991016Sbill {
1001016Sbill 	static initized = 0;
1011016Sbill 	int mode = 2;
1021016Sbill 
1035077Ssam 	if (initized)
1045077Ssam 		return;
1055077Ssam 	if (rflag)
1065077Ssam 		mode = 0;
1071016Sbill 	initized = 1;
1085077Ssam 	if ((floppydes = open(flopname, mode)) < 0) {
1091016Sbill 		printf("Floppy open failed\n");
1101016Sbill 		exit(1);
1111016Sbill 	}
1121016Sbill }
1135077Ssam 
1145077Ssam /*
1155077Ssam  * Logical to physical adress translation
1165077Ssam  */
1175077Ssam long
1185077Ssam trans(logical)
1195077Ssam 	register int logical;
1201016Sbill {
1211016Sbill 	register int sector, bytes, track;
1221016Sbill 
1231016Sbill 	logical += 26 * 128;
1241016Sbill 	bytes = (logical & 127);
1251016Sbill 	logical >>= 7;
1261016Sbill 	sector = logical % 26;
1275077Ssam 	if (sector >= 13)
1285077Ssam 		sector = sector*2 +1;
1291016Sbill 	else
1301016Sbill 		sector *= 2;
1311016Sbill 	sector += 26 + ((track = (logical / 26)) - 1) * 6;
1321016Sbill 	sector %= 26;
1335077Ssam 	return ((((track *26) + sector) << 7) + bytes);
1341016Sbill }
1355077Ssam 
1365077Ssam lread(startad, count, obuff)
1375077Ssam 	register startad, count;
1385077Ssam 	register char *obuff;
1391016Sbill {
1401016Sbill 	long trans();
1411016Sbill 	extern floppydes;
1425077Ssam 
1431016Sbill 	rt_init();
1445077Ssam 	while ((count -= 128) >= 0) {
1455077Ssam 		lseek(floppydes, trans(startad), 0);
1465077Ssam 		read(floppydes, obuff, 128);
1475077Ssam 		obuff += 128;
1485077Ssam 		startad += 128;
1495077Ssam 	}
1501016Sbill }
1515077Ssam 
1525077Ssam lwrite(startad, count, obuff)
1535077Ssam 	register startad, count;
1545077Ssam 	register char *obuff;
1551016Sbill {
1561016Sbill 	long trans();
1571016Sbill 	extern floppydes;
1585077Ssam 
1591016Sbill 	rt_init();
1605077Ssam 	while ((count -= 128) >= 0) {
1615077Ssam 		lseek(floppydes, trans(startad), 0);
1625077Ssam 		write(floppydes, obuff, 128);
1635077Ssam 		obuff += 128;
1645077Ssam 		startad += 128;
1655077Ssam 	}
1661016Sbill }
167