1 /* w2cas.c -- write file to cassette
3 * This program writes a boot file (typically linked with
4 * 'atari-cassette.cfg') to the cassette.
5 * Only files < 32K are supported, since the loading of
6 * larger files requires a special loader inside the program.
8 * Christian Groessler, chris@groessler.org, 2014
19 static int verbose = 1;
20 static char C_dev[] = "C:";
22 static struct __iocb *findfreeiocb(void)
24 struct __iocb *iocb = &IOCB; /* first IOCB (#0) */
27 for (i = 0; i < 8; i++) {
28 if (iocb->handler == 0xff)
35 int main(int argc, char **argv)
40 unsigned char *buffer;
41 size_t filen, buflen = 32768l + 1;
43 struct __iocb *iocb = findfreeiocb();
47 fprintf(stderr, "couldn't find a free iocb\n");
52 iocb_num = (iocb - &IOCB) * 16;
54 printf("using iocb index $%02X ($%04X)\n", iocb_num, iocb);
57 printf("\nfilename: ");
58 x = fgets(buf, 19, stdin);
62 if (*x && *(x + strlen(x) - 1) == '\n')
63 *(x + strlen(x) - 1) = 0;
71 buffer = malloc(buflen);
73 buflen = _heapmaxavail(); /* get as much as we can */
74 buffer = malloc(buflen);
76 fprintf(stderr, "cannot alloc %ld bytes -- aborting...\n", (long)buflen);
83 printf("buffer size: %ld bytes\n", (long)buflen);
86 file = fopen(filename, "rb");
89 fprintf(stderr, "cannot open '%s': %s\n", filename, strerror(errno));
95 /* read file -- file length must be < 32K */
97 printf("reading input file...\n");
98 filen = fread(buffer, 1, buflen, file);
100 fprintf(stderr, "read error\n");
108 if (filen > 32767l) {
109 fprintf(stderr, "file is too large (must be < 32768)\n");
112 if (filen == buflen) { /* we have a buffer < 32768 and the file fits into it (and is most probably larger) */
113 fprintf(stderr, "not enough memory\n");
117 printf("file size: %ld bytes\n", (long)filen);
119 /* close input file */
124 printf("opening cassette...\n");
125 iocb->buffer = C_dev;
126 iocb->aux1 = 8; /* open for output */
127 iocb->aux2 = 128; /* short breaks and no stop between data blocks */
128 iocb->command = IOCB_OPEN;
130 regs.pc = 0xe456; /* CIOV */
134 fprintf(stderr, "CIO call to open cassette returned %d\n", regs.y);
143 printf("writing to cassette...\n");
144 iocb->buffer = buffer;
145 iocb->buflen = filen;
146 iocb->command = IOCB_PUTCHR;
148 regs.pc = 0xe456; /* CIOV */
152 fprintf(stderr, "CIO call to write file returned %d\n", regs.y);
155 iocb->command = IOCB_CLOSE;
157 regs.pc = 0xe456; /* CIOV */
169 iocb->command = IOCB_CLOSE;
171 regs.pc = 0xe456; /* CIOV */
175 fprintf(stderr, "CIO call to close cassette returned %d\n", regs.y);