ihex.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. class ihex:
  2. def __init__(self,filename):
  3. self.filename = filename
  4. self.mem = {}
  5. def verify(self,line,cksum):
  6. start = line.find(':')
  7. if start < 0:
  8. return None
  9. def hexstr(self,num,size):
  10. h = hex(num)[2:]
  11. os = '0' * (size - len(h)) + h
  12. return os
  13. def parseline(self, line):
  14. start = line.find(':')
  15. if start < 0:
  16. return None
  17. datalen = int(line[start+1:start+3],16)
  18. address = int(line[start+3:start+7],16)
  19. recordtype = int(line[start+7:start+9],16)
  20. data = line[start+9:start+9+datalen*2]
  21. cksum = int(line[start+9+datalen*2:start+11+datalen*2],16)
  22. return address,recordtype,data,cksum
  23. def load(self):
  24. self.mem = {}
  25. with open(self.filename,'r') as infile:
  26. pc = 0
  27. for line in infile.readlines():
  28. address,recordtype,data,cksum = self.parseline(line)
  29. if recordtype == 0x04:
  30. pc = int(data,16) * 65536
  31. if recordtype == 0x00:
  32. if not pc in self.mem:
  33. self.mem[pc]=[]
  34. while len(self.mem[pc]) < address+len(data)//2:
  35. self.mem[pc].append(0)
  36. for i in range(len(data)//2):
  37. self.mem[pc][address+i]=int(data[2*i:2*i+2],16)
  38. def save(self):
  39. for pc in self.mem:
  40. pass
  41. def fetch(self,address):
  42. pc = address // 65536
  43. offset = address - (pc * 65536)
  44. return self.mem[pc][offset]
  45. def set(self,address,value):
  46. pc = address // 65536
  47. offset = address - (pc * 65536)
  48. self.mem[pc][offset] = value
  49. def __str__(self):
  50. os = ''
  51. for pc in self.mem:
  52. for i in range(len(self.mem[pc])):
  53. if i % 16 == 0:
  54. os += '\n' + self.hexstr(pc+i,8) + ': '
  55. os += self.hexstr(self.mem[pc][i],2) + ' '
  56. os += '\n'
  57. return os
  58. def __repr__(self):
  59. return 'repr'
  60. if __name__ == '__main__':
  61. ih = ihex('test.ihex')
  62. ih.load()
  63. print(ih)