Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
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()
Ejemplo n.º 4
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
  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()

Ejemplo n.º 5
0
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
Ejemplo n.º 6
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()