def do_build_cmd(args): # get options rom_size = args.rom_size kick_addr = int(args.kick_addr, 16) ext_addr = int(args.ext_addr, 16) kickety_split = args.kickety_split rom_type = args.rom_type fill_byte = int(args.fill_byte, 16) rom_rev = args.rom_rev if rom_rev is not None: rom_rev = map(int, rom_rev.split(".")) add_footer = args.add_footer # select rom builder if rom_type == 'kick': logging.info("building %d KiB Kick ROM @%08x", rom_size, kick_addr) rb = KickRomBuilder(rom_size, base_addr=kick_addr, fill_byte=fill_byte, kickety_split=kickety_split, rom_ver=rom_rev) elif rom_type == 'ext': logging.info("building %d KiB Ext ROM @%08x Rev %r for Kick @%08x", rom_size, ext_addr, rom_rev, kick_addr) rb = ExtRomBuilder(rom_size, base_addr=ext_addr, fill_byte=fill_byte, add_footer=add_footer, rom_ver=rom_rev, kick_addr=kick_addr) else: logging.error("Unknown rom_type=%s", rom_type) return 1 # build file list if args.modules is None: logging.error("No modules given!") return 1 file_list = rb.build_file_list(args.modules) # load modules bf = BinFmt() for f in file_list: name = os.path.basename(f) # load image if bf.is_image(f): bin_img = bf.load_image(f) size = bin_img.get_size() data = None else: # load raw data bin_img = None with open(f, "rb") as fh: data = fh.read() size = len(data) # handle kickety split if kickety_split and rb.cross_kickety_split(size): off = rb.get_rom_offset() logging.info("@%08x: adding kickety split", off) rb.add_kickety_split() off = rb.get_rom_offset() # add image if bin_img is not None: logging.info("@%08x: adding module '%s'", off, f) e = rb.add_bin_img(name, bin_img) if e is None: logging.error("@%08x: can't add module '%s': %s", off, f, rb.get_error()) return 3 # add data else: logging.info("@%08x: adding raw data '%s'", off, f) e = rb.add_module(name, data) if e is None: logging.error("@%08x: can't add raw data '%s': %s", off, f, rb.get_error()) return 3 # build rom off = rb.get_rom_offset() logging.info("@%08x: padding %d bytes with %02x", off, rb.get_bytes_left(), fill_byte) rom_data = rb.build_rom() if rom_data is None: logging.error("building ROM failed: %s", rb.get_error()) return 4 # save rom output = args.output if output is not None: logging.info("saving ROM to '%s'", output) with open(output, "wb") as fh: fh.write(rom_data) return 0
offs += (34, 38, 42) # get relocs to myself (seg 0) relocs = seg.get_reloc(seg) if relocs is not None: raise ValueError("no relocations expected in BlizKick module") relocs = BinImage.Relocations(seg) seg.add_reloc(seg, relocs) # add relocs for o in offs: relocs.add_reloc(BinImage.Reloc(o)) # check if we can remove last data segment (contains only version info) if len(segs) == 2 and segs[1].get_type() == BinImage.SEGMENT_TYPE_DATA: data = segs[1].get_data() if data[:5] == "$VER:": self.bin_img.segments = [seg] # test if __name__ == "__main__": import sys from amitools.binfmt.BinFmt import BinFmt bfmt = BinFmt() for f in sys.argv[1:]: if bfmt.is_image(f): my_bin_img = bfmt.load_image(f) print(my_bin_img) bkm = BlizKickModule(my_bin_img) print((bkm.bk_type)) bkm.fix_module()
offs += ( 34, 38, 42 ) # get relocs to myself (seg 0) relocs = seg.get_reloc(seg) if relocs is not None: raise ValueError("no relocations expected in BlizKick module") relocs = BinImage.Relocations(seg) seg.add_reloc(seg, relocs) # add relocs for o in offs: relocs.add_reloc(BinImage.Reloc(o)) # check if we can remove last data segment (contains only version info) if len(segs) == 2 and segs[1].get_type() == BinImage.SEGMENT_TYPE_DATA: data = segs[1].get_data() if data[:5] == '$VER:': self.bin_img.segments = [seg] # test if __name__ == '__main__': import sys from amitools.binfmt.BinFmt import BinFmt bf = BinFmt() for f in sys.argv[1:]: if bf.is_image(f): bin_img = bf.load_image(f) print(bin_img) bkm = BlizKickModule(bin_img) print(bkm.bk_type) bkm.fix_module()
def do_build_cmd(args): # get options rom_size = args.rom_size kick_addr = int(args.kick_addr, 16) ext_addr = int(args.ext_addr, 16) kickety_split = args.kickety_split rom_type = args.rom_type fill_byte = int(args.fill_byte, 16) rom_rev = args.rom_rev if rom_rev is not None: rom_rev = list(map(int, rom_rev.split("."))) add_footer = args.add_footer # select rom builder if rom_type == "kick": logging.info("building %d KiB Kick ROM @%08x", rom_size, kick_addr) rb = rom.KickRomBuilder( rom_size, base_addr=kick_addr, fill_byte=fill_byte, kickety_split=kickety_split, rom_ver=rom_rev, ) elif rom_type == "ext": logging.info( "building %d KiB Ext ROM @%08x Rev %r for Kick @%08x", rom_size, ext_addr, rom_rev, kick_addr, ) rb = rom.ExtRomBuilder( rom_size, base_addr=ext_addr, fill_byte=fill_byte, add_footer=add_footer, rom_ver=rom_rev, kick_addr=kick_addr, ) else: logging.error("Unknown rom_type=%s", rom_type) return 1 # build file list if args.modules is None: logging.error("No modules given!") return 1 file_list = rb.build_file_list(args.modules) # load modules bf = BinFmt() for f in file_list: logging.info("adding file '%s'", f) name = os.path.basename(f) # load image if bf.is_image(f): bin_img = bf.load_image(f) # is it a blizkick module? bkm = rom.BlizKickModule(bin_img) if bkm.get_type() == "module": bkm.fix_module() elif bkm.get_type() == "patch": logging.error("BlizKick Patches are not supported, yet: %s", name) return 5 # get image params size = bin_img.get_size() data = None else: # load raw data bin_img = None with open(f, "rb") as fh: data = fh.read() size = len(data) # calc long word padding padding = 0 if size & 3 != 0: padding = 4 - size & 3 # handle kickety split if kickety_split and rb.cross_kickety_split(size + padding): off = rb.get_rom_offset() logging.info("@%08x: adding kickety split", off) rb.add_kickety_split() off = rb.get_rom_offset() # add image if bin_img is not None: logging.info("@%08x: adding module '%s'", off, f) e = rb.add_bin_img(name, bin_img) if e is None: logging.error("@%08x: can't add module '%s': %s", off, f, rb.get_error()) return 3 # add data else: logging.info("@%08x: adding raw data '%s'", off, f) e = rb.add_module(name, data) if e is None: logging.error("@%08x: can't add raw data '%s': %s", off, f, rb.get_error()) return 3 # add long word padding? if padding != 0: off = rb.get_rom_offset() logging.info("@%08x: adding padding: +%d" % (off, padding)) e = rb.add_padding(padding) if e is None: logging.error("@%08x: can't add padding: %s", off, rb.get_error()) return 3 # build rom off = rb.get_rom_offset() logging.info("@%08x: padding %d bytes with %02x", off, rb.get_bytes_left(), fill_byte) rom_data = rb.build_rom() if rom_data is None: logging.error("building ROM failed: %s", rb.get_error()) return 4 # save rom output = args.output if output is not None: logging.info("saving ROM to '%s'", output) with open(output, "wb") as fh: fh.write(rom_data) return 0
if auto_init: offs += (34, 38, 42) # get relocs to myself (seg 0) relocs = seg.get_reloc(seg) if relocs is not None: raise ValueError("no relocations expected in BlizKick module") relocs = BinImage.Relocations(seg) seg.add_reloc(seg, relocs) # add relocs for o in offs: relocs.add_reloc(BinImage.Reloc(o)) # check if we can remove last data segment (contains only version info) if len(segs) == 2 and segs[1].get_type() == BinImage.SEGMENT_TYPE_DATA: data = segs[1].get_data() if data[:5] == '$VER:': self.bin_img.segments = [seg] # test if __name__ == '__main__': import sys from amitools.binfmt.BinFmt import BinFmt bf = BinFmt() for f in sys.argv[1:]: if bf.is_image(f): bin_img = bf.load_image(f) print(bin_img) bkm = BlizKickModule(bin_img) print(bkm.bk_type) bkm.fix_module()