fixed kboot to work with the 'boot' command to generate a boot disk

This commit is contained in:
Rob McMullen 2018-03-21 17:10:42 -07:00
parent 64ca982b72
commit 79b1e2c413
3 changed files with 26 additions and 3 deletions

View File

@ -251,7 +251,11 @@ def assemble(image, source_files, data_files, obj_files, run_addr=""):
def boot_image(image_name, source_files, data_files, obj_files, run_addr=""):
image_cls = parsers_for_filename(image_name)[0]
try:
image_cls = parsers_for_filename(image_name)[0]
except InvalidDiskImage, e:
print("%s: %s" % (image_name, e))
return None
segments, run_addr = assemble_segments(source_files, data_files, obj_files, run_addr)
if segments:
image = image_cls.create_boot_image(segments, run_addr)

View File

@ -3,7 +3,8 @@ from __future__ import division
import numpy as np
from .errors import *
from .ataridos import AtariDosDirent, AtariDosDiskImage, XexSegment
from .ataridos import AtariDosDirent, AtariDosDiskImage, XexSegment, get_xex
from .segments import SegmentData
class KBootDirent(AtariDosDirent):
@ -68,6 +69,14 @@ class KBootImage(AtariDosDiskImage):
def get_directory_segments(self):
return []
@classmethod
def create_boot_image(cls, segments, run_addr=None):
data_segment, _ = get_xex(segments)
data_bytes = add_xexboot_header(data_segment.data)
raw = SegmentData(data_bytes)
atr = cls(raw, create=True)
return atr
xexboot_header = b'\x00\x03\x00\x07\r\x07L\r\x07\x1c[\x00\x00\xa0\x00\x8c\t\x03\x8c\x04\x03\x8cD\x02\x8c\xe2\x02\x8c\xe3\x02\xc8\x84\t\x8c\x01\x03\xce\x06\x03\xa91\x8d\x00\x03\xa9R\x8d\x02\x03\xa9\x80\x8d\x08\x03\xa9\x01\x8d\x05\x03\xa9\xe3\x8d0\x02\x8d\x02\xd4\xa9\x07\x8d1\x02\x8d\x03\xd4\xa9\x00\xaa\x8d\x0b\x03\xa9\x04\x8d\n\x03 \xbc\x07\xca \xa5\x07\x85C \xa5\x07\x85D%C\xc9\xff\xf0\xf0 \xa5\x07\x85E \xa5\x07\x85F \xa5\x07\x91C\xe6C\xd0\x02\xe6D\xa5E\xc5C\xa5F\xe5D\xb0\xeb\xad\xe2\x02\r\xe3\x02\xf0\xc9\x86\x19 \xa2\x07\xa6\x19\xa0\x00\x8c\xe2\x02\x8c\xe3\x02\xf0\xb8l\xe2\x02\xad\t\x07\xd0\x0b\xad\n\x07\xd0\x03l\xe0\x02\xce\n\x07\xce\t\x07\xe0\x80\x90"\xa9@\x8d\x03\x03 Y\xe4\x10\x06\xce\x01\x07\xd0\xf1\x00\xee\n\x03\xd0\x03\xee\x0b\x03\xad\n\x03\x8d\x19\xd0\xa0\x00\xa2\x00\xbd\x00\x01\xe8`pppppF\xf8\x07p\x07ppp\x06p\x06p\x06A\xe3\x07\x00\x00\x00\x00\x00,/!$).\'\x0e\x0e\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&2/-'

View File

@ -197,7 +197,17 @@ def parsers_for_filename(name):
found = None
for parser in parsers:
log.debug("parser: %s = %s" % (mime, parser))
matches.append(StandardDeliveryImage)
n = name.lower()
if n.endswith(".atr"):
matches.append(KBootImage)
elif n.endswith(".dsk"):
matches.append(StandardDeliveryImage)
else:
try:
_, name = name.rsplit(".", 1)
except ValueError:
pass
raise InvalidDiskImage("no disk image formats that match '%s'" % name)
return matches