summaryrefslogtreecommitdiff
path: root/tools/extract_incbins.py
blob: ea920cc88cb93fc0cdf26babf191e620c4c25bba (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
50
51
52
53
54
55
#!/usr/bin/env python3

# SPDX-FileCopyrightText: © 2024 ZeldaRET
# SPDX-License-Identifier: CC0-1.0

from __future__ import annotations

import argparse
from pathlib import Path
import sys

import dmadata
import version_config


def main():
    parser = argparse.ArgumentParser(
        description="Extract incbin pieces from an uncompressed ROM."
    )
    parser.add_argument(
        "baserom_segments_dir",
        type=Path,
        help="Directory of uncompressed ROM segments",
    )
    parser.add_argument(
        "output_dir",
        type=Path,
        help="Output directory for incbin pieces",
    )
    parser.add_argument(
        "-v",
        "--version",
        dest="oot_version",
        required=True,
        help="OOT version",
    )

    args = parser.parse_args()

    config = version_config.load_version_config(args.oot_version)

    args.output_dir.mkdir(parents=True, exist_ok=True)
    for incbin in config.incbins:
        incbin_path = args.output_dir / incbin.name
        with open(args.baserom_segments_dir / incbin.segment, "rb") as f:
            offset = incbin.vram - config.dmadata_segments[incbin.segment].vram
            f.seek(offset)
            incbin_data = f.read(incbin.size)
            incbin_path.write_bytes(incbin_data)

    print(f"Extracted {len(config.incbins)} incbin pieces to {args.output_dir}")


if __name__ == "__main__":
    main()