aboutsummaryrefslogtreecommitdiff
path: root/axe.c
diff options
context:
space:
mode:
Diffstat (limited to 'axe.c')
-rw-r--r--axe.c197
1 files changed, 197 insertions, 0 deletions
diff --git a/axe.c b/axe.c
new file mode 100644
index 0000000..838a73c
--- /dev/null
+++ b/axe.c
@@ -0,0 +1,197 @@
+/* axe - manipulate atari disk images (dos 2.0s only for now)
+ *
+ * Usage: ataridir [-a] [-x filename] [-l] [-v] <disk_image.atr>
+ *
+ * (-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);
+}