tools is shared

This commit is contained in:
alpine9000
2016-02-26 12:29:58 +11:00
parent 3a55b7369c
commit 16ee4f3d08
3 changed files with 130 additions and 0 deletions
+37
View File
@@ -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()
+64
View File
@@ -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 <stdio.h>
#include <string.h>
#include <stdint.h>
#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 <image data>\n",argv[0]);
return rc;
}
+29
View File
@@ -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')