Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

56 řádky
1.8KB

  1. """Load Power C runtime-helper objects into the 6502 emulator and compare implementations.
  2. usage (library): h = Helper(obj, base=0x6000, ext={'C$HIGHMEM': 0xC000, ...})
  3. h.addr('C$105')
  4. """
  5. import sys, os, random
  6. sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
  7. from objfmt import Obj
  8. from cpu6502 import CPU
  9. class Helper:
  10. def __init__(self, obj, base, ext):
  11. self.o = obj
  12. self.base = base
  13. self.code = bytearray(obj.code)
  14. for off in obj.reloc: # local absolute operands
  15. v = self.code[off + 1] | self.code[off + 2] << 8
  16. v = (v + base) & 0xFFFF
  17. self.code[off + 1] = v & 255; self.code[off + 2] = v >> 8
  18. syms = {nm: base + off for nm, k, off in obj.defs}
  19. syms.update({k.encode() if isinstance(k, str) else k: v for k, v in ext.items()})
  20. for nm, kind, off in obj.refs:
  21. a = syms[bytes(nm)]
  22. if kind == 0:
  23. self.code[off + 1] = a & 255; self.code[off + 2] = a >> 8
  24. elif kind == 4:
  25. a += 1; self.code[off + 1] = a & 255; self.code[off + 2] = a >> 8
  26. elif kind == 2:
  27. self.code[off + 1] = a & 255
  28. elif kind == 1:
  29. self.code[off + 1] = a >> 8
  30. else:
  31. raise ValueError('kind %d' % kind)
  32. self.syms = syms
  33. def addr(self, name):
  34. return self.syms[name.encode() if isinstance(name, str) else name]
  35. def install(self, cpu):
  36. cpu.m[self.base:self.base + len(self.code)] = self.code
  37. def snapshot(cpu, skip=()):
  38. m = bytes(cpu.m)
  39. return m
  40. def diff_mem(a, b, skip):
  41. out = []
  42. for i in range(65536):
  43. if a[i] != b[i] and not any(lo <= i < hi for lo, hi in skip):
  44. out.append((i, a[i], b[i]))
  45. if len(out) > 8: break
  46. return out

Powered by TurnKey Linux.