mirror of
https://github.com/robmcmullen/atrcopy.git
synced 2024-09-29 10:55:03 +00:00
Added automatic data byte marking for XEX expanded files
This commit is contained in:
parent
39b988863c
commit
3e77cb86bc
@ -2,7 +2,7 @@ import numpy as np
|
|||||||
|
|
||||||
from errors import *
|
from errors import *
|
||||||
from diskimages import DiskImageBase, BaseHeader
|
from diskimages import DiskImageBase, BaseHeader
|
||||||
from segments import EmptySegment, ObjSegment, RawSectorsSegment, DefaultSegment, SegmentSaver
|
from segments import EmptySegment, ObjSegment, RawSectorsSegment, DefaultSegment, SegmentSaver, get_style_bits
|
||||||
from utils import *
|
from utils import *
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
@ -264,7 +264,9 @@ class AtariDosFile(object):
|
|||||||
def parse_segments(self):
|
def parse_segments(self):
|
||||||
r = self.rawdata
|
r = self.rawdata
|
||||||
b = r.get_data()
|
b = r.get_data()
|
||||||
|
s = r.get_style()
|
||||||
pos = 0
|
pos = 0
|
||||||
|
style_pos = 0
|
||||||
first = True
|
first = True
|
||||||
log.debug("Initial parsing: size=%d" % self.size)
|
log.debug("Initial parsing: size=%d" % self.size)
|
||||||
while pos < self.size:
|
while pos < self.size:
|
||||||
@ -286,6 +288,7 @@ class AtariDosFile(object):
|
|||||||
self.segments.append(ObjSegment(r[pos:pos + 4], 0, 0, 0, len(b[pos:pos + 4]), "Short Segment Header"))
|
self.segments.append(ObjSegment(r[pos:pos + 4], 0, 0, 0, len(b[pos:pos + 4]), "Short Segment Header"))
|
||||||
break
|
break
|
||||||
start, end = b[pos:pos + 4].view(dtype='<u2')
|
start, end = b[pos:pos + 4].view(dtype='<u2')
|
||||||
|
s[style_pos:pos + 4] = get_style_bits(data=True)
|
||||||
if end < start:
|
if end < start:
|
||||||
raise InvalidBinaryFile("Nonsensical start and end addresses")
|
raise InvalidBinaryFile("Nonsensical start and end addresses")
|
||||||
count = end - start + 1
|
count = end - start + 1
|
||||||
@ -295,6 +298,7 @@ class AtariDosFile(object):
|
|||||||
break
|
break
|
||||||
self.segments.append(ObjSegment(r[pos + 4:pos + 4 + count], pos, pos + 4, start, end))
|
self.segments.append(ObjSegment(r[pos + 4:pos + 4 + count], pos, pos + 4, start, end))
|
||||||
pos += 4 + count
|
pos += 4 + count
|
||||||
|
style_pos = pos
|
||||||
|
|
||||||
|
|
||||||
class AtrHeader(BaseHeader):
|
class AtrHeader(BaseHeader):
|
||||||
|
@ -15,6 +15,42 @@ match_bit_mask = 0x20
|
|||||||
comment_bit_mask = 0x40
|
comment_bit_mask = 0x40
|
||||||
selected_bit_mask = 0x80
|
selected_bit_mask = 0x80
|
||||||
|
|
||||||
|
def get_style_bits(match=False, comment=False, selected=False, data=False, diff=False, user=0):
|
||||||
|
""" Return an int value that contains the specified style bits set.
|
||||||
|
|
||||||
|
Available styles for each byte are:
|
||||||
|
|
||||||
|
match: part of the currently matched search
|
||||||
|
comment: user commented area
|
||||||
|
selected: selected region
|
||||||
|
data: labeled in the disassembler as a data region (i.e. not disassembled)
|
||||||
|
"""
|
||||||
|
style_bits = 0
|
||||||
|
if user:
|
||||||
|
style_bits |= (user & user_bit_mask)
|
||||||
|
if diff:
|
||||||
|
style_bits |= diff_bit_mask
|
||||||
|
if match:
|
||||||
|
style_bits |= match_bit_mask
|
||||||
|
if comment:
|
||||||
|
style_bits |= comment_bit_mask
|
||||||
|
if data:
|
||||||
|
style_bits |= (data_style & user_bit_mask)
|
||||||
|
if selected:
|
||||||
|
style_bits |= selected_bit_mask
|
||||||
|
return style_bits
|
||||||
|
|
||||||
|
def get_style_mask(**kwargs):
|
||||||
|
"""Get the bit mask that, when anded with data, will turn off the
|
||||||
|
selected bits
|
||||||
|
"""
|
||||||
|
bits = get_style_bits(**kwargs)
|
||||||
|
if 'user' in kwargs and kwargs['user']:
|
||||||
|
bits |= user_bit_mask
|
||||||
|
else:
|
||||||
|
bits &= (0xff ^ user_bit_mask)
|
||||||
|
return 0xff ^ bits
|
||||||
|
|
||||||
|
|
||||||
class SegmentSaver(object):
|
class SegmentSaver(object):
|
||||||
export_data_name = "Raw Data"
|
export_data_name = "Raw Data"
|
||||||
@ -399,41 +435,11 @@ class DefaultSegment(object):
|
|||||||
def tostring(self):
|
def tostring(self):
|
||||||
return self.data.tostring()
|
return self.data.tostring()
|
||||||
|
|
||||||
def get_style_bits(self, match=False, comment=False, selected=False, data=False, diff=False, user=0):
|
def get_style_bits(self, **kwargs):
|
||||||
""" Return an int value that contains the specified style bits set.
|
return get_style_bits(**kwargs)
|
||||||
|
|
||||||
Available styles for each byte are:
|
|
||||||
|
|
||||||
match: part of the currently matched search
|
|
||||||
comment: user commented area
|
|
||||||
selected: selected region
|
|
||||||
data: labeled in the disassembler as a data region (i.e. not disassembled)
|
|
||||||
"""
|
|
||||||
style_bits = 0
|
|
||||||
if user:
|
|
||||||
style_bits |= (user & user_bit_mask)
|
|
||||||
if diff:
|
|
||||||
style_bits |= diff_bit_mask
|
|
||||||
if match:
|
|
||||||
style_bits |= match_bit_mask
|
|
||||||
if comment:
|
|
||||||
style_bits |= comment_bit_mask
|
|
||||||
if data:
|
|
||||||
style_bits |= (data_style & user_bit_mask)
|
|
||||||
if selected:
|
|
||||||
style_bits |= selected_bit_mask
|
|
||||||
return style_bits
|
|
||||||
|
|
||||||
def get_style_mask(self, **kwargs):
|
def get_style_mask(self, **kwargs):
|
||||||
"""Get the bit mask that, when anded with data, will turn off the
|
return get_style_mask(**kwargs)
|
||||||
selected bits
|
|
||||||
"""
|
|
||||||
bits = self.get_style_bits(**kwargs)
|
|
||||||
if 'user' in kwargs and kwargs['user']:
|
|
||||||
bits |= user_bit_mask
|
|
||||||
else:
|
|
||||||
bits &= (0xff ^ user_bit_mask)
|
|
||||||
return 0xff ^ bits
|
|
||||||
|
|
||||||
def set_style_ranges(self, ranges, **kwargs):
|
def set_style_ranges(self, ranges, **kwargs):
|
||||||
style_bits = self.get_style_bits(**kwargs)
|
style_bits = self.get_style_bits(**kwargs)
|
||||||
|
Loading…
Reference in New Issue
Block a user