53 lines
1.6 KiB
Python
Executable file
53 lines
1.6 KiB
Python
Executable file
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))
|
|
|
|
|