-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrom.cpp
More file actions
101 lines (91 loc) · 2.9 KB
/
rom.cpp
File metadata and controls
101 lines (91 loc) · 2.9 KB
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "rom.h"
ROM::ROM(Reader* reader, int begins_at)
{
_reader = reader;
_reader->jump(begins_at);
load_header();
load_fnt();
load_fat();
load_arm7ovt();
load_arm9ovt();
}
void ROM::load_header()
{
game_title = _reader->get_string(12);
gamecode = _reader->get_string(4);
makercode = _reader->get_string(2);
unitcode = _reader->read<u8>();
ess = _reader->read<u8>();
dev_cap = _reader->read<u8>();
_reader->skip(_reserved_a);
_reader->skip(_reserved_b);
nds_region = _reader->read<u8>();
rom_version = _reader->read<u8>();
autostart = _reader->read<u8>();
arm9_rom_offset = _reader->read<u32>();
arm9_entry_addr = _reader->read<u32>();
arm9_ram_addr = _reader->read<u32>();
arm9_size = _reader->read<u32>();
arm7_rom_offset = _reader->read<u32>();
arm7_entry_addr = _reader->read<u32>();
arm7_ram_addr = _reader->read<u32>();
arm7_size = _reader->read<u32>();
fnt_offset = _reader->read<u32>();
fnt_size = _reader->read<u32>();
fat_offset = _reader->read<u32>();
fat_size = _reader->read<u32>();
ovly_arm9_offset = _reader->read<u32>();
ovly_arm9_size = _reader->read<u32>();
ovly_arm7_offset = _reader->read<u32>();
ovly_arm7_size = _reader->read<u32>();
port_setting_1 = _reader->read<u32>();
port_setting_2 = _reader->read<u32>();
icon_title_offset = _reader->read<u32>();
sa_chk = _reader->read<u16>();
sa_dly = _reader->read<u16>();
arm9_autol_addr = _reader->read<u32>();
arm7_autol_addr = _reader->read<u32>();
sa_dbl = _reader->read<u64>();
total_used = _reader->read<u32>();
header_size = _reader->read<u32>();
_reader->skip(_reserved_c);
_nin_logo_data = _reader->get_vec(156);
nin_logo_chk = _reader->read<u16>();
header_chk = _reader->read<u16>();
debug_offset = _reader->read<u32>();
debug_size = _reader->read<u32>();
debug_raddr = _reader->read<u32>();
_reader->skip(_reserved_d);
}
void ROM::load_fnt()
{
fnt = FNT(_reader, fnt_offset, fnt_size);
}
void ROM::load_fat()
{
fat = FAT(_reader, fat_offset, fat_size);
}
void ROM::load_arm7ovt()
{
arm7ovt = OVT(_reader, ovly_arm7_offset, ovly_arm7_size);
}
void ROM::load_arm9ovt()
{
arm9ovt = OVT(_reader, ovly_arm9_offset, ovly_arm9_size);
}
NDSFile* ROM::file_from_path(std::string path)
{
return fat.file_from_id(fnt.file_id_of(path));
}
NDSFile* ROM::file_from_id(int id)
{
return fat.file_from_id(id);
}
std::string ROM::get_region_string()
{
char code = gamecode[3];
if (code == 'B' || code == 'G') { return "N/A"; }
else if (code >= 'W' && code <= 'Z') { return "Europe (?)"; }
else if (code > 'Z' || code < 'A') {return "Invalid region";}
else { return _region_codes[code]; }
}