123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- import struct
- class SCP:
-
- sample_freq = 40000000
- def __init__(self, start_cyl, nr_sides):
- self.start_cyl = start_cyl
- self.nr_sides = nr_sides
- self.nr_revs = None
- self.track_list = []
-
-
-
- def append_track(self, flux):
- nr_revs = len(flux.index_list) - 1
- if not self.nr_revs:
- self.nr_revs = nr_revs
- else:
- assert self.nr_revs == nr_revs
-
- factor = SCP.sample_freq / flux.sample_freq
- trknr = self.start_cyl * self.nr_sides + len(self.track_list)
- tdh = struct.pack("<3sB", b"TRK", trknr)
- dat = bytearray()
- len_at_index = rev = 0
- to_index = flux.index_list[0]
- rem = 0.0
- for x in flux.list:
-
- if rev == 0:
- if to_index >= x:
-
- to_index -= x
- continue
-
- rev = 1
- to_index += flux.index_list[rev]
-
- while to_index < x:
-
- tdh += struct.pack("<III",
- int(round(flux.index_list[rev]*factor)),
- (len(dat) - len_at_index) // 2,
- 4 + nr_revs*12 + len_at_index)
-
- len_at_index = len(dat)
- rev += 1
- if rev > nr_revs:
-
- self.track_list.append((tdh, dat))
- return
- to_index += flux.index_list[rev]
-
- to_index -= x
- y = x * factor + rem
- val = int(round(y))
- if (val & 65535) == 0:
- val += 1
- rem = y - val
- while val >= 65536:
- dat.append(0)
- dat.append(0)
- val -= 65536
- dat.append(val>>8)
- dat.append(val&255)
-
- while rev <= nr_revs:
- tdh += struct.pack("<III",
- int(round(flux.index_list[rev]*factor)),
- (len(dat) - len_at_index) // 2,
- 4 + nr_revs*12 + len_at_index)
- len_at_index = len(dat)
- rev += 1
- self.track_list.append((tdh, dat))
- def get_image(self):
- s_trk = self.start_cyl * self.nr_sides
- e_trk = s_trk + len(self.track_list) - 1
-
- trk_offs = bytearray(s_trk * 4)
- trk_dat = bytearray()
- for tdh, dat in self.track_list:
- trk_offs += struct.pack("<I", 0x2b0 + len(trk_dat))
- trk_dat += tdh + dat
- trk_offs += bytes(0x2a0 - len(trk_offs))
-
- csum = 0
- for x in trk_offs:
- csum += x
- for x in trk_dat:
- csum += x
-
- header = struct.pack("<3s9BI",
- b"SCP",
- 0,
- 0x80,
- self.nr_revs, s_trk, e_trk,
- 0x01,
- 0,
- 1 if self.nr_sides == 1 else 0,
- 0,
- csum & 0xffffffff)
-
- return header + trk_offs + trk_dat
|