16 #define PORT "/dev/ttyUSB0"
20 static const struct option longopts
[]={
24 {"verbose",0,NULL
,'v'},
28 {"loglevel",1,NULL
,'l'},
29 {"verify",0,NULL
,'V'},
33 static const char optstring
[]="hrwvp:d:l:qV";
35 static void help(void){
38 Usage: rktool {-r|-w} [-v] [-V] [-h] [-d<unit_number>] [-l<loglevel>] <imagefile>\n\
40 This tool will help you to backup restore RK05 media on a PDP8 running speed8.\n\
44 -r, --read Read disk (default if nothing specified)\n\
45 -w, --write Write disk\n\
46 -d, --drive= Select drive number 0-3 (defaults to 0)\n\
47 -p, --port= Serial port to use (defaults to /dev/ttyUSB0)\n\
48 -V, --verify Verify after read or write\n\
49 -v, --verbose Be verbose\n\
50 -q, --quiet Be quiet, opposite of -v\n\
51 -l, --loglevel= Set loglevel for debugging purposes\n\
52 -h, --help Display this help and exit\n\
58 static char defaultport
[]=PORT
;
60 int main(int argc
, char ** argv
){
68 char * port
=defaultport
;
74 opt
=getopt_long(argc
,argv
,optstring
,longopts
,NULL
);
92 error("-p needs an argument!\n");
99 error("-d needs an argument!\n");
102 drive
=strtol(optarg
, NULL
, 0);
109 error("-l needs an argument!\n");
112 loglevel
=strtol(optarg
,NULL
,0);
121 opt
=getopt_long(argc
,argv
,optstring
,longopts
,NULL
);
127 fprintf(stderr
,"Error: No file specified!\n");
131 debug("Opening port \"%s\".\n",port
);
132 debug("Image file: %s\n", file
);
133 debug("Flushing first\n");
135 res
=link_flush(port
);
138 ERROR
perror("While initializing link");
141 debug("Opening for real now\n");
144 ERROR
perror("While initializing link");
149 uint16_t origin
[RK05_DISKSIZE
];
150 uint16_t readback
[RK05_DISKSIZE
];
152 int fd
=open(file
,O_RDONLY
);
154 ERROR
perror("While opening file");
157 res
=read(fd
,(char*)origin
,sizeof(origin
));
158 WARN
if (res
<RK05_DISKSIZE
*2)
159 warn("Read only %i bytes! Hope, that's ok.\n",res
);
162 res
=rk05_write_disk(drive
,origin
);
164 ERROR
perror("While writing disk image");
169 info("Reading back image.\n");
170 res
=rk05_read_disk(drive
,readback
);
172 ERROR
perror("While reading disk image");
177 int cylinder
,side
,sector
,word
;
178 for (cylinder
=0; cylinder
<RK05_CYLINDERS
;cylinder
++)
179 for (side
=0; side
<1; side
++)
180 for (sector
=0; sector
<16; sector
++)
181 for (word
=0; word
<256; word
++){
182 i
=cylinder
*2*16*256+side
*16*256+sector
*256+word
;
183 if (readback
[i
]!=origin
[i
]){
184 error("Verify mismatch! Cylinder %i, Side %i, Sector %i, Word %i\n",
185 cylinder
,side
,sector
,word
);
190 error("Found %i verify errors!\n",e
);
198 uint16_t target
[RK05_DISKSIZE
];
199 uint16_t target2
[RK05_DISKSIZE
];
201 info("Reading drive %i\n",drive
);
203 res
=rk05_read_disk(drive
,target
);
205 ERROR
perror("While reading disk image");
210 info("Reading again\n");
211 res
=rk05_read_disk(drive
,target2
);
213 ERROR
perror("While reading disk image");
217 for (i
=0; i
<RK05_DISKSIZE
;i
++){
218 debug("verify: %i\n",i
);
219 if (target
[i
]!=target2
[i
]){
220 error("Verify mismatch! Cylinder %i, Side %i, Sector %i, Word %i\n",
221 i
>>13,(i
>>12)&1,(i
>>8)&15,i
&256);
226 int fd
=open(file
,O_WRONLY
|O_CREAT
|O_TRUNC
,0640);
228 ERROR
perror("While opening file");
231 debug("File \"%s\" opened.\n",file
);
232 res
=write(fd
,target
,sizeof(target
));
233 if (res
!=sizeof(target
)){
234 ERROR
perror ("While writing file to disk");
243 error("Found %i verify errors!\n",e
);