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
|
import struct
from typing import Optional
from splat.util import options, log
from splat.segtypes.common.codesubsegment import CommonSegCodeSubsegment
class N64SegCkf_kn(CommonSegCodeSubsegment):
def __init__(self, rom_start, rom_end, type, name, vram_start, args, yaml):
super().__init__(rom_start, rom_end, type, name, vram_start, args=args, yaml=yaml),
self.file_text: Optional[str] = None
self.data_only = isinstance(yaml, dict) and yaml.get("data_only", False)
def get_linker_section(self) -> str:
return ".data"
def scan(self, rom_bytes: bytes):
data = rom_bytes[self.rom_start : self.rom_end]
symbol = self.create_symbol(addr=self.vram_start, in_segment=True, type="data", define=True)
count = len(data) // 2
lines = []
if (len(data)) % 2 != 0:
log.error(f"Error: ckf_kn segment {self.name} length ({len(data)}) is not a multiple of 2!")
if not self.data_only:
lines.append(options.opts.generated_c_preamble)
lines.append("")
lines.append(f"s16 {symbol.name}[{count}] = {{")
for short in struct.iter_unpack(">h", data):
lines.append(f" {short[0]},")
if not self.data_only:
lines.append("};")
lines.append("")
self.file_text = "\n".join(lines)
def split(self, rom_bytes: bytes):
path = options.opts.asset_path / self.dir / f"{self.name}.inc.c"
if self.file_text and path:
path.parent.mkdir(parents=True, exist_ok=True)
with open(path, "w", newline="\n") as f:
f.write(self.file_text)
|