mirror of
https://github.com/robmcmullen/atrcopy.git
synced 2024-11-26 23:52:02 +00:00
690cc0aaca
* added ranges for file specification
101 lines
3.4 KiB
Python
Executable File
101 lines
3.4 KiB
Python
Executable File
#!/usr/bin/env python
|
|
"""
|
|
|
|
"""
|
|
|
|
import os
|
|
import numpy as np
|
|
import subprocess
|
|
import tempfile
|
|
|
|
def create_binary(filename, num, outfile, options):
|
|
"""Create patterned binary data with the first 7 characters of the filename
|
|
interleaved with a byte ramp, e.g. A128 \x00A128 \x01A128 \x02 etc.
|
|
"""
|
|
root, _ = outfile.split(".")
|
|
prefix = ("%s " % root)[0:8]
|
|
a = np.fromstring(prefix, dtype=np.uint8)
|
|
b = np.tile(a, (num / np.alen(a)) + 1)[0:num]
|
|
b[7::8] = np.arange(np.alen(b) / 8, dtype=np.uint8)
|
|
with open(filename, "wb") as fh:
|
|
fh.write(b.tostring())
|
|
|
|
def num_to_letter(num):
|
|
text = []
|
|
while True:
|
|
num, rem = divmod(num, 26)
|
|
text[0:0] = chr(ord("A") + rem)
|
|
if num == 0:
|
|
break
|
|
return "".join(text)
|
|
|
|
def get_filename(num, used):
|
|
if num not in used:
|
|
used[num] = 0
|
|
prefix = num_to_letter(used[num])
|
|
filename = "%s%d.DAT" % (prefix, num)
|
|
used[num] += 1
|
|
return filename
|
|
|
|
def franny(filename, *options):
|
|
cmd = ["franny", filename]
|
|
cmd.extend(options)
|
|
msg = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
|
|
|
|
if __name__ == "__main__":
|
|
import sys
|
|
import argparse
|
|
|
|
parser = argparse.ArgumentParser(description="Extract images off ATR format disks")
|
|
parser.add_argument("-v", "--verbose", default=0, action="count")
|
|
parser.add_argument("-p", "--prefix", default="B", action="store")
|
|
parser.add_argument("-f", "--filesystem", default="a", action="store")
|
|
parser.add_argument("-d", "--density", default="s", action="store")
|
|
parser.add_argument("-s", "--sectors", default=720, type=int, action="store")
|
|
parser.add_argument("-t", "--template", default="", action="store")
|
|
parser.add_argument("-o", "--output", default="a.out", action="store")
|
|
parser.add_argument("files", metavar="NUM", nargs="+", help="list of numbers specifying the size of each binary file")
|
|
options, extra_args = parser.parse_known_args()
|
|
|
|
out = options.output
|
|
if options.template:
|
|
franny(out, "-C", "-f", options.filesystem, "-t", options.template)
|
|
else:
|
|
franny(out, "-C", "-f", options.filesystem, "-d", options.density, "-s", str(options.sectors))
|
|
fh, binfile = tempfile.mkstemp()
|
|
os.close(fh)
|
|
used = {}
|
|
files = []
|
|
print "Creating image %s" % out
|
|
for entry in options.files:
|
|
entry = entry.lower()
|
|
if entry.startswith("d"):
|
|
index = int(entry[1:])
|
|
outfile = files[index]
|
|
franny(out, "-U", outfile)
|
|
else:
|
|
if "*" in entry:
|
|
repeat, num = entry.split("*", 1)
|
|
num = int(num)
|
|
repeat = int(repeat)
|
|
entries = [num] * repeat
|
|
elif "-" in entry:
|
|
first, last = entry.split("-", 1)
|
|
first = int(first)
|
|
if "," in last:
|
|
last, step = last.split(",", 1)
|
|
step = int(step)
|
|
else:
|
|
step = 1
|
|
last = int(last)
|
|
entries = range(first, last + 1, step)
|
|
else:
|
|
num = int(entry)
|
|
entries = [num]
|
|
for i in entries:
|
|
outfile = get_filename(i, used)
|
|
create_binary(binfile, i, outfile, options)
|
|
franny(out, "-A", "-i", binfile, "-o", outfile)
|
|
files.append(outfile)
|
|
os.unlink(binfile)
|