inc2o.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #! /usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. #
  4. # Alexander Shiryaev, 2019.05, 2022.09
  5. #
  6. import sys
  7. def getKV (l):
  8. k, v = l.split('EQU')
  9. k = k.strip()
  10. assert 'H' in v
  11. v = v.split("'")[1]
  12. v = int(v, 16)
  13. return k, v
  14. def load (fileName):
  15. fh = open(fileName, 'rb')
  16. banks = {}
  17. allSfrs = {}
  18. allBits = {}
  19. s = 0
  20. lineNo = 0
  21. vOld = None
  22. while True:
  23. l = fh.readline()
  24. if l == b'':
  25. break
  26. l = l.strip().decode('ascii')
  27. if s == 0:
  28. if l.startswith(';') and ('Bank' in l):
  29. cmtBank = int(l.split('Bank')[1].split('-')[0])
  30. s = 1
  31. elif s == 1:
  32. if 'EQU' in l:
  33. k, v = getKV(l)
  34. k0 = k.replace('_', '')
  35. bank = v // 128
  36. if vOld is not None:
  37. assert vOld <= v
  38. vOld = v
  39. if bank != cmtBank:
  40. print(lineNo, l, cmtBank, bank)
  41. assert False
  42. if bank in banks:
  43. d = banks[bank]
  44. else:
  45. d = {}
  46. banks[bank] = d
  47. assert k0 not in d
  48. q = [ k, v, {} ]
  49. d[k0] = q
  50. assert k0 not in allSfrs
  51. allSfrs[k0] = q
  52. elif l == '':
  53. pass
  54. elif l.startswith(';') and ('Bank' in l):
  55. cmtBank = int(l.split('Bank')[1].split('-')[0])
  56. elif l.startswith(';') and ('Bits' in l):
  57. cmtSfr = l[1:].split('Bits')[0].replace('-', '').strip()
  58. s = 2
  59. else:
  60. s = 3
  61. elif s == 2:
  62. if 'EQU' in l:
  63. k, v = getKV(l)
  64. k0 = k.replace('_', '')
  65. assert (v >= 0) and (v <= 7)
  66. bits = None
  67. for b, sfrs in banks.items():
  68. for sfr, q in sfrs.items():
  69. if q[0] == cmtSfr:
  70. bits = q[2]
  71. assert bits is not None
  72. assert k0 not in bits
  73. q = [ k, v ]
  74. if k0 in allBits:
  75. assert allBits[k0] == q
  76. bits[k0] = [ k, v, 1 ] # duplicate
  77. else:
  78. allBits[k0] = q
  79. bits[k0] = [ k, v, 0 ] # first occurence
  80. elif l == '':
  81. pass
  82. elif l.startswith(';') and ('Bits' in l):
  83. cmtSfr = l[1:].split('Bits')[0].replace('-', '').strip()
  84. else:
  85. s = 3
  86. lineNo += 1
  87. fh.close()
  88. return banks
  89. def optimizeBits (sfr, bits):
  90. reject = []
  91. for k, v in bits.items():
  92. if k.endswith('0'):
  93. baseName = k[:-1]
  94. y = []
  95. for x in range(8):
  96. name = baseName + str(x)
  97. if name in bits.keys():
  98. if bits[name][1] == x:
  99. y.append(x)
  100. else:
  101. y = []
  102. break
  103. if (y == [0, 1, 2, 3]) or (y == [0, 1, 2, 3, 4]) or (y == [0, 1, 2, 3, 4, 5]) or (y == [0, 1, 2, 3, 4, 5, 6]) or (y == [0, 1, 2, 3, 4, 5, 6, 7]):
  104. for yy in y:
  105. name = baseName + str(yy)
  106. reject.append(name)
  107. elif k.endswith('8'):
  108. baseName = k[:-1]
  109. y = []
  110. for x in range(8):
  111. name = baseName + str(x + 8)
  112. if name in bits.keys():
  113. if bits[name][1] == x:
  114. y.append(x)
  115. else:
  116. y = []
  117. break
  118. if y == [0, 1, 2, 3, 4, 5, 6, 7]:
  119. for yy in y:
  120. name = baseName + str(yy + 8)
  121. reject.append(name)
  122. newBits = {}
  123. for k, v in bits.items():
  124. q = [ v[0], v[1], v[2] ]
  125. if k in reject:
  126. q[2] += 2 # rejected
  127. newBits[k] = q
  128. return newBits
  129. def optimize (banks):
  130. r = {}
  131. for bank, sfrs in banks.items():
  132. d = {}
  133. r[bank] = d
  134. for sfr0, q in sfrs.items():
  135. sfr, addr, bits = q
  136. d[sfr0] = [ sfr, addr, optimizeBits(sfr, bits) ]
  137. return r
  138. def formatBank (bank, sfrs):
  139. r = [ "(* Bank %s *)" % (bank,) ]
  140. rr = []
  141. for k, v in sfrs.items():
  142. rr.append( (k, v) )
  143. # rr.sort(key=lambda x: x[1][1])
  144. for k, v in rr:
  145. if v[0] != k:
  146. s2 = " (* %s *)" % (v[0],)
  147. else:
  148. s2 = ''
  149. r.append(' enter1("%s", var, setT, 0%XH);%s' % (k, v[1], s2))
  150. for k1, v1 in v[2].items():
  151. if v1[0] != k1:
  152. s2 = " (* %s *)" % (v1[0],)
  153. else:
  154. s2 = ''
  155. s = 'enter1("%s", con, intT, %s);%s' % (k1, v1[1], s2)
  156. if v1[2] == 0:
  157. pass
  158. elif v1[2] == 1:
  159. s = None
  160. else:
  161. # s = "(* " + s + " *)"
  162. s = None
  163. if s is not None:
  164. r.append(' ' + s)
  165. return r
  166. def format (banks):
  167. r = []
  168. bank = min(banks.keys())
  169. while bank <= max(banks.keys()):
  170. if bank in banks:
  171. r.extend(formatBank(bank, banks[bank]))
  172. bank += 1
  173. return '\n'.join(r)
  174. def main ():
  175. data = load(sys.argv[1])
  176. data = optimize(data)
  177. s = format(data)
  178. print(s)
  179. if __name__ == '__main__':
  180. main()