/* axe - manipulate atari disk images (dos 2.0s only for now) * * Usage: ataridir [-a] [-x filename] [-l] [-v] * * (-a means list all directory entries, regardless of status byte) * -l means dump sector link info for all filenumbers on disk * -x means extract file from image * -v means hex dump of VTOC sector * */ /* indented with: indent -kr -nsai -nsaw -ts3 -i3 -br -brf -brs -cdw -ce */ #include "axe.h" int all = 0, total_sec, translate = 0; int main(int argc, char *argv[]) { #ifdef DEBUG int vtoc_dump = 0; #endif int extract = 0, del = 0, dump_sec = 0, print = 1, opt, write = 0, filenum = 0, i, j, lng = 0, tar = 0, blank = 0, create = 0; unsigned char buf[256], diskbuf[720 * 128 + 16]; char newblank[13]; unsigned char *debuf; char filename[13] = { "\0" }; char fnbuf[13] = " \0"; DIR *credir; struct dirent *nfile; printf("axe (the ATR/XFD Editor) v%s, (c) B. Watson.\n", VERSION); printf("Released under the WTFPL.\n\n"); if(argc < 2) usage(argv[0]); while((opt = getopt(argc, argv, "ab:c:lvd:D:x:tuw:")) != EOF) { switch (opt) { case 'a': all = 1; break; case 'b': /*write_blank_disk(optarg); */ blank = 1; strcpy(newblank, optarg); break; case 'c': print = 0; create = 1; strcpy(filename, optarg); break; case 'd': dump_sec = atoi(optarg); break; case 'l': lng = 1; break; case 'v': dump_sec = 360; break; case 'D': del = 1; print = 0; strcpy(filename, optarg); break; case 'x': strcpy(filename, optarg); extract = 1; print = 0; break; case 'w': write = 1; print = 0; strcpy(filename, optarg); break; case 't': tar = 1; break; case 'u': translate = 1; break; case '?': case ':': exit(1); default: printf("How'd I get here?\n"); exit(255); } } if((create + write + extract + del + tar) > 1) { printf("Only one of -t, -w, -c, -x, -D may be specified.\n"); exit(1); } if(blank) write_blank_disk(newblank); if(optind == argc) { if(!blank) usage(argv[0]); exit(!blank); } printf("Using image file %s\n\n", argv[argc - 1]); #ifdef DEBUG printf("-a:%d -l:%d\n -v:%d", all, lng, vtoc_dump); #endif if(filename[0] && (!create)) { parse_filename(filename, fnbuf); } #ifdef DEBUG printf("Passed filename %s, parsed as %s\n", filename, fnbuf); #endif if(create) write_blank_disk(argv[argc - 1]); load_disk(diskbuf, argv[argc - 1]); /* if(write) { if(strcmp(filename,argv[argc-1])==0) { printf("No disk image name given - aborting\n"); exit(1); } write_file(diskbuf,filename); write_disk(diskbuf,argv[argc-1]); exit(0); } */ #ifdef DEBUG printf("-t=%d\n", tar); #endif if(create) { char msgbuf[256]; if((credir = opendir(filename)) == NULL) { sprintf(msgbuf, "can't open directory %s", filename); perror(msgbuf); exit(1); } while((nfile = readdir(credir)) != NULL) { if(nfile->d_name[0] == '.') continue; write_file(diskbuf, nfile->d_name); } printf("Done.\n"); write_disk(diskbuf, argv[argc - 1]); exit(0); } if(tar) { make_dir(argv[argc - 1]); } for (i = 361; i < 369; i++) { read_sector(diskbuf, i, buf); for (j = 0; j < 128; j += 16) { debuf = buf + j; if((tar) && (debuf[0] & 64) && !(debuf[0] & 128)) { strncpy(fnbuf, (char *)(debuf + 5), 11); make_filename(fnbuf, filename); dump_file(diskbuf, debuf, filename); } if(print && !(debuf[0] & 128)) print_entry(debuf); #ifdef DEBUG printf("strncmp: %s, %s\n", fnbuf, debuf + 5); #endif if((strncmp(fnbuf, (char *)(debuf + 5), 11) == 0) && !(debuf[0] & 128)) { #ifdef DEBUG printf("matched filename\n"); #endif if(extract) dump_file(diskbuf, debuf, filename); if(del || write) { traverse_file(diskbuf, debuf, TF_DELETE); debuf[0] |= 128; write_sector(diskbuf, i, buf); write_disk(diskbuf, argv[argc - 1]); } } if(lng) traverse_file(diskbuf, debuf, TF_PRINT); filenum++; } } if(print) { read_sector(diskbuf, 360, buf); i = buf[3] + 256 * buf[4]; printf("%03d FREE SECTORS\n", i); /* if(i!=(707-total_sec)) printf("Warning: VTOC free sectors != (707 - total_sec), %d vs. %d\n",i,707-total_sec);*/ } if(dump_sec) dump_sector(diskbuf, dump_sec); if(write) { write_file(diskbuf, filename); write_disk(diskbuf, argv[argc - 1]); } exit(0); }