diff --git a/tools/makeadf b/tools/makeadf deleted file mode 100755 index f7c7e58..0000000 Binary files a/tools/makeadf and /dev/null differ diff --git a/tools/makeadf/Makefile b/tools/makeadf/Makefile new file mode 100644 index 0000000..167c1f7 --- /dev/null +++ b/tools/makeadf/Makefile @@ -0,0 +1,16 @@ +MAKEADF=./bin/makeadf +SRCS=makeadf.c +HOST_WARNINGS=-pedantic-errors -Wfatal-errors -Wall -Werror -Wextra -Wno-unused-parameter -Wshadow +HOST_CFLAGS=$(HOST_WARNINGS) + +$(MAKEADF): out bin $(SRCS) + gcc $(HOST_CFLAGS) $(SRCS) -o $(MAKEADF) + +out: + mkdir out + +bin: + mkdir bin + +clean: + rm -r out bin \ No newline at end of file diff --git a/tools/makeadf/makeadf.c b/tools/makeadf/makeadf.c new file mode 100644 index 0000000..ca995a5 --- /dev/null +++ b/tools/makeadf/makeadf.c @@ -0,0 +1,64 @@ +/* + * http://eab.abime.net/showpost.php?p=895070&postcount=6 + * Makes a disk image of 901120 (0xdc000) bytes. + * Calculates boot block checksum. + */ + +#include +#include +#include + +#define DISKSIZE (0xdc000) + +uint8_t image[DISKSIZE]; + + +static void boot_chksum(uint8_t *p) +{ + uint32_t oldchk,chk=0; + int i; + + memset(p+4,0,4); + for (i=0; i<1024; i+=4) { + oldchk = chk; + chk += ((uint32_t)p[i+0] << 24) | ((uint32_t)p[i+1] << 16) | + ((uint32_t)p[i+2] << 8) | p[i+3]; + if (chk < oldchk) + ++chk; /* carry */ + } + + chk = ~chk; + p[4] = (uint8_t)((chk >> 24) & 0xff); + p[5] = (uint8_t)((chk >> 16) & 0xff); + p[6] = (uint8_t)((chk >> 8) & 0xff); + p[7] = (uint8_t)(chk & 0xff); +} + + +int main(int argc,char *argv[]) +{ + FILE *f; + int rc = 1; + size_t len; + + if (argc == 2) { + if ((f = fopen(argv[1],"rb"))) { + len = fread(image,1,DISKSIZE,f); + if (len > 0) { + if (len < DISKSIZE) + memset(image+len,0,DISKSIZE-len); + boot_chksum(image); + fwrite(image,1,DISKSIZE,stdout); + rc = 0; + } + else + fprintf(stderr,"Image read error!\n"); + } + else + fprintf(stderr,"Cannot open '%s'!\n",argv[0]); + } + else + fprintf(stderr,"Usage: %s \n",argv[0]); + + return rc; +}