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