Guest User

Untitled

a guest
Feb 18th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.24 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. # Convert Game Boy addresses between absolute and banked forms.
  5.  
  6. from __future__ import print_function
  7. from __future__ import unicode_literals
  8.  
  9. import sys
  10.  
  11. def to_banked(absolute_address):
  12. absolute_address = int(absolute_address, 16)
  13. bank, address = absolute_address // 0x4000, absolute_address % 0x4000
  14. if bank != 0:
  15. address += 0x4000
  16. return "{:02X}:{:04X}".format(bank, address)
  17.  
  18. def to_absolute(banked_address):
  19. bank, address = [int(n, 16) for n in banked_address.split(':', 1)]
  20.  
  21. memory_start = 0 if bank == 0 else 0x4000
  22. if not memory_start <= address < memory_start + 0x4000:
  23. raise ValueError("Memory address not within bank.")
  24.  
  25. return "{:06X}".format(bank * 0x4000 + address - memory_start)
  26.  
  27. def cross_convert(address):
  28. if ':' in address:
  29. return to_absolute(address)
  30. else:
  31. return to_banked(address)
  32.  
  33. if __name__ == '__main__':
  34. if not sys.argv[1:]:
  35. print("Usage: banksy [addresses...]")
  36. print("For example: banksy BC160 6F:430A")
  37. else:
  38. for address in sys.argv[1:]:
  39. try:
  40. print(cross_convert(address))
  41. except ValueError:
  42. print("[invalid address]")
Add Comment
Please, Sign In to add comment