Эх сурвалжийг харах

New Atari ST format specifiers

Keir Fraser 3 жил өмнө
parent
commit
f76a2c0037

+ 67 - 2
scripts/greaseweazle/codec/formats.py

@@ -33,16 +33,81 @@ class Format_IBM_1440(Format):
         self.decode_track = self.fmt.decode_track
         super().__init__()
 
+class Format_AtariST_360(Format):
+    img_compatible = True
+    default_trackset = 'c=0-79:h=0'
+    def __init__(self):
+        import greaseweazle.codec.ibm.mfm as m
+        self.fmt = m.AtariST_SS_9SPT
+        self.default_revs = m.default_revs
+        self.decode_track = self.fmt.decode_track
+        super().__init__()
+    
+class Format_AtariST_400(Format):
+    img_compatible = True
+    default_trackset = 'c=0-79:h=0'
+    def __init__(self):
+        import greaseweazle.codec.ibm.mfm as m
+        self.fmt = m.AtariST_10SPT
+        self.default_revs = m.default_revs
+        self.decode_track = self.fmt.decode_track
+        super().__init__()
+    
+class Format_AtariST_440(Format):
+    img_compatible = True
+    default_trackset = 'c=0-79:h=0'
+    def __init__(self):
+        import greaseweazle.codec.ibm.mfm as m
+        self.fmt = m.AtariST_11SPT
+        self.default_revs = m.default_revs
+        self.decode_track = self.fmt.decode_track
+        super().__init__()
+    
+class Format_AtariST_720(Format):
+    img_compatible = True
+    def __init__(self):
+        import greaseweazle.codec.ibm.mfm as m
+        self.fmt = m.AtariST_DS_9SPT
+        self.default_revs = m.default_revs
+        self.decode_track = self.fmt.decode_track
+        super().__init__()
+    
+class Format_AtariST_800(Format):
+    img_compatible = True
+    def __init__(self):
+        import greaseweazle.codec.ibm.mfm as m
+        self.fmt = m.AtariST_10SPT
+        self.default_revs = m.default_revs
+        self.decode_track = self.fmt.decode_track
+        super().__init__()
+    
+class Format_AtariST_880(Format):
+    img_compatible = True
+    def __init__(self):
+        import greaseweazle.codec.ibm.mfm as m
+        self.fmt = m.AtariST_11SPT
+        self.default_revs = m.default_revs
+        self.decode_track = self.fmt.decode_track
+        super().__init__()
+    
     
 formats = {
     'amiga.amigados': Format_Amiga_AmigaDOS,
     'ibm.720': Format_IBM_720,
-    'ibm.1440': Format_IBM_1440
+    'ibm.1440': Format_IBM_1440,
+    'atarist.360': Format_AtariST_360,
+    'atarist.400': Format_AtariST_400,
+    'atarist.440': Format_AtariST_440,
+    'atarist.720': Format_AtariST_720,
+    'atarist.800': Format_AtariST_800,
+    'atarist.880': Format_AtariST_880
 }
 
 def print_formats(f = None):
     s = ''
     for k, v in sorted(formats.items()):
         if not f or f(k, v):
-            s += k if not s else ', ' + k
+            if s:
+                s += '\n'
+            s += '  ' + k
     return s

+ 38 - 1
scripts/greaseweazle/codec/ibm/mfm.py

@@ -324,10 +324,23 @@ class IBM_MFM_Formatted(IBM_MFM):
 
 class IBM_MFM_Predefined(IBM_MFM_Formatted):
 
+    cskew = 0
+    hskew = 0
+    interleave = 1
+    
     def __init__(self, cyl, head):
 
         super().__init__(cyl, head)
 
+        # Create logical sector map in rotational order
+        sec_map = [-1] * self.nsec
+        pos = (cyl*self.cskew + head*self.hskew) % self.nsec
+        for i in range(self.nsec):
+            while sec_map[pos] != -1:
+                pos = (pos + 1) % self.nsec
+            sec_map[pos] = i
+            pos = (pos + self.interleave) % self.nsec
+
         pos = self.gap_4a
         if self.gap_1 is not None:
             self.iams = [IAM(pos*16,(pos+4)*16)]
@@ -336,7 +349,7 @@ class IBM_MFM_Predefined(IBM_MFM_Formatted):
         for i in range(self.nsec):
             pos += self.gap_presync
             idam = IDAM(pos*16, (pos+10)*16, 0xffff,
-                        c=cyl, h=head, r=self.id0+i, n = self.sz)
+                        c=cyl, h=head, r=self.id0+sec_map[i], n = self.sz)
             pos += 10 + self.gap_2 + self.gap_presync
             size = 128 << self.sz
             dam = DAM(pos*16, (pos+4+size+2)*16, 0xffff,
@@ -372,6 +385,30 @@ class IBM_MFM_720(IBM_MFM_Predefined):
     id0    = 1
     sz     = 2
 
+class AtariST_SS_9SPT(IBM_MFM_720):
+
+    gap_1 = None
+    cskew = 2
+
+class AtariST_DS_9SPT(IBM_MFM_720):
+
+    gap_1 = None
+    cskew = 4
+    hskew = 2
+
+class AtariST_10SPT(IBM_MFM_720):
+
+    gap_1 = None
+    gap_3 = 30
+    nsec  = 10
+
+class AtariST_11SPT(IBM_MFM_720):
+
+    clock = 2e-6 * 0.96 # long track
+    gap_1 = None
+    gap_3 = 3
+    nsec  = 11
+
 
 def mfm_encode(dat):
     y = 0

+ 2 - 2
scripts/greaseweazle/image/img.py

@@ -16,8 +16,8 @@ class IMG(Image):
     def __init__(self, name, fmt):
         self.to_track = dict()
         error.check(fmt is not None and fmt.img_compatible, """\
-IMG requires compatible format specifier, eg: --format=ibm.1440
-Compatible formats: %s"""
+Sector image requires compatible format specifier
+Compatible formats:\n%s"""
                     % greaseweazle.codec.formats.print_formats(
                         lambda k, v: v.img_compatible))
         self.filename = name

+ 1 - 1
scripts/greaseweazle/tools/read.py

@@ -145,7 +145,7 @@ def main(argv):
             except KeyError as ex:
                 raise error.Fatal("""\
 Unknown format '%s'
-Known formats: %s"""
+Known formats:\n%s"""
                                   % (args.format, formats.print_formats()))
             decoder = args.fmt_cls.decode_track
             def_tracks = util.TrackSet(args.fmt_cls.default_trackset)

+ 1 - 0
scripts/greaseweazle/tools/util.py

@@ -163,6 +163,7 @@ def get_image_class(name):
                     '.hfe': 'HFE',
                     '.ima': 'IMG',
                     '.img': 'IMG',
+                    '.st' : 'IMG',
                     '.ipf': 'IPF',
                     '.dsk': 'EDSK',
                     '.raw': 'KryoFlux' }

+ 1 - 1
scripts/greaseweazle/tools/write.py

@@ -176,7 +176,7 @@ def main(argv):
             except KeyError as ex:
                 raise error.Fatal("""\
 Unknown format '%s'
-Known formats: %s"""
+Known formats:\n%s"""
                                   % (args.format, formats.print_formats()))
             def_tracks = util.TrackSet(args.fmt_cls.default_trackset)
         if def_tracks is None: