FoenixMCP/C256Mgr/intelhex.py
2021-09-11 22:05:36 -04:00

53 lines
1.6 KiB
Python

import re
class HexFile:
"""Read information from an Intel Hex file."""
file = 0
base_address = 0
handler = 0
def __init__(self):
self.file = 0
self.base_address = 0
self.handler = 0
def open(self, filename):
self.file = open(filename, 'r')
def set_handler(self, proc):
self.handler = proc
def close(self):
self.file.close()
def read_lines(self):
line = self.file.readline()
while line:
self.parse_line(line)
line = self.file.readline()
def parse_line(self, line):
m = re.match("^:([0-9a-fA-F]{2})([0-9a-fA-F]{4})([0-9a-fA-F]{2})([0-9a-fA-F]*)([0-9a-fA-F]{2})", line)
size = int(m.group(1), 16)
address = int(m.group(2), 16)
code = int(m.group(3), 16)
data = m.group(4)
crc = int(m.group(5), 16)
if code == 0:
if self.handler:
# print('Sending record to {:X}'.format(self.base_address + address))
self.handler(self.base_address + address, data)
elif code == 2:
# Set the base address based on a segment
self.base_address = int(data, 16) << 4 # shity 80x86 real mode addressing : take the address an do *16 to get the final address
# print('Setting base address to {:X}'.format(self.base_address))
elif code == 4:
# Set the base address given on address[31..16]
self.base_address = int(data, 16) << 16
# print('Setting base address to {:X}'.format(self.base_address))