summaryrefslogtreecommitdiff
path: root/tools/make_shim.py
blob: fe620ec811c0f1218e0fac926d62afede3f6e841 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env python3

from sys import argv, stderr

def warn(s):
    print("WARNING:", s.rstrip(), file=stderr)

for i, line in enumerate(open(argv[1])):
    content = line.split(";", 1)[0].strip()

    bankaddr_name = content.split(" ", 1)
    if len(bankaddr_name) != 2:
        continue
    name = bankaddr_name[1].strip()

    bank_addr = bankaddr_name[0].split(":")
    if len(bank_addr) != 2:
        warn("Can't shim line %d: %s" % (i+1, line))
        continue
    bank = int(bank_addr[0], 16)
    addr = int(bank_addr[1], 16)

    if 0x0000 <= addr < 0x4000 and bank == 0:
        section = "ROM0"
        bank = None
    elif 0x4000 <= addr < 0x8000 and 1 <= bank < 128:
        section = "ROMX"
    elif 0x8000 <= addr < 0xA000 and 0 <= bank < 2:
        section = "VRAM"
    elif 0xA000 <= addr < 0xC000 and 0 <= bank < 16:
        section = "SRAM"
    elif 0xC000 <= addr < 0xD000 and bank == 0:
        section = "WRAM0"
        bank = None
    elif 0xD000 <= addr < 0xE000 and 0 <= bank < 16:
        section = "WRAMX"
    elif 0xFE00 <= addr < 0xFEA0 and bank == 0:
        section = "OAM"
        bank = None
    elif 0xFF80 <= addr < 0xFFFF and bank == 0:
        section = "HRAM"
        bank = None
    else:
        warn("Invalid bank/address on line %d: %s" % (i+1, line))
        continue

    bankdec = ", BANK[$%x]" % bank if bank is not None else ""
    print('SECTION "Shim %s", %s[$%x]%s' % (name, section, addr, bankdec))
    print("%s::" % name)