|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid ="@(#)flcopy.c 4.6 (Berkeley) 7/10/83"; ! 3: #endif ! 4: ! 5: #include <sys/file.h> ! 6: ! 7: int floppydes; ! 8: char *flopname = "/dev/floppy"; ! 9: long dsize = 77 * 26 * 128; ! 10: int hflag; ! 11: int rflag; ! 12: ! 13: main(argc, argv) ! 14: register char **argv; ! 15: { ! 16: static char buff[512]; ! 17: register long count; ! 18: register startad = -26 * 128; ! 19: register int n, file; ! 20: register char *cp; ! 21: ! 22: while ((cp = *++argv), --argc > 0) { ! 23: while (*cp) { ! 24: switch(*cp++) { ! 25: ! 26: case '-': ! 27: continue; ! 28: ! 29: case 'h': ! 30: hflag++; ! 31: printf("Halftime!\n"); ! 32: if ((file = open("floppy", 0)) < 0) { ! 33: printf("can't open \"floppy\"\n"); ! 34: exit(1); ! 35: } ! 36: continue; ! 37: ! 38: case 'f': ! 39: if (argc < 1) { ! 40: printf( ! 41: "flcopy: -f: missing file name\n"); ! 42: exit(1); ! 43: } ! 44: flopname = *++argv; ! 45: argc--; ! 46: break; ! 47: ! 48: case 't': ! 49: if (*cp >= '0' && *cp <= '9') ! 50: dsize = atoi(cp); ! 51: else if (argc > 1) { ! 52: dsize = atoi(*++argv); ! 53: argc--; ! 54: } else ! 55: dsize = 77; ! 56: if (dsize <= 0 || dsize > 77) { ! 57: printf("Bad number of tracks\n"); ! 58: exit(2); ! 59: } ! 60: dsize *= 26 * 128; ! 61: continue; ! 62: ! 63: case 'r': ! 64: rflag++; ! 65: } ! 66: break; ! 67: } ! 68: } ! 69: if (!hflag) { ! 70: file = open("floppy", O_RDWR|O_CREAT|O_TRUNC, 0666); ! 71: if (file < 0) { ! 72: printf("can't open \"floppy\"\n"); ! 73: exit(1); ! 74: } ! 75: for (count = dsize; count > 0 ; count -= 512) { ! 76: n = count > 512 ? 512 : count; ! 77: lread(startad, n, buff); ! 78: write(file, buff, n); ! 79: startad += 512; ! 80: } ! 81: } ! 82: if (rflag) ! 83: exit(0); ! 84: printf("Change Floppy, Hit return when done.\n"); ! 85: gets(buff); ! 86: lseek(file, 0, 0); ! 87: count = dsize; ! 88: startad = -26 * 128; ! 89: for ( ; count > 0 ; count -= 512) { ! 90: n = count > 512 ? 512 : count; ! 91: read(file, buff, n); ! 92: lwrite(startad, n, buff); ! 93: startad += 512; ! 94: } ! 95: exit(0); ! 96: } ! 97: ! 98: rt_init() ! 99: { ! 100: static initized = 0; ! 101: int mode = 2; ! 102: ! 103: if (initized) ! 104: return; ! 105: if (rflag) ! 106: mode = 0; ! 107: initized = 1; ! 108: if ((floppydes = open(flopname, mode)) < 0) { ! 109: printf("Floppy open failed\n"); ! 110: exit(1); ! 111: } ! 112: } ! 113: ! 114: /* ! 115: * Logical to physical adress translation ! 116: */ ! 117: long ! 118: trans(logical) ! 119: register int logical; ! 120: { ! 121: register int sector, bytes, track; ! 122: ! 123: logical += 26 * 128; ! 124: bytes = (logical & 127); ! 125: logical >>= 7; ! 126: sector = logical % 26; ! 127: if (sector >= 13) ! 128: sector = sector*2 +1; ! 129: else ! 130: sector *= 2; ! 131: sector += 26 + ((track = (logical / 26)) - 1) * 6; ! 132: sector %= 26; ! 133: return ((((track *26) + sector) << 7) + bytes); ! 134: } ! 135: ! 136: lread(startad, count, obuff) ! 137: register startad, count; ! 138: register char *obuff; ! 139: { ! 140: long trans(); ! 141: extern floppydes; ! 142: ! 143: rt_init(); ! 144: while ((count -= 128) >= 0) { ! 145: lseek(floppydes, trans(startad), 0); ! 146: read(floppydes, obuff, 128); ! 147: obuff += 128; ! 148: startad += 128; ! 149: } ! 150: } ! 151: ! 152: lwrite(startad, count, obuff) ! 153: register startad, count; ! 154: register char *obuff; ! 155: { ! 156: long trans(); ! 157: extern floppydes; ! 158: ! 159: rt_init(); ! 160: while ((count -= 128) >= 0) { ! 161: lseek(floppydes, trans(startad), 0); ! 162: write(floppydes, obuff, 128); ! 163: obuff += 128; ! 164: startad += 128; ! 165: } ! 166: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.