New Commodore 1581 format specifier and *.D81 image support

This commit is contained in:
Keir Fraser
2021-12-13 15:49:05 +00:00
parent f76a2c0037
commit 753d4f5a00
7 changed files with 57 additions and 9 deletions

View File

@@ -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):

View File

@@ -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

View File

@@ -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:

View File

@@ -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()

View File

@@ -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')

View File

@@ -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:

View File

@@ -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: