diff --git a/tools/make-adf.py b/tools/make-adf.py new file mode 100755 index 0000000..314fd92 --- /dev/null +++ b/tools/make-adf.py @@ -0,0 +1,37 @@ +#! /usr/bin/env python + +DISKSIZE = 512 * 11 * 2 * 80 + +def concat(out, fn): + f = open(fn, 'rb') + d = f.read() + f.close() + if len(d) % 512 != 0: + d = d + '\0' * (512-(len(d)%512)) + print('placing %s (%d bytes, %d secs) at pos %d (sector %d)' % (fn, len(d), len(d)/512, out.tell(), out.tell()/512)) + out.write(d) + +if __name__ == '__main__': + + import sys + + output = sys.argv[1] + bootblock = sys.argv[2] + files = sys.argv[3:] + + out = open(output, 'wb') + concat(out, bootblock) + + for f in files: + concat(out,f) + + diff = DISKSIZE - out.tell() + + if diff < 0: + sys.stderr.write('too big! %d bytes over budget' % (diff)) + sys.exit(1) + + out.write('\0' * diff) + + out.close() + diff --git a/tools/makeadf.c b/tools/makeadf.c new file mode 100644 index 0000000..52d151c --- /dev/null +++ b/tools/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; +} diff --git a/tools/sum-bootblock.py b/tools/sum-bootblock.py new file mode 100755 index 0000000..65a4433 --- /dev/null +++ b/tools/sum-bootblock.py @@ -0,0 +1,29 @@ +#! /usr/bin/env python + +import sys +import struct + +def splice_checksum(block, chksum): + return block[0:4] + struct.pack('>I', chksum) + block[8:] + +def makeit(fn, ofn): + with open(fn, 'rb') as f: data = f.read() + + data = data + '\0' * (1024 - len(data)) + + chksum = 0 + for w in xrange(0, 1024, 4): + chksum += struct.unpack('>I', data[w:w+4])[0] + if chksum > 0xffffffff: + chksum = (chksum + 1) & 0xffffffff + + chksum = (~chksum) & 0xffffffff + + data2 = splice_checksum(data, chksum) + + with open(ofn, 'wb') as f: f.write(data2) + +if len(sys.argv) == 3: + makeit(sys.argv[1], sys.argv[2]) +else: + sys.stderr.write('need two args\n')