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