Commit | Line | Data |
---|---|---|
3fa8c87e | 1 | static char *sccsid ="@(#)flcopy.c 4.3 (Berkeley) %G%"; |
f7e35322 BJ |
2 | int floppydes; |
3 | char *flopname = "/dev/floppy"; | |
58bb1161 BJ |
4 | long dsize = 77 * 26 * 128; |
5 | int hflag; | |
6 | int rflag; | |
f7e35322 BJ |
7 | |
8 | main(argc,argv) | |
58bb1161 | 9 | register char **argv; |
f7e35322 BJ |
10 | { |
11 | static char buff[512]; | |
58bb1161 BJ |
12 | register long count; |
13 | register startad = -26 * 128; | |
14 | register int n, file; register char *cp; | |
f7e35322 | 15 | |
3fa8c87e | 16 | while((cp = *++argv), --argc > 0) { |
58bb1161 BJ |
17 | if(*cp++!='-') continue; |
18 | while(*cp) switch(*cp++) { | |
19 | case 'h': | |
20 | hflag++; | |
f7e35322 | 21 | printf("Halftime!\n"); |
f7e35322 | 22 | if((file = open("floppy",0))<0) |
58bb1161 BJ |
23 | printf("failed to open floppy image, for reading\n"), |
24 | exit(1); | |
25 | continue; | |
26 | case 't': | |
3fa8c87e BJ |
27 | if(*cp >= '0' && *cp <= '9') |
28 | dsize = atoi(cp); | |
29 | else if(argc > 1) { | |
30 | dsize = atoi(*++argv); | |
31 | argc--; | |
32 | } else dsize = 77; | |
33 | if (dsize <= 0 || dsize > 77) | |
58bb1161 | 34 | printf("Bad number of tracks\n"), exit(2); |
3fa8c87e | 35 | dsize *= 26 * 128; |
58bb1161 BJ |
36 | continue; |
37 | case 'r': | |
38 | rflag++; | |
39 | } | |
f7e35322 | 40 | } |
58bb1161 BJ |
41 | if(!hflag) { |
42 | file = creat("floppy",0666); | |
43 | close(file); | |
44 | file = open("floppy",2); | |
45 | if(file < 0) | |
46 | printf("failed to open floppy image"), | |
47 | exit(1); | |
48 | for(count = dsize; count > 0 ; count -= 512) { | |
f7e35322 BJ |
49 | n = count > 512 ? 512 : count ; |
50 | lread(startad,n,buff); | |
51 | write(file,buff,n); | |
52 | startad += 512; | |
58bb1161 | 53 | } |
f7e35322 | 54 | } |
58bb1161 | 55 | if(rflag) exit(0); |
f7e35322 BJ |
56 | printf("Change Floppy, Hit return when done.\n"); |
57 | gets(buff); | |
58 | lseek(file,0,0); | |
58bb1161 | 59 | count = dsize; startad = -26 * 128; |
f7e35322 BJ |
60 | for( ; count > 0 ; count -= 512) { |
61 | n = count > 512 ? 512 : count ; | |
62 | read(file,buff,n); | |
63 | lwrite(startad,n,buff); | |
64 | startad += 512; | |
65 | } | |
66 | } | |
67 | rt_init() | |
68 | { | |
69 | static initized = 0; | |
70 | int mode = 2; | |
71 | ||
72 | if(initized) return; | |
58bb1161 | 73 | if(rflag) mode = 0; |
f7e35322 BJ |
74 | initized = 1; |
75 | if((floppydes = open(flopname,mode)) < 0) { | |
76 | printf("Floppy open failed\n"); | |
77 | exit(1); | |
78 | } | |
79 | } | |
80 | ||
81 | long trans(logical) | |
82 | register int logical; | |
83 | { | |
84 | /* Logical to physical adress translation */ | |
85 | register int sector, bytes, track; | |
86 | ||
87 | logical += 26 * 128; | |
88 | bytes = (logical & 127); | |
89 | logical >>= 7; | |
90 | sector = logical % 26; | |
91 | if(sector >= 13) | |
92 | sector = sector *2 +1; | |
93 | else | |
94 | sector *= 2; | |
95 | sector += 26 + ((track = (logical / 26)) - 1) * 6; | |
96 | sector %= 26; | |
97 | return( (((track *26) + sector) << 7) + bytes); | |
98 | } | |
99 | lread(startad,count,obuff) | |
100 | register startad, count; | |
101 | register char * obuff; | |
102 | { | |
103 | long trans(); | |
104 | extern floppydes; | |
105 | rt_init(); | |
106 | while( (count -= 128) >= 0) { | |
107 | lseek(floppydes, trans(startad), 0); | |
108 | read(floppydes,obuff,128); | |
109 | obuff += 128; | |
110 | startad += 128; | |
111 | } | |
112 | } | |
113 | lwrite(startad,count,obuff) | |
114 | register startad, count; | |
115 | register char * obuff; | |
116 | { | |
117 | long trans(); | |
118 | extern floppydes; | |
119 | rt_init(); | |
120 | while( (count -= 128) >= 0) { | |
121 | lseek(floppydes, trans(startad), 0); | |
122 | write(floppydes,obuff,128); | |
123 | obuff += 128; | |
124 | startad += 128; | |
125 | } | |
126 | } |