]> git.sur5r.net Git - cc65/commitdiff
make 'w2cas' a targetutil
authorChristian Groessler <chris@groessler.org>
Sat, 1 Mar 2014 12:10:01 +0000 (13:10 +0100)
committerChristian Groessler <chris@groessler.org>
Sat, 1 Mar 2014 12:11:52 +0000 (13:11 +0100)
doc/atari.sgml
libsrc/Makefile
libsrc/atari/targetutil/Makefile.inc [new file with mode: 0644]
libsrc/atari/targetutil/w2cas.c [new file with mode: 0644]
util/atari/w2cas.c [deleted file]

index 781fdf03b68e8de70d74adf81053b7ba18b5e065..867f25c1ddaa18abe393445a653ae1d664b587c4 100644 (file)
@@ -230,7 +230,7 @@ The size of a cassette boot file is restricted to 32K. Larger programs
 would need to be split in more parts and the parts to be loaded manually.
 
 To write the generated file to a cassette, a utility to run
-on an Atari is provided (<tt/util&sol;atari&sol;w2cas.c/).
+on an Atari is provided (<tt/W2CAS.COM/).
 
 <sect1><tt/atarixl/ config files<p>
 
index 3d8277ae557a2deb14d9eba94ae9c0c8608565e2..89f95237679fb3449a30f0c1eed6d3def3f66cc1 100644 (file)
@@ -102,6 +102,7 @@ MKINC = $(GEOS) \
         nes
 
 TARGETUTIL = apple2 \
+             atari \
              geos-apple
 
 GEOSDIRS = common      \
