img.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. # greaseweazle/image/img.py
  2. #
  3. # Written & released by Keir Fraser <keir.xen@gmail.com>
  4. #
  5. # This is free and unencumbered software released into the public domain.
  6. # See the file COPYING for more details, or visit <http://unlicense.org>.
  7. from greaseweazle import error
  8. from greaseweazle.codec.ibm import mfm
  9. from .image import Image
  10. from greaseweazle.codec import formats
  11. class IMG(Image):
  12. sides_swapped = False
  13. def __init__(self, name, fmt):
  14. self.to_track = dict()
  15. error.check(fmt is not None and fmt.img_compatible, """\
  16. Sector image requires compatible format specifier
  17. Compatible formats:\n%s"""
  18. % formats.print_formats(
  19. lambda k, v: v.img_compatible))
  20. self.filename = name
  21. self.fmt = fmt
  22. @classmethod
  23. def from_file(cls, name, fmt):
  24. with open(name, "rb") as f:
  25. dat = f.read()
  26. img = cls(name, fmt)
  27. pos = 0
  28. for t in fmt.max_tracks:
  29. cyl, head = t.cyl, t.head
  30. if img.sides_swapped:
  31. head ^= 1
  32. track = fmt.fmt(cyl, head)
  33. pos += track.set_img_track(dat[pos:])
  34. img.to_track[cyl,head] = track
  35. return img
  36. @classmethod
  37. def to_file(cls, name, fmt=None):
  38. return cls(name, fmt)
  39. def get_track(self, cyl, side):
  40. if (cyl,side) not in self.to_track:
  41. return None
  42. return self.to_track[cyl,side].raw_track()
  43. def emit_track(self, cyl, side, track):
  44. self.to_track[cyl,side] = track
  45. def get_image(self):
  46. tdat = bytearray()
  47. n_side = 2
  48. n_cyl = max(self.to_track.keys(), default=(0), key=lambda x:x[0])[0]
  49. n_cyl += 1
  50. for cyl in range(n_cyl):
  51. for head in range(n_side):
  52. if self.sides_swapped:
  53. head ^= 1
  54. if (cyl,head) in self.to_track:
  55. tdat += self.to_track[cyl,head].get_img_track()
  56. return tdat
  57. # Local variables:
  58. # python-indent: 4
  59. # End: