12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- from greaseweazle import error
- import greaseweazle.codec.amiga.amigados as amigados
- from .image import Image
- class ADF(Image):
- default_format = 'amiga.amigados'
- def __init__(self):
- self.sec_per_track = 11
- self.to_track = dict()
- @classmethod
- def from_file(cls, name):
- with open(name, "rb") as f:
- dat = f.read()
- adf = cls()
- nsec = adf.sec_per_track
- error.check((len(dat) % (2*nsec*512)) == 0, "Bad ADF image")
- ncyl = len(dat) // (2*nsec*512)
- if ncyl > 90:
- ncyl //= 2
- nsec *= 2
- adf.sec_per_track = nsec
- for tnr in range(ncyl*2):
- ados = amigados.AmigaDOS(tracknr=tnr, nsec=nsec)
- ados.set_adf_track(dat[tnr*nsec*512:(tnr+1)*nsec*512])
- adf.to_track[tnr] = ados
- return adf
- def get_track(self, cyl, side):
- tnr = cyl * 2 + side
- if not tnr in self.to_track:
- return None
- return self.to_track[tnr].raw_track()
- def emit_track(self, cyl, side, track):
- tnr = cyl * 2 + side
- self.to_track[tnr] = track
- def get_image(self):
- tdat = bytearray()
- ntracks = max(self.to_track, default=0) + 1
- for tnr in range(ntracks):
- t = self.to_track[tnr] if tnr in self.to_track else None
- if t is not None and hasattr(t, 'get_adf_track'):
- tdat += t.get_adf_track()
- elif tnr < 160:
-
- tdat += amigados.bad_sector * self.sec_per_track
- else:
-
- break
- if ntracks < 160:
- tdat += amigados.bad_sector * self.sec_per_track * (160 - ntracks)
- return tdat
|