2017-02-19 23:49:06 +00:00
__version__ = " 3.4.0 "
2016-04-13 00:13:33 +00:00
import logging
2016-02-13 04:36:33 +00:00
try :
import numpy as np
except ImportError :
raise RuntimeError ( " atrcopy %s requires numpy " % __version__ )
from errors import *
2017-02-23 23:34:56 +00:00
from ataridos import AtrHeader , AtariDosDiskImage , BootDiskImage , AtariDosFile , get_xex , add_atr_header
2017-02-22 20:11:28 +00:00
from dos33 import Dos33DiskImage
2016-05-06 00:44:20 +00:00
from kboot import KBootImage , add_xexboot_header
2017-02-17 08:06:27 +00:00
from segments import SegmentData , SegmentSaver , DefaultSegment , EmptySegment , ObjSegment , RawSectorsSegment , user_bit_mask , match_bit_mask , comment_bit_mask , data_style , selected_bit_mask , diff_bit_mask , not_user_bit_mask , interleave_segments
2016-02-13 04:36:33 +00:00
from spartados import SpartaDosDiskImage
2016-06-03 20:05:16 +00:00
from cartridge import A8CartHeader , AtariCartImage
2016-06-03 19:40:48 +00:00
from parsers import SegmentParser , DefaultSegmentParser , guess_parser_for_mime , guess_parser_for_system , iter_parsers , iter_known_segment_parsers , mime_parse_order
2016-02-13 04:36:33 +00:00
from utils import to_numpy
2016-02-13 05:36:08 +00:00
2016-02-13 04:36:33 +00:00
def process ( image , dirent , options ) :
skip = False
action = " copying to "
filename = dirent . get_filename ( )
outfilename = filename
if options . no_sys :
if dirent . ext == " SYS " :
skip = True
action = " skipping system file "
if not skip :
if options . xex :
outfilename = " %s %s .XEX " % ( dirent . filename , dirent . ext )
if options . lower :
outfilename = outfilename . lower ( )
if options . dry_run :
action = " DRY_RUN: %s " % action
skip = True
if options . extract :
print " %s : %s %s " % ( dirent , action , outfilename )
if not skip :
bytes = image . get_file ( dirent )
with open ( outfilename , " wb " ) as fh :
fh . write ( bytes )
else :
print dirent
def run ( ) :
import sys
import argparse
parser = argparse . ArgumentParser ( description = " Extract images off ATR format disks " )
parser . add_argument ( " -v " , " --verbose " , default = 0 , action = " count " )
parser . add_argument ( " -d " , " --debug " , action = " store_true " , default = False , help = " debug the currently under-development parser " )
parser . add_argument ( " -l " , " --lower " , action = " store_true " , default = False , help = " convert filenames to lower case " )
parser . add_argument ( " --dry-run " , action = " store_true " , default = False , help = " don ' t extract, just show what would have been extracted " )
parser . add_argument ( " -n " , " --no-sys " , action = " store_true " , default = False , help = " only extract things that look like games (no DOS or .SYS files) " )
parser . add_argument ( " -x " , " --extract " , action = " store_true " , default = False , help = " extract files " )
parser . add_argument ( " --xex " , action = " store_true " , default = False , help = " add .xex extension " )
parser . add_argument ( " -f " , " --force " , action = " store_true " , default = False , help = " force operation on disk images that have bad directory entries or look like boot disks " )
parser . add_argument ( " files " , metavar = " ATR " , nargs = " + " , help = " an ATR image file [or a list of them] " )
parser . add_argument ( " -s " , " --segments " , action = " store_true " , default = False , help = " display segments " )
options , extra_args = parser . parse_known_args ( )
2016-04-13 00:13:33 +00:00
# Turn off debug messages by default
log = logging . getLogger ( " atrcopy " )
if options . verbose :
log . setLevel ( logging . DEBUG )
else :
log . setLevel ( logging . INFO )
2016-02-13 04:36:33 +00:00
for filename in options . files :
with open ( filename , " rb " ) as fh :
2016-06-01 21:54:52 +00:00
if options . verbose :
print " Loading file %s " % filename
2016-03-25 23:07:16 +00:00
rawdata = SegmentData ( fh . read ( ) )
2016-06-01 21:54:52 +00:00
parser = None
for mime in mime_parse_order :
if options . verbose :
print " Trying MIME type %s " % mime
2016-10-02 01:42:39 +00:00
parser = guess_parser_for_mime ( mime , rawdata , options . verbose )
2016-06-01 21:54:52 +00:00
if parser is None :
2016-02-13 04:36:33 +00:00
continue
2016-06-01 21:54:52 +00:00
if options . verbose :
print " Found parser %s " % parser . menu_name
print " %s : %s " % ( filename , parser . image )
if options . segments :
print " \n " . join ( [ str ( a ) for a in parser . segments ] )
elif parser . image . files or options . force :
for dirent in parser . image . files :
try :
process ( parser . image , dirent , options )
except FileNumberMismatchError164 :
print " Error 164: %s " % str ( dirent )
except ByteNotInFile166 :
print " Invalid sector for: %s " % str ( dirent )
break
if parser is None :
print " %s : Unknown file type " % filename