# -*- coding: UTF-8 -*-
#-------------------------------------------------------------------------------
# Copyright (c) 2011 Trenz Electronic GmbH
#------------------------------------------------------------------------------- 
# Author: Oleksandr Kiyenko <a.kienko@gmail.com>
#-------------------------------------------------------------------------------
from optparse import OptionParser
import os.path
import sys

parser = OptionParser()
parser.add_option("-f", "--file", dest="filename",
                  help="read binary data from FILE", metavar="FILE")
parser.add_option("-s", "--sector", type="int", dest="sector",
                  help="start SECTOR", metavar="SECTOR", default=0)
(options, args) = parser.parse_args()
			
if not os.path.exists(options.filename):
	print "No file to load, use -f FILE"
	sys.exit()
	
bindata = open(options.filename,"rb").read()

def toHex(s):
    lst = []
    for ch in s:
        hv = hex(ord(ch)).replace('0x', '')
        if len(hv) == 1:
            hv = '0'+hv
        lst.append(hv)
    return reduce(lambda x,y:x+y, lst)
	
def get_cs(s):
	sum = 0
	for i in s:
		sum += ord(i)
	cs = ~sum + 1
	return cs & 0xFF
	
bindata_size = len(bindata)
addr = 0
while addr < bindata_size:	# cycle to the oen of file
	sector_rem = 0x00ffff - (addr & 0x00ffff)   # sector remainder
	if sector_rem == 0xffff:
		bs = []
		bs.append(chr(0x02))
		bs.append(chr(0x00))
		bs.append(chr(0x00))
		bs.append(chr(0x04))
		bs.append(chr((addr + (options.sector << 16)) >> 24 & 0xFF))
		bs.append(chr((addr + (options.sector << 16)) >> 16 & 0xFF))
		bs.append(chr(get_cs(bs)))
		print ":"+toHex(bs).upper()
	if (bindata_size - addr) > 16:
		wr_block_size = 16
	else:
		wr_block_size = bindata_size - addr
	bs = []
	bs.append(chr(wr_block_size))
	bs.append(chr(addr >> 8 & 0xFF))
	bs.append(chr(addr & 0xFF))
	bs.append(chr(0x00))
	for wr_block_cnt in range(wr_block_size):
		bs.append(bindata[addr + wr_block_cnt])
	bs.append(chr(get_cs(bs)))
	print ":"+toHex(bs).upper()
	addr += wr_block_size
print ":00000001FF"
