robmcmullen / atrcopy Goto Github PK
View Code? Open in Web Editor NEWCommand line utility to manage file systems on Atari 8-bit and Apple ][ disk images.
License: Mozilla Public License 2.0
Command line utility to manage file systems on Atari 8-bit and Apple ][ disk images.
License: Mozilla Public License 2.0
Bitmap sectors (e.g. SpartaDOS's VTOC) are contiguous, pointed to by $10 in the boot sector. Directory sector map is located in the boot sector. Directory entries are stored in a file just like regular files. Sector maps contain list of sectors used by the file, in the order they should be read in to load the file into memory.
Currently, atrcopy only identifies DCM images but does not support actually unpacking them. This would be a good first issue for someone to tackle: it's all stubbed out in dcm.py, so all that needs to be done is the actual file parsing and unpacking. ๐
I have not been able to find a text description of the file format, but I have found some source code examples:
I'm sure I'll get to it eventually, but if you have the desire I will happily accept pull requests!
I updated today and now I just get this
atrcopy /Users/steve/Downloads/atrfilestest/5-dos.atr
Traceback (most recent call last):
File "/usr/local/bin/atrcopy", line 4, in <module>
import atrcopy
File "/usr/local/lib/python3.6/site-packages/atrcopy/__init__.py", line 355
except InvalidDiskImage, e:
^
SyntaxError: invalid syntax
pip removed atrcopy and pip installed it again, it's still the same.
atrcopy new.atr create -f dos2ed+2.5
Fails with a crash
Traceback (most recent call last): File "/usr/local/bin/atrcopy", line 6, in <module> atrcopy.run() File "/usr/local/lib/python2.7/site-packages/atrcopy/__init__.py", line 541, in run create_image(options.template[0], disk_image_name) File "/usr/local/lib/python2.7/site-packages/atrcopy/__init__.py", line 337, in create_image data, inf = get_template_data(template) File "/usr/local/lib/python2.7/site-packages/atrcopy/__init__.py", line 324, in get_template_data raise InvalidDiskImage("Template disk image %s not found" % template) atrcopy.errors.InvalidDiskImage: Template disk image dos2ed+2.5 not found
I uninstalled and reinstalled atrcopy, same problem
pip uninstall atrcopy Uninstalling atrcopy-6.2.0: /usr/local/bin/atrcopy /usr/local/lib/python2.7/site-packages/atrcopy-6.2.0.dist-info/DESCRIPTION.rst /usr/local/lib/python2.7/site-packages/atrcopy-6.2.0.dist-info/INSTALLER /usr/local/lib/python2.7/site-packages/atrcopy-6.2.0.dist-info/METADATA /usr/local/lib/python2.7/site-packages/atrcopy-6.2.0.dist-info/RECORD /usr/local/lib/python2.7/site-packages/atrcopy-6.2.0.dist-info/WHEEL /usr/local/lib/python2.7/site-packages/atrcopy-6.2.0.dist-info/metadata.json /usr/local/lib/python2.7/site-packages/atrcopy-6.2.0.dist-info/top_level.txt /usr/local/lib/python2.7/site-packages/atrcopy/__init__.py /usr/local/lib/python2.7/site-packages/atrcopy/__init__.pyc /usr/local/lib/python2.7/site-packages/atrcopy/_metadata.py /usr/local/lib/python2.7/site-packages/atrcopy/_metadata.pyc /usr/local/lib/python2.7/site-packages/atrcopy/ataridos.py /usr/local/lib/python2.7/site-packages/atrcopy/ataridos.pyc /usr/local/lib/python2.7/site-packages/atrcopy/cartridge.py /usr/local/lib/python2.7/site-packages/atrcopy/cartridge.pyc /usr/local/lib/python2.7/site-packages/atrcopy/diskimages.py /usr/local/lib/python2.7/site-packages/atrcopy/diskimages.pyc /usr/local/lib/python2.7/site-packages/atrcopy/dos33.py /usr/local/lib/python2.7/site-packages/atrcopy/dos33.pyc /usr/local/lib/python2.7/site-packages/atrcopy/errors.py /usr/local/lib/python2.7/site-packages/atrcopy/errors.pyc /usr/local/lib/python2.7/site-packages/atrcopy/fstbt.py /usr/local/lib/python2.7/site-packages/atrcopy/fstbt.pyc /usr/local/lib/python2.7/site-packages/atrcopy/kboot.py /usr/local/lib/python2.7/site-packages/atrcopy/kboot.pyc /usr/local/lib/python2.7/site-packages/atrcopy/mame.py /usr/local/lib/python2.7/site-packages/atrcopy/mame.pyc /usr/local/lib/python2.7/site-packages/atrcopy/parsers.py /usr/local/lib/python2.7/site-packages/atrcopy/parsers.pyc /usr/local/lib/python2.7/site-packages/atrcopy/segments.py /usr/local/lib/python2.7/site-packages/atrcopy/segments.pyc /usr/local/lib/python2.7/site-packages/atrcopy/spartados.py /usr/local/lib/python2.7/site-packages/atrcopy/spartados.pyc /usr/local/lib/python2.7/site-packages/atrcopy/standard_delivery.py /usr/local/lib/python2.7/site-packages/atrcopy/standard_delivery.pyc /usr/local/lib/python2.7/site-packages/atrcopy/templates/dos2dd.atr /usr/local/lib/python2.7/site-packages/atrcopy/templates/dos2dd.atr.inf /usr/local/lib/python2.7/site-packages/atrcopy/templates/dos2ed+2.5.atr /usr/local/lib/python2.7/site-packages/atrcopy/templates/dos2ed+2.5.atr.inf /usr/local/lib/python2.7/site-packages/atrcopy/templates/dos2ed.atr /usr/local/lib/python2.7/site-packages/atrcopy/templates/dos2ed.atr.inf /usr/local/lib/python2.7/site-packages/atrcopy/templates/dos2sd+2.0s.atr /usr/local/lib/python2.7/site-packages/atrcopy/templates/dos2sd+2.0s.atr.inf /usr/local/lib/python2.7/site-packages/atrcopy/templates/dos2sd.atr /usr/local/lib/python2.7/site-packages/atrcopy/templates/dos2sd.atr.inf /usr/local/lib/python2.7/site-packages/atrcopy/templates/dos33.dsk /usr/local/lib/python2.7/site-packages/atrcopy/templates/dos33.dsk.inf /usr/local/lib/python2.7/site-packages/atrcopy/templates/dos33autobrun.dsk /usr/local/lib/python2.7/site-packages/atrcopy/templates/dos33autobrun.dsk.inf /usr/local/lib/python2.7/site-packages/atrcopy/templates/no-json.dsk /usr/local/lib/python2.7/site-packages/atrcopy/templates/no-json.dsk.inf /usr/local/lib/python2.7/site-packages/atrcopy/utils.py /usr/local/lib/python2.7/site-packages/atrcopy/utils.pyc Proceed (y/n)? y Successfully uninstalled atrcopy-6.2.0
ยป ChoccyBook:Altirra-3.00 >pip install atrcopy Collecting atrcopy Requirement already satisfied: numpy in /usr/local/lib/python2.7/site-packages (from atrcopy) Requirement already satisfied: future in /usr/local/lib/python2.7/site-packages (from atrcopy) Installing collected packages: atrcopy Successfully installed atrcopy-6.2.0
ยป ChoccyBook:Altirra-3.00 >atrcopy new.atr create -f dos2ed+2.5 Traceback (most recent call last): File "/usr/local/bin/atrcopy", line 6, in <module> atrcopy.run() File "/usr/local/lib/python2.7/site-packages/atrcopy/__init__.py", line 541, in run create_image(options.template[0], disk_image_name) File "/usr/local/lib/python2.7/site-packages/atrcopy/__init__.py", line 337, in create_image data, inf = get_template_data(template) File "/usr/local/lib/python2.7/site-packages/atrcopy/__init__.py", line 324, in get_template_data raise InvalidDiskImage("Template disk image %s not found" % template) atrcopy.errors.InvalidDiskImage: Template disk image dos2ed+2.5 not found
I was trying atrcopy with https://archive.org/download/Arcade_Games_Collection_Side_1 and found that it couldn't list the catalog.
An Apple //e emulator (mame) can.
It appears 'real Apple DOS 3.3' ignores at least some out of range values for 'sector size' in the VTOC. This particular image has a VTOC sector size of 1 byte! which is super broken.
The following change makes my particular disk image work. However, I don't know if it's the "most correct" change. If you like, I can propose this change as a PR instead. Please let me know.
diff --git a/atrcopy/dos33.py b/atrcopy/dos33.py
index 96b1010..a4b675e 100644
--- a/atrcopy/dos33.py
+++ b/atrcopy/dos33.py
@@ -447,6 +447,8 @@ class Dos33DiskImage(DiskImageBase):
values = data[0:self.vtoc_type.itemsize].view(dtype=self.vtoc_type)[0]
self.header.first_directory = self.header.sector_from_track(values['cat_track'], values['cat_sector'])
self.header.sector_size = int(values['sector_size'])
+ if self.header.sector_size == 1:
+ self.header.sector_size = 256
self.header.max_sectors = int(values['num_tracks']) * int(values['sectors_per_track'])
self.header.ts_pairs = int(values['max_pairs'])
self.header.dos_release = values['dos_release']
I can no longer extract the file from a kboot.
listing a kboot now gives a traceback.
atrcopy kttst.atr
kttst.atr: ATR Disk Image (size=14720 (115x128B), crc=0 flags=0 unused=0) KBoot Format: 14265 byte executable
Traceback (most recent call last):
File "/usr/local/bin/atrcopy", line 6, in <module>
atrcopy.run()
File "/usr/local/lib/python3.6/site-packages/atrcopy/__init__.py", line 589, in run
list_files(parser.image, options.files, options.crc, options.metadata)
File "/usr/local/lib/python3.6/site-packages/atrcopy/__init__.py", line 166, in list_files
print("%s%s" % (dirent, extra))
File "/usr/local/lib/python3.6/site-packages/atrcopy/ataridos.py", line 100, in __str__
return "File #%-2d (%s) %03d %-8s%-3s %03d" % (self.file_num, self.summary, self.starting_sector, self.basename.decode("latin1"), self.ext.decode("latin1"), self.num_sectors)
AttributeError: 'str' object has no attribute 'decode'
From #6:
atrcopy ABBUC\ Magazin\ #44\ \(1996\)\(ABBUC\)\(Side\ A\).atr
Traceback (most recent call last):
File "../run.py", line 6, in <module>
atrcopy.run()
File "/home/rob/src/atrcopy/atrcopy/__init__.py", line 576, in run
parser = find_diskimage(disk_image_name)
File "/home/rob/src/atrcopy/atrcopy/__init__.py", line 66, in find_diskimage
parser = guess_parser_for_mime(mime, rawdata, options.verbose)
File "/home/rob/src/atrcopy/atrcopy/parsers.py", line 165, in guess_parser_for_mime
found = parser(r, True)
File "/home/rob/src/atrcopy/atrcopy/parsers.py", line 28, in __init__
self.parse()
File "/home/rob/src/atrcopy/atrcopy/parsers.py", line 70, in parse
self.image = self.get_image(r)
File "/home/rob/src/atrcopy/atrcopy/parsers.py", line 80, in get_image
return self.image_type(r)
File "/home/rob/src/atrcopy/atrcopy/ataridos.py", line 447, in __init__
DiskImageBase.__init__(self, *args, **kwargs)
File "/home/rob/src/atrcopy/atrcopy/diskimages.py", line 111, in __init__
self.setup()
File "/home/rob/src/atrcopy/atrcopy/diskimages.py", line 152, in setup
self.get_metadata()
File "/home/rob/src/atrcopy/atrcopy/diskimages.py", line 157, in get_metadata
self.get_directory()
File "/home/rob/src/atrcopy/atrcopy/ataridos.py", line 550, in get_directory
log.debug("dirent %d not sane: %s" % (num, dirent))
File "/home/rob/src/atrcopy/atrcopy/ataridos.py", line 101, in __str__
return "File #%-2d (%s) %03d %-8s%-3s %03d" % (self.file_num, self.summary, self.starting_sector, self.basename.decode("utf-8"), self.ext.decode("utf-8"), self.num_sectors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 0: invalid start byte
There code uses numpy.alen, which numpy removed after 1.18.0. Most of the rest of the world has moved on to numpy 1.23 and above.
gmgauthier@plato $ atrcopy FDISK/DOS/ATARI_DOS_2.5.atr (7d0h59m)|*[master]
INFO:atrcopy.parsers:image does not appear to be a container.
INFO:atrcopy.parsers:133136 not found in signature database; skipping sha1 matching
INFO:atrcopy.parsers:checking image type <class 'atrcopy.kboot.KBootImage'>
INFO:atrcopy.parsers:checking image type <class 'atrcopy.spartados.SpartaDosDiskImage'>
INFO:atrcopy.parsers:checking image type <class 'atrcopy.ataridos.AtariDosDiskImage'>
Traceback (most recent call last):
File "/home/gmgauthier/.local/bin/atrcopy", line 12, in <module>
atrcopy.run()
File "/home/gmgauthier/.local/lib/python3.9/site-packages/atrcopy/__init__.py", line 609, in run
parser, mime = find_diskimage(disk_image_name, options.verbose)
File "/home/gmgauthier/.local/lib/python3.9/site-packages/atrcopy/__init__.py", line 94, in find_diskimage
parser, mime = find_diskimage_from_data(data, verbose)
File "/home/gmgauthier/.local/lib/python3.9/site-packages/atrcopy/__init__.py", line 69, in find_diskimage_from_data
parser = guess_parser_for_mime(mime, rawdata, verbose)
File "/home/gmgauthier/.local/lib/python3.9/site-packages/atrcopy/parsers.py", line 262, in guess_parser_for_mime
found = parser(r, True)
File "/home/gmgauthier/.local/lib/python3.9/site-packages/atrcopy/parsers.py", line 33, in __init__
self.parse()
File "/home/gmgauthier/.local/lib/python3.9/site-packages/atrcopy/parsers.py", line 78, in parse
self.image.parse_segments()
File "/home/gmgauthier/.local/lib/python3.9/site-packages/atrcopy/diskimages.py", line 270, in parse_segments
self.segments.extend(self.get_file_segments())
File "/home/gmgauthier/.local/lib/python3.9/site-packages/atrcopy/ataridos.py", line 671, in get_file_segments
segments_in = DiskImageBase.get_file_segments(self)
File "/home/gmgauthier/.local/lib/python3.9/site-packages/atrcopy/diskimages.py", line 305, in get_file_segments
segment = self.get_file_segment(dirent)
File "/home/gmgauthier/.local/lib/python3.9/site-packages/atrcopy/ataridos.py", line 664, in get_file_segment
raw = self.rawdata.get_indexed(byte_order)
File "/home/gmgauthier/.local/lib/python3.9/site-packages/atrcopy/segments.py", line 355, in get_indexed
return SegmentData(data_base, style_base, self.extra, order=base_index)
File "/home/gmgauthier/.local/lib/python3.9/site-packages/atrcopy/segments.py", line 158, in __init__
self.calc_lookups()
File "/home/gmgauthier/.local/lib/python3.9/site-packages/atrcopy/segments.py", line 229, in calc_lookups
self.data_length = len(self.data)
File "/home/gmgauthier/.local/lib/python3.9/site-packages/atrcopy/segments.py", line 101, in __len__
return np.alen(self.order)
File "/home/gmgauthier/.local/lib/python3.9/site-packages/numpy/__init__.py", line 322, in __getattr__
raise AttributeError("module {!r} has no attribute "
AttributeError: module 'numpy' has no attribute 'alen'
Here are all the places in the atrcopy dir, that I modified (simply replacing "np.alen" with "len").
gmgauthier@plato $ grep -rnw . -e '.*alen.*' (476d19h50m)|[master]
./kboot.py:34: num_bytes = np.alen(raw)
./kboot.py:112: bootsize = np.alen(bootcode)
./segments.py:101: return np.alen(self.order)
./segments.py:709: log.info("fixup comments: %d correctly marked, %d without style, %d empty text" % (np.alen(both), np.alen(comment_text_indexes) - np.alen(both), np.alen(has_comments) - np.alen(both)))
./segments.py:783: if np.alen(group) > 0:
./diskimages.py:107: self.size = np.alen(self.bytes)
./diskimages.py:155: self.size = np.alen(self.bytes)
After the local fix in site-packages, it worked fine.
gmgauthier@plato $ atrcopy FDISK/DOS/ATARI_DOS_2.5.atr (7d0h59m)|*[master]
INFO:atrcopy.parsers:image does not appear to be a container.
INFO:atrcopy.parsers:133136 not found in signature database; skipping sha1 matching
INFO:atrcopy.parsers:checking image type <class 'atrcopy.kboot.KBootImage'>
INFO:atrcopy.parsers:checking image type <class 'atrcopy.spartados.SpartaDosDiskImage'>
INFO:atrcopy.parsers:checking image type <class 'atrcopy.ataridos.AtariDosDiskImage'>
FDISK/DOS/ATARI_DOS_2.5.atr: ATR Disk Image (size=133120 (1040x128B), crc=0 flags=0 unused=0) Atari DOS Format: 1010 usable sectors (739 free), 6 files
File #0 (.2.u.*) 004 DOS SYS 037
File #1 (.2.u.*) 041 DUP SYS 042
File #2 (.2.u.*) 083 RAMDISK COM 009
File #3 (.2.u.*) 092 SETUP COM 070
File #4 (.2.u.*) 162 COPY32 COM 056
File #5 (.2.u.*) 218 DISKFIX COM 057
I couldn't create a pull request, due to permissions, so this issue ticket will have to do.
Creating a boot image and then examining it produces:
$ p run.py cent.atr boot -b centipede.xex
XFD Disk Image (size=5585 (43x128B)
adding $6000-$7581 ($1581 @ $0006) from centipede.xex
adding $7ff8-$8000 ($0008 @ $158b) from centipede.xex
adding $0600-$0634 ($0034 @ $1597) from centipede.xex
adding $02e0-$02e2 ($0002 @ $15cf) from centipede.xex
saving boot disk cent.atr
$ p run.py cent.atr
XFD Disk Image (size=6016 (47x128B)
cent.atr: BSAVE data $0300-$0a00 ($0700 @ $0004)
where it should be recognized as a short, valid ATR disk image at least because the header magic is correct.
I've been running atrcopy on a few of my collected disk images and I've noticed that quite a few that are identified in the name as [k-file] and indeed when booted have the "k" in the top left corner are nonetheless not identified as KBOOT by atrcopy.
I've attached one which exhibits this behaviour.
The output I get is this...
atrcopy -v /Users/steve/Emulation/A8/Zipper\ \[PCS\]/Zipper\ \(1984\)\(Small\)\[PCS\]\[k-file\].atr Loading file /Users/steve/Emulation/A8/Zipper [PCS]/Zipper (1984)(Small)[PCS][k-file].atr Trying MIME type application/vnd.atari8bit.atr DEBUG:atrcopy.parsers:Trying <class 'atrcopy.kboot.KBootImage'> INFO:atrcopy.parsers:parser isn't KBootSegmentParser: Sector 360 out of range DEBUG:atrcopy.parsers:Trying <class 'atrcopy.spartados.SpartaDosDiskImage'> INFO:atrcopy.parsers:parser isn't SpartaDosSegmentParser: Invalid SpartaDos parameters in boot header DEBUG:atrcopy.parsers:Trying <class 'atrcopy.ataridos.AtariDosDiskImage'> INFO:atrcopy.parsers:parser isn't AtariDosSegmentParser: Sector 360 out of range DEBUG:atrcopy.parsers:Trying <class 'atrcopy.ataridos.BootDiskImage'> Found parser Atari Boot Disk Image /Users/steve/Emulation/A8/Zipper [PCS]/Zipper (1984)(Small)[PCS][k-file].atr: ATR Disk Image (size=30720 (240x128B), crc=0 flags=0 unused=0) Boot Disk
I have 595 ATR files that atrcopy wont open at all. Mostly non-english, there are a few english language disks in there too, here is an example crash. They all seem to work OK in an emulator.
>atrcopy /Users/steve/Emulation/A8/old_.atr/ABBUC\ Magazin\ \#44\ \(1996\)\(ABBUC\)\(Side\ A\).atr Traceback (most recent call last): File "/usr/local/bin/atrcopy", line 6, in <module> atrcopy.run() File "/usr/local/lib/python2.7/site-packages/atrcopy/__init__.py", line 548, in run parser = find_diskimage(disk_image_name) File "/usr/local/lib/python2.7/site-packages/atrcopy/__init__.py", line 68, in find_diskimage parser = guess_parser_for_mime(mime, rawdata, options.verbose) File "/usr/local/lib/python2.7/site-packages/atrcopy/parsers.py", line 162, in guess_parser_for_mime found = parser(r, True) File "/usr/local/lib/python2.7/site-packages/atrcopy/parsers.py", line 30, in __init__ self.parse() File "/usr/local/lib/python2.7/site-packages/atrcopy/parsers.py", line 72, in parse self.image = self.get_image(r) File "/usr/local/lib/python2.7/site-packages/atrcopy/parsers.py", line 82, in get_image return self.image_type(r) File "/usr/local/lib/python2.7/site-packages/atrcopy/ataridos.py", line 446, in __init__ DiskImageBase.__init__(self, *args, **kwargs) File "/usr/local/lib/python2.7/site-packages/atrcopy/diskimages.py", line 115, in __init__ self.setup() File "/usr/local/lib/python2.7/site-packages/atrcopy/diskimages.py", line 156, in setup self.get_metadata() File "/usr/local/lib/python2.7/site-packages/atrcopy/diskimages.py", line 161, in get_metadata self.get_directory() File "/usr/local/lib/python2.7/site-packages/atrcopy/ataridos.py", line 549, in get_directory log.debug("dirent %d not sane: %s" % (num, dirent)) File "/usr/local/lib/python2.7/site-packages/atrcopy/ataridos.py", line 106, in __str__ return "File #%-2d (%s) %03d %-8s%-3s %03d" % (self.file_num, self.summary, self.starting_sector, self.basename.decode("utf-8"), self.ext.decode("utf-8"), self.num_sectors) File "/usr/local/Cellar/python/2.7.13_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 0: invalid start byte
ABBUC Magazin #44 (1996)(ABBUC)(Side A).atr.zip
Here's another one with a different crash.
atrcopy /Users/steve/Emulation/A8/old_.atr/Jewels\ of\ Darkness\ \#2\ -\ Adventure\ Quest\ \(1983\)\ \(Level\ 9\ Computing\)\ \(GB\)\ .atr Traceback (most recent call last): File "/usr/local/bin/atrcopy", line 6, in <module> atrcopy.run() File "/usr/local/lib/python2.7/site-packages/atrcopy/__init__.py", line 548, in run parser = find_diskimage(disk_image_name) File "/usr/local/lib/python2.7/site-packages/atrcopy/__init__.py", line 68, in find_diskimage parser = guess_parser_for_mime(mime, rawdata, options.verbose) File "/usr/local/lib/python2.7/site-packages/atrcopy/parsers.py", line 162, in guess_parser_for_mime found = parser(r, True) File "/usr/local/lib/python2.7/site-packages/atrcopy/parsers.py", line 30, in __init__ self.parse() File "/usr/local/lib/python2.7/site-packages/atrcopy/parsers.py", line 72, in parse self.image = self.get_image(r) File "/usr/local/lib/python2.7/site-packages/atrcopy/parsers.py", line 82, in get_image return self.image_type(r) File "/usr/local/lib/python2.7/site-packages/atrcopy/spartados.py", line 119, in __init__ AtariDosDiskImage.__init__(self, *args, **kwargs) File "/usr/local/lib/python2.7/site-packages/atrcopy/ataridos.py", line 446, in __init__ DiskImageBase.__init__(self, *args, **kwargs) File "/usr/local/lib/python2.7/site-packages/atrcopy/diskimages.py", line 115, in __init__ self.setup() File "/usr/local/lib/python2.7/site-packages/atrcopy/diskimages.py", line 156, in setup self.get_metadata() File "/usr/local/lib/python2.7/site-packages/atrcopy/diskimages.py", line 161, in get_metadata self.get_directory() File "/usr/local/lib/python2.7/site-packages/atrcopy/spartados.py", line 177, in get_directory d = SpartaDosDirent(self, 0, bytes[0:23], starting_sector=self.root_dir) File "/usr/local/lib/python2.7/site-packages/atrcopy/spartados.py", line 30, in __init__ AtariDosDirent.__init__(self, image, file_num, bytes=bytes) File "/usr/local/lib/python2.7/site-packages/atrcopy/ataridos.py", line 102, in __init__ self.parse_raw_dirent(image, bytes) File "/usr/local/lib/python2.7/site-packages/atrcopy/spartados.py", line 70, in parse_raw_dirent self.filename = str(values['filename']).rstrip() AttributeError: can't set attribute
Jewels of Darkness #2 - Adventure Quest (1983) (Level 9 Computing) (GB) .atr.zip
BAS format (among other formats) is described here: http://www.atarimax.com/jindroush.atari.org/afmt.html
Hi,
There's no way to convert from ATASCII to ASCII, and no related programs linked to, to handle this task.
Sorry for all these bug reports :/
These files are bootable but atrcopy is saying they are BLOAD. For the looks of it they are some kind of tape to disk software so may be mostly just a bunch of binary but there is a bootable bit in there somewhere!
Major effort: support disk image modification at the file level.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.