/* c2d, Code to Disk, Version 0.31, Sun Apr 2 16:33:28 UTC 2017 (c) 2012,2017 All Rights Reserved, Egan Ford (egan@sense.net) THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. Based on work by: * Weishaar, Tom. "Running without filenames". Open-Apple Jan. 1985 Vol. 1, No. 0: p. 7 (http://apple2online.com/web_documents/Open%20Apple%20Vol1No00.pdf) License: * Do what you like, remember to credit all sources when using. Description: This small utility will read Apple II binary and monitor text files and output a DOS ordered dsk image that will boot your code quickly. Features: * Apple II+, IIe support. * Big and little-endian machine support. o Little-endian tested. * Platforms tested: o 32-bit/64-bit x86 OS/X. o 32-bit x86 Windows/MinGW. Compile: OS/X: gcc -Wall -O -o c2d c2d.c Linux: gcc -Wall -O -o c2d c2d.c -lm Windows/Cygwin: gcc -Wall -O -o c2d c2d.c Windows/MinGW: PATH=C:\MinGW\bin;%PATH% gcc -Wall -O -static -o c2d c2d.c Bugs: * Probably */ #include #include #include #include #include #include #include #include "c2d.h" #define VERSION "Version 0.31" #define INFILE argv[argc-2] #define OUTFILE argv[argc-1] #define BINARY 0 #define MONITOR 1 void usage(); char *getext(char *filename); int main(int argc, char **argv) { FILE *ifp, *ofp; int c, j, k, start, start_override = 0, inputtype, warm = 0, filesize = 0; struct stat st; char *filetypes[] = {"BINARY","MONITOR"}; char *ext, filename[256], load_address[10]; opterr = 1; while((c = getopt(argc, argv, "vmh?s:")) != -1) switch(c) { case 'm': warm = 1; break; case 'v': // version fprintf(stderr,"\n%s\n\n",VERSION); return 1; break; case 's': // override rate for -1/-2 only warm = 0; start_override = (int)strtol(optarg, (char **)NULL, 16); // todo: input check break; case 'h': // help case '?': usage(); return 1; } if(argc - optind < 2) { usage(); return 1; } fprintf(stderr,"\n"); inputtype=BINARY; k=0; for(j=0;j> 8) + 1; blank.track[0].sector[1].byte[0x15] = ceil((filesize + (start & 0xFF))/ 4096.0); blank.track[0].sector[1].byte[0x1A] = ceil((filesize + (start & 0xFF))/ 256.0) - 16*(ceil((filesize + (start & 0xFF)) / 4096.0) - 1) - 1; fprintf(stderr,"Number of sectors: %d\n",(int)ceil((filesize + (start & 0xFF)) / 256.0)); fprintf(stderr,"Memory page range: $%02X - $%02X\n",start >> 8,(start + filesize - 1) >> 8); if(warm) start = 0xFF69; if(start_override) start = start_override; blank.track[0].sector[1].byte[0x3B] = 0x4C; blank.track[0].sector[1].byte[0x3C] = start & 0xFF; blank.track[0].sector[1].byte[0x3D] = start >> 8; fprintf(stderr,"After boot, jump to: $%04X\n\n",start); if ((ofp = fopen(OUTFILE, "wb")) == NULL) { fprintf(stderr,"Cannot write: %s\n\n",OUTFILE); return 1; } fprintf(stderr,"Writing %s to T:01/S:00 - T:%02d/S:%02d on %s\n\n",filename,blank.track[0].sector[1].byte[0x15],blank.track[0].sector[1].byte[0x1A],OUTFILE); // check for errors fwrite(&blank, 143360, 1, ofp); return 0; } char *getext(char *filename) { char stack[256], *rval; int i, sp = 0; for(i=strlen(filename)-1;i>=0;i--) { if(filename[i] == '.') break; stack[sp++] = filename[i]; } stack[sp] = '\0'; if(sp == strlen(filename) || sp == 0) return(NULL); if((rval = (char *)malloc(sp * sizeof(char))) == NULL) ; //do error code rval[sp] = '\0'; for(i=0;i