diff --git a/libsrc/atari/targetutil/Makefile.inc b/libsrc/atari/targetutil/Makefile.inc
new file mode 100644 (file)
index 0000000..eb371e1
--- /dev/null
@@ -0,0 +1,14 @@
+ifeq ($(TARGET),atari)
+
+DEPS += ../wrk/$(TARGET)/w2cas.d
+
+../wrk/$(TARGET)/w2cas.o: CC65FLAGS:=-O -W error
+../wrk/$(TARGET)/w2cas.o: $(SRCDIR)/targetutil/w2cas.c | ../wrk/$(TARGET)
+       $(COMPILE_recipe)
+
+../targetutil/W2CAS.COM: ../wrk/$(TARGET)/w2cas.o ../lib/$(TARGET).lib | ../targetutil
+       $(LD65) -o $@ -t $(TARGET) $^
+
+$(TARGET): ../targetutil/W2CAS.COM
+
+endif
diff --git a/libsrc/atari/targetutil/w2cas.c b/libsrc/atari/targetutil/w2cas.c
new file mode 100644 (file)
index 0000000..050218c
--- /dev/null
@@ -0,0 +1,186 @@
+/* w2cas.c -- write file to cassette
+ *
+ * This program writes a boot file (typically linked with
+ * 'atari-cassette.cfg') to the cassette.
+ * Only files < 32K are supported, since the loading of
+ * larger files requires a special loader inside the program.
+ *
+ * Christian Groessler, chris@groessler.org, 2014
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <6502.h>
+#include <atari.h>
+#include <conio.h>
+
+static int verbose = 1;
+static char C_dev[] = "C:";
+
+static struct __iocb *findfreeiocb(void)
+{
+    struct __iocb *iocb = &IOCB;  /* first IOCB (#0) */
+    int i;
+
+    for (i = 0; i < 8; i++) {
+        if (iocb->handler == 0xff)
+            return iocb;
+        iocb++;
+    }
+    return NULL;
+}
+
+int main(int argc, char **argv)
+{
+    char *filename, *x;
+    char buf[20];
+    FILE *file;
+    unsigned char *buffer;
+    size_t filen, buflen = 32768l + 1;
+    struct regs regs;
+    struct __iocb *iocb = findfreeiocb();
+    int iocb_num;
+
+    if (! iocb) {
+        fprintf(stderr, "couldn't find a free iocb\n");
+        if (_dos_type != 1)
+            cgetc();
+        return 1;
+    }
+    iocb_num = (iocb - &IOCB) * 16;
+    if (verbose)
+        printf("using iocb index $%02X ($%04X)\n", iocb_num, iocb);
+
+    if (argc < 2) {
+        printf("\nfilename: ");
+        x = fgets(buf, 19, stdin);
+        printf("\n");
+        if (! x)
+            return 1;
+        if (*x && *(x + strlen(x) - 1) == '\n')
+            *(x + strlen(x) - 1) = 0;
+        filename = x;
+    }
+    else {
+        filename = *(argv+1);
+    }
+
+    /* allocate buffer */
+    buffer = malloc(buflen);
+    if (! buffer) {
+        buflen = _heapmaxavail(); /* get as much as we can */
+        buffer = malloc(buflen);
+        if (! buffer) {
+            fprintf(stderr, "cannot alloc %ld bytes -- aborting...\n", (long)buflen);
+            if (_dos_type != 1)
+                cgetc();
+            return 1;
+        }
+    }
+    if (verbose)
+        printf("buffer size: %ld bytes\n", (long)buflen);
+
+    /* open file */
+    file = fopen(filename, "rb");
+    if (! file) {
+        free(buffer);
+        fprintf(stderr, "cannot open '%s': %s\n", filename, strerror(errno));
+        if (_dos_type != 1)
+            cgetc();
+        return 1;
+    }
+
+    /* read file -- file length must be < 32K */
+    if (verbose)
+        printf("reading input file...\n");
+    filen = fread(buffer, 1, buflen, file);
+    if (! filen) {
+        fprintf(stderr, "read error\n");
+    file_err:
+        fclose(file);
+        free(buffer);
+        if (_dos_type != 1)
+            cgetc();
+        return 1;
+    }
+    if (filen > 32767l) {
+        fprintf(stderr, "file is too large (must be < 32768)\n");
+        goto file_err;
+    }
+    if (filen == buflen) { /* we have a buffer < 32768 and the file fits into it (and is most probably larger) */
+        fprintf(stderr, "not enough memory\n");
+        goto file_err;
+    }
+    if (verbose)
+      printf("file size: %ld bytes\n", (long)filen);
+
+    /* close input file */
+    fclose(file);
+
+    /* open cassette */
+    if (verbose)
+        printf("opening cassette...\n");
+    iocb->buffer = C_dev;
+    iocb->aux1 = 8;    /* open for output */
+    iocb->aux2 = 128;  /* short breaks and no stop between data blocks */
+    iocb->command = IOCB_OPEN;
+    regs.x = iocb_num;
+    regs.pc = 0xe456;   /* CIOV */
+
+    _sys(&regs);
+    if (regs.y != 1) {
+        fprintf(stderr, "CIO call to open cassette returned %d\n", regs.y);
+        free(buffer);
+        if (_dos_type != 1)
+            cgetc();
+        return 1;
+    }
+
+    /* write file */
+    if (verbose)
+        printf("writing to cassette...\n");
+    iocb->buffer = buffer;
+    iocb->buflen = filen;
+    iocb->command = IOCB_PUTCHR;
+    regs.x = iocb_num;
+    regs.pc = 0xe456;   /* CIOV */
+
+    _sys(&regs);
+    if (regs.y != 1) {
+        fprintf(stderr, "CIO call to write file returned %d\n", regs.y);
+        free(buffer);
+
+        iocb->command = IOCB_CLOSE;
+        regs.x = iocb_num;
+        regs.pc = 0xe456;   /* CIOV */
+        _sys(&regs);
+
+        if (_dos_type != 1)
+            cgetc();
+        return 1;
+    }
+
+    /* free buffer */
+    free(buffer);
+
+    /* close cassette */
+    iocb->command = IOCB_CLOSE;
+    regs.x = iocb_num;
+    regs.pc = 0xe456;   /* CIOV */
+    _sys(&regs);
+
+    if (regs.y != 1) {
+        fprintf(stderr, "CIO call to close cassette returned %d\n", regs.y);
+        if (_dos_type != 1)
+            cgetc();
+        return 1;
+    }
+
+    /* all is fine */
+    printf("success\n");
+    if (_dos_type != 1)
+        cgetc();
+    return 0;
+}
diff --git a/util/atari/w2cas.c b/util/atari/w2cas.c
deleted file mode 100644 (file)
index 050218c..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-/* w2cas.c -- write file to cassette
- *
- * This program writes a boot file (typically linked with
- * 'atari-cassette.cfg') to the cassette.
- * Only files < 32K are supported, since the loading of
- * larger files requires a special loader inside the program.
- *
- * Christian Groessler, chris@groessler.org, 2014
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <6502.h>
-#include <atari.h>
-#include <conio.h>
-
-static int verbose = 1;
-static char C_dev[] = "C:";
-
-static struct __iocb *findfreeiocb(void)
-{
-    struct __iocb *iocb = &IOCB;  /* first IOCB (#0) */
-    int i;
-
-    for (i = 0; i < 8; i++) {
-        if (iocb->handler == 0xff)
-            return iocb;
-        iocb++;
-    }
-    return NULL;
-}
-
-int main(int argc, char **argv)
-{
-    char *filename, *x;
-    char buf[20];
-    FILE *file;
-    unsigned char *buffer;
-    size_t filen, buflen = 32768l + 1;
-    struct regs regs;
-    struct __iocb *iocb = findfreeiocb();
-    int iocb_num;
-
-    if (! iocb) {
-        fprintf(stderr, "couldn't find a free iocb\n");
-        if (_dos_type != 1)
-            cgetc();
-        return 1;
-    }
-    iocb_num = (iocb - &IOCB) * 16;
-    if (verbose)
-        printf("using iocb index $%02X ($%04X)\n", iocb_num, iocb);
-
-    if (argc < 2) {
-        printf("\nfilename: ");
-        x = fgets(buf, 19, stdin);
-        printf("\n");
-        if (! x)
-            return 1;
-        if (*x && *(x + strlen(x) - 1) == '\n')
-            *(x + strlen(x) - 1) = 0;
-        filename = x;
-    }
-    else {
-        filename = *(argv+1);
-    }
-
-    /* allocate buffer */
-    buffer = malloc(buflen);
-    if (! buffer) {
-        buflen = _heapmaxavail(); /* get as much as we can */
-        buffer = malloc(buflen);
-        if (! buffer) {
-            fprintf(stderr, "cannot alloc %ld bytes -- aborting...\n", (long)buflen);
-            if (_dos_type != 1)
-                cgetc();
-            return 1;
-        }
-    }
-    if (verbose)
-        printf("buffer size: %ld bytes\n", (long)buflen);
-
-    /* open file */
-    file = fopen(filename, "rb");
-    if (! file) {
-        free(buffer);
-        fprintf(stderr, "cannot open '%s': %s\n", filename, strerror(errno));
-        if (_dos_type != 1)
-            cgetc();
-        return 1;
-    }
-
-    /* read file -- file length must be < 32K */
-    if (verbose)
-        printf("reading input file...\n");
-    filen = fread(buffer, 1, buflen, file);
-    if (! filen) {
-        fprintf(stderr, "read error\n");
-    file_err:
-        fclose(file);
-        free(buffer);
-        if (_dos_type != 1)
-            cgetc();
-        return 1;
-    }
-    if (filen > 32767l) {
-        fprintf(stderr, "file is too large (must be < 32768)\n");
-        goto file_err;
-    }
-    if (filen == buflen) { /* we have a buffer < 32768 and the file fits into it (and is most probably larger) */
-        fprintf(stderr, "not enough memory\n");
-        goto file_err;
-    }
-    if (verbose)
-      printf("file size: %ld bytes\n", (long)filen);
-
-    /* close input file */
-    fclose(file);
-
-    /* open cassette */
-    if (verbose)
-        printf("opening cassette...\n");
-    iocb->buffer = C_dev;
-    iocb->aux1 = 8;    /* open for output */
-    iocb->aux2 = 128;  /* short breaks and no stop between data blocks */
-    iocb->command = IOCB_OPEN;
-    regs.x = iocb_num;
-    regs.pc = 0xe456;   /* CIOV */
-
-    _sys(&regs);
-    if (regs.y != 1) {
-        fprintf(stderr, "CIO call to open cassette returned %d\n", regs.y);
-        free(buffer);
-        if (_dos_type != 1)
-            cgetc();
-        return 1;
-    }
-
-    /* write file */
-    if (verbose)
-        printf("writing to cassette...\n");
-    iocb->buffer = buffer;
-    iocb->buflen = filen;
-    iocb->command = IOCB_PUTCHR;
-    regs.x = iocb_num;
-    regs.pc = 0xe456;   /* CIOV */
-
-    _sys(&regs);
-    if (regs.y != 1) {
-        fprintf(stderr, "CIO call to write file returned %d\n", regs.y);
-        free(buffer);
-
-        iocb->command = IOCB_CLOSE;
-        regs.x = iocb_num;
-        regs.pc = 0xe456;   /* CIOV */
-        _sys(&regs);
-
-        if (_dos_type != 1)
-            cgetc();
-        return 1;
-    }
-
-    /* free buffer */
-    free(buffer);
-
-    /* close cassette */
-    iocb->command = IOCB_CLOSE;
-    regs.x = iocb_num;
-    regs.pc = 0xe456;   /* CIOV */
-    _sys(&regs);
-
-    if (regs.y != 1) {
-        fprintf(stderr, "CIO call to close cassette returned %d\n", regs.y);
-        if (_dos_type != 1)
-            cgetc();
-        return 1;
-    }
-
-    /* all is fine */
-    printf("success\n");
-    if (_dos_type != 1)
-        cgetc();
-    return 0;
-}