浏览代码

New Commodore 1581 format specifier and *.D81 image support

Keir Fraser 3 年之前
父节点
当前提交
753d4f5a00

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

@@ -1,11 +1,19 @@
+# greaseweazle/codec/formats.py
+#
+# Written & released by Keir Fraser <keir.xen@gmail.com>
+#
+# This is free and unencumbered software released into the public domain.
+# See the file COPYING for more details, or visit <http://unlicense.org>.
 
 from greaseweazle.tools import util
 
 class Format:
     img_compatible = False
     default_trackset = 'c=0-79:h=0-1'
+    max_trackset = 'c=0-81:h=0-1'
     def __init__(self):
-        self.tracks = util.TrackSet(self.default_trackset)
+        self.default_tracks = util.TrackSet(self.default_trackset)
+        self.max_tracks = util.TrackSet(self.max_trackset)
 
 class Format_Amiga_AmigaDOS(Format):
     def __init__(self):
@@ -24,6 +32,15 @@ class Format_IBM_720(Format):
         self.decode_track = self.fmt.decode_track
         super().__init__()
     
+class Format_IBM_800(Format):
+    img_compatible = True
+    def __init__(self):
+        import greaseweazle.codec.ibm.mfm as m
+        self.fmt = m.IBM_MFM_800
+        self.default_revs = m.default_revs
+        self.decode_track = self.fmt.decode_track
+        super().__init__()
+    
 class Format_IBM_1440(Format):
     img_compatible = True
     def __init__(self):
@@ -36,6 +53,7 @@ class Format_IBM_1440(Format):
 class Format_AtariST_360(Format):
     img_compatible = True
     default_trackset = 'c=0-79:h=0'
+    max_trackset = 'c=0-81:h=0'
     def __init__(self):
         import greaseweazle.codec.ibm.mfm as m
         self.fmt = m.AtariST_SS_9SPT
@@ -46,6 +64,7 @@ class Format_AtariST_360(Format):
 class Format_AtariST_400(Format):
     img_compatible = True
     default_trackset = 'c=0-79:h=0'
+    max_trackset = 'c=0-81:h=0'
     def __init__(self):
         import greaseweazle.codec.ibm.mfm as m
         self.fmt = m.AtariST_10SPT
@@ -56,6 +75,7 @@ class Format_AtariST_400(Format):
 class Format_AtariST_440(Format):
     img_compatible = True
     default_trackset = 'c=0-79:h=0'
+    max_trackset = 'c=0-81:h=0'
     def __init__(self):
         import greaseweazle.codec.ibm.mfm as m
         self.fmt = m.AtariST_11SPT
@@ -100,7 +120,8 @@ formats = {
     'atarist.440': Format_AtariST_440,
     'atarist.720': Format_AtariST_720,
     'atarist.800': Format_AtariST_800,
-    'atarist.880': Format_AtariST_880
+    'atarist.880': Format_AtariST_880,
+    'commodore.1581': Format_IBM_800,
 }
 
 def print_formats(f = None):

+ 5 - 0
scripts/greaseweazle/codec/ibm/mfm.py

@@ -385,6 +385,11 @@ class IBM_MFM_720(IBM_MFM_Predefined):
     id0    = 1
     sz     = 2
 
+class IBM_MFM_800(IBM_MFM_720):
+
+    gap_3 = 30
+    nsec  = 10
+
 class AtariST_SS_9SPT(IBM_MFM_720):
 
     gap_1 = None

+ 15 - 0
scripts/greaseweazle/image/d81.py

@@ -0,0 +1,15 @@
+# greaseweazle/image/d81.py
+#
+# Written & released by Keir Fraser <keir.xen@gmail.com>
+#
+# This is free and unencumbered software released into the public domain.
+# See the file COPYING for more details, or visit <http://unlicense.org>.
+
+from greaseweazle.image.img import IMG
+
+class D81(IMG):
+    sides_swapped = True
+
+# Local variables:
+# python-indent: 4
+# End:

+ 7 - 1
scripts/greaseweazle/image/img.py

@@ -13,6 +13,8 @@ import greaseweazle.codec.formats
 
 class IMG(Image):
 
+    sides_swapped = False
+    
     def __init__(self, name, fmt):
         self.to_track = dict()
         error.check(fmt is not None and fmt.img_compatible, """\
@@ -33,8 +35,10 @@ Compatible formats:\n%s"""
         img = cls(name, fmt)
 
         pos = 0
-        for t in fmt.tracks:
+        for t in fmt.max_tracks:
             cyl, head = t.cyl, t.head
+            if img.sides_swapped:
+                head ^= 1
             track = fmt.fmt(cyl, head)
             pos += track.set_img_track(dat[pos:])
             img.to_track[cyl,head] = track
@@ -67,6 +71,8 @@ Compatible formats:\n%s"""
 
         for cyl in range(n_cyl):
             for head in range(n_side):
+                if self.sides_swapped:
+                    head ^= 1
                 if (cyl,head) in self.to_track:
                     tdat += self.to_track[cyl,head].get_img_track()
 

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

@@ -148,7 +148,7 @@ Unknown format '%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)
+            def_tracks = args.fmt_cls.default_tracks
             if args.revs is None: args.revs = args.fmt_cls.default_revs
         if def_tracks is None:
             def_tracks = util.TrackSet('c=0-81:h=0-1')

+ 5 - 4
scripts/greaseweazle/tools/util.py

@@ -159,14 +159,15 @@ def split_opts(seq):
 
 def get_image_class(name):
     image_types = { '.adf': 'ADF',
-                    '.scp': 'SCP',
+                    '.d81': 'D81',
+                    '.dsk': 'EDSK',
                     '.hfe': 'HFE',
                     '.ima': 'IMG',
                     '.img': 'IMG',
-                    '.st' : 'IMG',
                     '.ipf': 'IPF',
-                    '.dsk': 'EDSK',
-                    '.raw': 'KryoFlux' }
+                    '.raw': 'KryoFlux',
+                    '.scp': 'SCP',
+                    '.st' : 'IMG' }
     if os.path.isdir(name):
         typename = 'KryoFlux'
     else:

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

@@ -178,7 +178,7 @@ def main(argv):
 Unknown format '%s'
 Known formats:\n%s"""
                                   % (args.format, formats.print_formats()))
-            def_tracks = util.TrackSet(args.fmt_cls.default_trackset)
+            def_tracks = args.fmt_cls.default_tracks
         if def_tracks is None:
             def_tracks = util.TrackSet('c=0-81:h=0-1')
         if args.tracks is not None: