Line |
Branch |
Exec |
Source |
1 |
|
|
#pragma once |
2 |
|
|
#include <vector> |
3 |
|
|
|
4 |
|
|
#include "errors.h" |
5 |
|
|
#include "autoarray.h" |
6 |
|
|
#include <cstdint> |
7 |
|
|
|
8 |
|
|
extern const unsigned char * romdata; |
9 |
|
|
extern int romlen; |
10 |
|
|
extern unsigned char freespacebyte; |
11 |
|
|
extern asar_error_id openromerror; |
12 |
|
|
bool openrom(const char * filename, bool confirm=true); |
13 |
|
|
uint32_t closerom(bool save = true); |
14 |
|
|
|
15 |
|
|
enum mapper_t { |
16 |
|
|
invalid_mapper, |
17 |
|
|
lorom, |
18 |
|
|
hirom, |
19 |
|
|
sa1rom, |
20 |
|
|
bigsa1rom, |
21 |
|
|
sfxrom, |
22 |
|
|
exlorom, |
23 |
|
|
exhirom, |
24 |
|
|
norom |
25 |
|
|
} extern mapper; |
26 |
|
|
|
27 |
|
|
extern int sa1banks[8];//only 0, 1, 4, 5 are used |
28 |
|
|
|
29 |
|
|
void addromwrite(int pcoffset, int numbytes); |
30 |
|
|
void writeromdata(int pcoffset, const void * indata, int numbytes); |
31 |
|
|
// optionally don't add the romwrite, because sometimes we did that in an earlier pass already |
32 |
|
|
// (or sometimes the bytes are just rom size padding) |
33 |
|
|
void writeromdata_byte(int pcoffset, unsigned char indata, bool add_write = true); |
34 |
|
|
void writeromdata_bytes(int pcoffset, unsigned char indata, int numbytes, bool add_write = true); |
35 |
|
|
|
36 |
|
|
struct writtenblockdata { |
37 |
|
|
int pcoffset; |
38 |
|
|
int snesoffset; |
39 |
|
|
int numbytes; |
40 |
|
|
}; |
41 |
|
|
|
42 |
|
|
extern autoarray<writtenblockdata> writtenblocks; |
43 |
|
|
extern std::vector<writtenblockdata> found_rats_tags; |
44 |
|
|
extern bool found_rats_tags_initialized; |
45 |
|
|
|
46 |
|
294457 |
inline int snestopc(int addr) |
47 |
|
|
{ |
48 |
3/4
✓ Branch 0 taken 293953 times.
✓ Branch 1 taken 504 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 293953 times.
|
294457 |
if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit |
49 |
4/4
✓ Branch 0 taken 146107 times.
✓ Branch 1 taken 147846 times.
✓ Branch 2 taken 146442 times.
✓ Branch 3 taken 748 times.
|
293953 |
if (mapper==lorom) |
50 |
|
|
{ |
51 |
|
|
// randomdude999: The low pages ($0000-$7FFF) of banks 70-7D are used |
52 |
|
|
// for SRAM, the high pages are available for ROM data though |
53 |
1/2
✓ Branch 0 taken 292549 times.
✗ Branch 1 not taken.
|
292549 |
if ((addr&0xFE0000)==0x7E0000 ||//wram |
54 |
2/2
✓ Branch 0 taken 292533 times.
✓ Branch 1 taken 16 times.
|
292549 |
(addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, other strange junk |
55 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 292533 times.
|
292533 |
(addr&0x708000)==0x700000)//sram (low parts of banks 70-7D) |
56 |
|
16 |
return -1; |
57 |
|
292533 |
addr=((addr&0x7F0000)>>1|(addr&0x7FFF)); |
58 |
|
292533 |
return addr; |
59 |
|
|
} |
60 |
4/4
✓ Branch 0 taken 116 times.
✓ Branch 1 taken 1288 times.
✓ Branch 2 taken 132 times.
✓ Branch 3 taken 616 times.
|
1404 |
if (mapper==hirom) |
61 |
|
|
{ |
62 |
1/2
✓ Branch 0 taken 248 times.
✗ Branch 1 not taken.
|
248 |
if ((addr&0xFE0000)==0x7E0000 ||//wram |
63 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 248 times.
|
248 |
(addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk |
64 |
|
✗ |
return -1; |
65 |
|
248 |
return addr&0x3FFFFF; |
66 |
|
|
} |
67 |
4/4
✓ Branch 0 taken 79 times.
✓ Branch 1 taken 1077 times.
✓ Branch 2 taken 89 times.
✓ Branch 3 taken 527 times.
|
1156 |
if (mapper==exlorom) |
68 |
|
|
{ |
69 |
1/2
✓ Branch 0 taken 168 times.
✗ Branch 1 not taken.
|
168 |
if ((addr&0xF00000)==0x700000 ||//wram, sram |
70 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 168 times.
|
168 |
(addr&0x408000)==0x000000)//area that shouldn't be used in lorom |
71 |
|
✗ |
return -1; |
72 |
2/2
✓ Branch 0 taken 152 times.
✓ Branch 1 taken 16 times.
|
168 |
if (addr&0x800000) |
73 |
|
|
{ |
74 |
|
152 |
addr=((addr&0x7F0000)>>1|(addr&0x7FFF)); |
75 |
|
|
} |
76 |
|
|
else |
77 |
|
|
{ |
78 |
|
16 |
addr=((addr&0x7F0000)>>1|(addr&0x7FFF))+0x400000; |
79 |
|
|
} |
80 |
|
168 |
return addr; |
81 |
|
|
} |
82 |
4/4
✓ Branch 0 taken 93 times.
✓ Branch 1 taken 895 times.
✓ Branch 2 taken 103 times.
✓ Branch 3 taken 424 times.
|
988 |
if (mapper==exhirom) |
83 |
|
|
{ |
84 |
1/2
✓ Branch 0 taken 196 times.
✗ Branch 1 not taken.
|
196 |
if ((addr&0xFE0000)==0x7E0000 ||//wram |
85 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 196 times.
|
196 |
(addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk |
86 |
|
✗ |
return -1; |
87 |
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 178 times.
|
196 |
if ((addr&0x800000)==0x000000) return (addr&0x3FFFFF)|0x400000; |
88 |
|
178 |
return addr&0x3FFFFF; |
89 |
|
|
} |
90 |
4/4
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 772 times.
✓ Branch 2 taken 30 times.
✓ Branch 3 taken 394 times.
|
792 |
if (mapper==sfxrom) |
91 |
|
|
{ |
92 |
|
|
// Asar emulates GSU1, because apparently emulators don't support the extra ROM data from GSU2 |
93 |
1/2
✓ Branch 0 taken 50 times.
✗ Branch 1 not taken.
|
50 |
if ((addr&0x600000)==0x600000 ||//wram, sram, open bus |
94 |
1/2
✓ Branch 0 taken 50 times.
✗ Branch 1 not taken.
|
50 |
(addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, rom mirrors, other strange junk |
95 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 50 times.
|
50 |
(addr&0x800000)==0x800000)//fastrom isn't valid either in superfx |
96 |
|
✗ |
return -1; |
97 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 50 times.
|
50 |
if (addr&0x400000) return addr&0x3FFFFF; |
98 |
|
50 |
else return (addr&0x7F0000)>>1|(addr&0x7FFF); |
99 |
|
|
} |
100 |
4/4
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 682 times.
✓ Branch 2 taken 70 times.
✓ Branch 3 taken 324 times.
|
742 |
if (mapper==sa1rom) |
101 |
|
|
{ |
102 |
1/2
✓ Branch 0 taken 130 times.
✗ Branch 1 not taken.
|
130 |
if ((addr&0x408000)==0x008000) |
103 |
|
|
{ |
104 |
|
130 |
return sa1banks[(addr&0xE00000)>>21]|((addr&0x1F0000)>>1)|(addr&0x007FFF); |
105 |
|
|
} |
106 |
|
✗ |
if ((addr&0xC00000)==0xC00000) |
107 |
|
|
{ |
108 |
|
✗ |
return sa1banks[((addr&0x100000)>>20)|((addr&0x200000)>>19)]|(addr&0x0FFFFF); |
109 |
|
|
} |
110 |
|
✗ |
return -1; |
111 |
|
|
} |
112 |
4/4
✓ Branch 0 taken 112 times.
✓ Branch 1 taken 500 times.
✓ Branch 2 taken 122 times.
✓ Branch 3 taken 202 times.
|
612 |
if (mapper==bigsa1rom) |
113 |
|
|
{ |
114 |
2/2
✓ Branch 0 taken 112 times.
✓ Branch 1 taken 122 times.
|
234 |
if ((addr&0xC00000)==0xC00000)//hirom |
115 |
|
|
{ |
116 |
|
112 |
return (addr&0x3FFFFF)|0x400000; |
117 |
|
|
} |
118 |
3/4
✓ Branch 0 taken 56 times.
✓ Branch 1 taken 66 times.
✓ Branch 2 taken 56 times.
✗ Branch 3 not taken.
|
122 |
if ((addr&0xC00000)==0x000000 || (addr&0xC00000)==0x800000)//lorom |
119 |
|
|
{ |
120 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 122 times.
|
122 |
if ((addr&0x008000)==0x000000) return -1; |
121 |
|
122 |
return (addr&0x800000)>>2 | (addr&0x3F0000)>>1 | (addr&0x7FFF); |
122 |
|
|
} |
123 |
|
✗ |
return -1; |
124 |
|
|
} |
125 |
3/4
✓ Branch 0 taken 176 times.
✓ Branch 1 taken 202 times.
✓ Branch 2 taken 202 times.
✗ Branch 3 not taken.
|
378 |
if (mapper==norom) |
126 |
|
|
{ |
127 |
|
378 |
return addr; |
128 |
|
|
} |
129 |
|
✗ |
return -1; |
130 |
|
|
} |
131 |
|
|
|
132 |
|
152017 |
inline int pctosnes(int addr) |
133 |
|
|
{ |
134 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 152017 times.
|
152017 |
if (addr<0) return -1; |
135 |
4/4
✓ Branch 0 taken 75533 times.
✓ Branch 1 taken 76484 times.
✓ Branch 2 taken 75694 times.
✓ Branch 3 taken 418 times.
|
152017 |
if (mapper==lorom) |
136 |
|
|
{ |
137 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 151227 times.
|
151227 |
if (addr>=0x400000) return -1; |
138 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 75694 times.
|
151227 |
addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000; |
139 |
|
151227 |
return addr|0x800000; |
140 |
|
|
} |
141 |
4/4
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 690 times.
✓ Branch 2 taken 108 times.
✓ Branch 3 taken 310 times.
|
790 |
if (mapper==hirom) |
142 |
|
|
{ |
143 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 208 times.
|
208 |
if (addr>=0x400000) return -1; |
144 |
|
208 |
return addr|0xC00000; |
145 |
|
|
} |
146 |
4/4
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 540 times.
✓ Branch 2 taken 47 times.
✓ Branch 3 taken 263 times.
|
582 |
if (mapper == exlorom) |
147 |
|
|
{ |
148 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 89 times.
|
89 |
if (addr>=0x800000) return -1; |
149 |
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 78 times.
|
89 |
if (addr&0x400000) |
150 |
|
|
{ |
151 |
|
11 |
addr-=0x400000; |
152 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
11 |
addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000; |
153 |
|
11 |
return addr; |
154 |
|
|
} |
155 |
|
|
else |
156 |
|
|
{ |
157 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 39 times.
|
78 |
addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000; |
158 |
|
78 |
return addr|0x800000; |
159 |
|
|
} |
160 |
|
|
} |
161 |
4/4
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 445 times.
✓ Branch 2 taken 53 times.
✓ Branch 3 taken 210 times.
|
493 |
if (mapper == exhirom) |
162 |
|
|
{ |
163 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 101 times.
|
101 |
if (addr>=0x800000) return -1; |
164 |
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 90 times.
|
101 |
if (addr&0x400000) return addr; |
165 |
|
90 |
return addr|0xC00000; |
166 |
|
|
} |
167 |
4/4
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 360 times.
✓ Branch 2 taken 37 times.
✓ Branch 3 taken 173 times.
|
392 |
if (mapper==sa1rom) |
168 |
|
|
{ |
169 |
1/2
✓ Branch 0 taken 149 times.
✗ Branch 1 not taken.
|
149 |
for (int i=0;i<8;i++) |
170 |
|
|
{ |
171 |
4/6
✓ Branch 0 taken 69 times.
✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 37 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 37 times.
|
149 |
if (sa1banks[i]==(addr&0x700000)){ return 0x008000|(i<<21)|((addr&0x0F8000)<<1)|(addr&0x7FFF);} |
172 |
|
|
} |
173 |
|
✗ |
return -1; |
174 |
|
|
} |
175 |
4/4
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 275 times.
✓ Branch 2 taken 53 times.
✓ Branch 3 taken 120 times.
|
323 |
if (mapper==bigsa1rom) |
176 |
|
|
{ |
177 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 101 times.
|
101 |
if (addr>=0x800000) return -1; |
178 |
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 53 times.
|
101 |
if ((addr&0x400000)==0x400000) |
179 |
|
|
{ |
180 |
|
48 |
return addr|0xC00000; |
181 |
|
|
} |
182 |
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 24 times.
|
53 |
if ((addr&0x600000)==0x000000) |
183 |
|
|
{ |
184 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
|
29 |
return ((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF); |
185 |
|
|
} |
186 |
1/2
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
|
24 |
if ((addr&0x600000)==0x200000) |
187 |
|
|
{ |
188 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
|
24 |
return 0x800000|((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF); |
189 |
|
|
} |
190 |
|
✗ |
return -1; |
191 |
|
|
} |
192 |
4/4
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 205 times.
✓ Branch 2 taken 22 times.
✓ Branch 3 taken 98 times.
|
222 |
if (mapper==sfxrom) |
193 |
|
|
{ |
194 |
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 37 times.
|
39 |
if (addr>=0x200000) return -1; |
195 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 21 times.
|
37 |
return ((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000; |
196 |
|
|
} |
197 |
3/4
✓ Branch 0 taken 85 times.
✓ Branch 1 taken 98 times.
✓ Branch 2 taken 98 times.
✗ Branch 3 not taken.
|
183 |
if (mapper==norom) |
198 |
|
|
{ |
199 |
|
183 |
return addr; |
200 |
|
|
} |
201 |
|
✗ |
return -1; |
202 |
|
|
} |
203 |
|
|
|
204 |
|
|
int getpcfreespace(int size, int target_bank, bool autoexpand=true, bool respectbankborders=true, bool align=false, bool write_rats=true, int search_start=-1); |
205 |
|
|
int getsnesfreespace(int size, int target_bank, bool autoexpand=true, bool respectbankborders=true, bool align=false, bool write_rats=true, int search_start=-1); |
206 |
|
|
|
207 |
|
|
void removerats(int snesaddr, unsigned char clean_byte); |
208 |
|
|
void handle_cleared_rats_tags(); |
209 |
|
|
int ratsstart(int pcaddr); |
210 |
|
|
|
211 |
|
|
void fixchecksum(); |
212 |
|
|
|
213 |
|
|
void WalkMetadata(int loc, void(*func)(int loc, char * name, int len, const unsigned char * contents));//This one calls func() for each metadata block in the RATS tag whose contents (metadata) start at loc in the ROM. Do not replace name with an invalid metadata name, and note that name is not null terminated. |
214 |
|
|
|