|
@@ -19,11 +19,10 @@ scp_freq = 40000000
|
|
|
# flux_to_scp:
|
|
|
# Converts Greaseweazle flux samples into a Supercard Pro Track.
|
|
|
# Returns the Track Data Header (TDH) and the SCP "bitcell" array.
|
|
|
-def flux_to_scp(flux, track, nr_revs):
|
|
|
+def flux_to_scp(flux, index_times, track, nr_revs):
|
|
|
|
|
|
factor = scp_freq / usb.sample_freq
|
|
|
|
|
|
- index_times = usb.get_index_times(nr_revs+1)
|
|
|
tdh = struct.pack("<3sB", b"TRK", track)
|
|
|
dat = bytearray()
|
|
|
|
|
@@ -55,7 +54,7 @@ def flux_to_scp(flux, track, nr_revs):
|
|
|
rev += 1
|
|
|
if rev > nr_revs:
|
|
|
# We're done: We simply discard any surplus flux samples
|
|
|
- return (tdh, dat)
|
|
|
+ return tdh, dat
|
|
|
to_index += index_times[rev]
|
|
|
|
|
|
# Process the current flux sample into SCP "bitcell" format
|
|
@@ -81,7 +80,7 @@ def flux_to_scp(flux, track, nr_revs):
|
|
|
len_at_index = len(dat)
|
|
|
rev += 1
|
|
|
|
|
|
- return (tdh, dat)
|
|
|
+ return tdh, dat
|
|
|
|
|
|
|
|
|
# read_to_scp:
|
|
@@ -102,7 +101,7 @@ def read_to_scp(args):
|
|
|
trk_offs.append(len(trk_dat))
|
|
|
usb.seek(cyl, side)
|
|
|
for retry in range(1, 5):
|
|
|
- (ack, enc_flux) = usb.read_track(args.revs+1)
|
|
|
+ ack, index_times, enc_flux = usb.read_track(args.revs+1)
|
|
|
if ack == USB.Ack.Okay:
|
|
|
break
|
|
|
elif ack == USB.Ack.FluxOverflow and retry < 5:
|
|
@@ -110,7 +109,7 @@ def read_to_scp(args):
|
|
|
else:
|
|
|
raise CmdError(ack)
|
|
|
flux = usb.decode_flux(enc_flux)
|
|
|
- (tdh, dat) = flux_to_scp(flux, track, args.revs)
|
|
|
+ tdh, dat = flux_to_scp(flux, index_times, track, args.revs)
|
|
|
trk_dat += tdh
|
|
|
trk_dat += dat
|
|
|
print()
|
|
@@ -151,8 +150,12 @@ def write_from_scp(args):
|
|
|
if args.adjust_speed:
|
|
|
# @drive_ticks is the time in Gresaeweazle ticks between index pulses.
|
|
|
# We will adjust the flux intervals per track to allow for this.
|
|
|
- usb.read_track(3)
|
|
|
- index_times = usb.get_index_times(3)
|
|
|
+ for retry in range(1, 5):
|
|
|
+ ack, index_times, _ = usb.read_track(3)
|
|
|
+ if ack == USB.Ack.Okay:
|
|
|
+ break
|
|
|
+ elif ack != USB.Ack.FluxOverflow or retry >= 5:
|
|
|
+ raise CmdError(ack)
|
|
|
drive_ticks = (index_times[1] + index_times[2]) / 2
|
|
|
else:
|
|
|
# Simple ratio between the Greaseweazle and SCP sample frequencies.
|
|
@@ -182,7 +185,7 @@ def write_from_scp(args):
|
|
|
|
|
|
# Parse the SCP track header and extract the flux data.
|
|
|
thdr = struct.unpack("<3sBIII", dat[trk_offs[i]:trk_offs[i]+16])
|
|
|
- (sig,_,track_ticks,samples,off) = thdr
|
|
|
+ sig, _, track_ticks, samples,off = thdr
|
|
|
assert sig == b"TRK"
|
|
|
tdat = dat[trk_offs[i]+off:trk_offs[i]+off+samples*2]
|
|
|
|
|
@@ -240,7 +243,7 @@ def update_firmware(args):
|
|
|
# Read and check the update file.
|
|
|
with open(args.file, "rb") as f:
|
|
|
dat = f.read()
|
|
|
- (sig, maj, min, pad1, pad2, crc) = struct.unpack(">2s4BH", dat[-8:])
|
|
|
+ sig, maj, min, pad1, pad2, crc = struct.unpack(">2s4BH", dat[-8:])
|
|
|
if len(dat) & 3 != 0 or sig != b'GW' or pad1 != 0 or pad2 != 0:
|
|
|
print("%s: Bad update file" % (args.file))
|
|
|
return
|