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 asar_error_id openromerror; |
11 |
|
|
bool openrom(const char * filename, bool confirm=true); |
12 |
|
|
uint32_t closerom(bool save = true); |
13 |
|
|
|
14 |
|
|
enum mapper_t { |
15 |
|
|
invalid_mapper, |
16 |
|
|
lorom, |
17 |
|
|
hirom, |
18 |
|
|
sa1rom, |
19 |
|
|
bigsa1rom, |
20 |
|
|
sfxrom, |
21 |
|
|
exlorom, |
22 |
|
|
exhirom, |
23 |
|
|
norom |
24 |
|
|
} extern mapper; |
25 |
|
|
|
26 |
|
|
extern int sa1banks[8];//only 0, 1, 4, 5 are used |
27 |
|
|
|
28 |
|
|
void addromwrite(int pcoffset, int numbytes); |
29 |
|
|
void writeromdata(int pcoffset, const void * indata, int numbytes); |
30 |
|
|
void writeromdata_byte(int pcoffset, unsigned char indata); |
31 |
|
|
void writeromdata_bytes(int pcoffset, unsigned char indata, int numbytes); |
32 |
|
|
|
33 |
|
|
struct writtenblockdata { |
34 |
|
|
int pcoffset; |
35 |
|
|
int snesoffset; |
36 |
|
|
int numbytes; |
37 |
|
|
}; |
38 |
|
|
|
39 |
|
|
extern autoarray<writtenblockdata> writtenblocks; |
40 |
|
|
extern std::vector<writtenblockdata> found_rats_tags; |
41 |
|
|
extern bool found_rats_tags_initialized; |
42 |
|
|
|
43 |
|
320171 |
inline int snestopc(int addr) |
44 |
|
|
{ |
45 |
3/4
✓ Branch 0 taken 319707 times.
✓ Branch 1 taken 464 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 159855 times.
|
320171 |
if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit |
46 |
2/2
✓ Branch 0 taken 313697 times.
✓ Branch 1 taken 6010 times.
|
319707 |
if (mapper==lorom) |
47 |
|
|
{ |
48 |
|
|
// randomdude999: The low pages ($0000-$7FFF) of banks 70-7D are used |
49 |
|
|
// for SRAM, the high pages are available for ROM data though |
50 |
1/2
✓ Branch 0 taken 313697 times.
✗ Branch 1 not taken.
|
313697 |
if ((addr&0xFE0000)==0x7E0000 ||//wram |
51 |
2/2
✓ Branch 0 taken 313687 times.
✓ Branch 1 taken 10 times.
|
313697 |
(addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, other strange junk |
52 |
2/2
✓ Branch 0 taken 156842 times.
✓ Branch 1 taken 156845 times.
|
313687 |
(addr&0x708000)==0x700000)//sram (low parts of banks 70-7D) |
53 |
|
5 |
return -1; |
54 |
|
313687 |
addr=((addr&0x7F0000)>>1|(addr&0x7FFF)); |
55 |
|
313687 |
return addr; |
56 |
|
|
} |
57 |
2/2
✓ Branch 0 taken 794 times.
✓ Branch 1 taken 2211 times.
|
3005 |
if (mapper==hirom) |
58 |
|
|
{ |
59 |
1/2
✓ Branch 0 taken 1588 times.
✗ Branch 1 not taken.
|
1588 |
if ((addr&0xFE0000)==0x7E0000 ||//wram |
60 |
2/2
✓ Branch 0 taken 794 times.
✓ Branch 1 taken 794 times.
|
1588 |
(addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk |
61 |
|
✗ |
return -1; |
62 |
|
1588 |
return addr&0x3FFFFF; |
63 |
|
|
} |
64 |
2/2
✓ Branch 0 taken 748 times.
✓ Branch 1 taken 1463 times.
|
2211 |
if (mapper==exlorom) |
65 |
|
|
{ |
66 |
1/2
✓ Branch 0 taken 1496 times.
✗ Branch 1 not taken.
|
1496 |
if ((addr&0xF00000)==0x700000 ||//wram, sram |
67 |
2/2
✓ Branch 0 taken 748 times.
✓ Branch 1 taken 748 times.
|
1496 |
(addr&0x408000)==0x000000)//area that shouldn't be used in lorom |
68 |
|
✗ |
return -1; |
69 |
2/2
✓ Branch 0 taken 294 times.
✓ Branch 1 taken 1202 times.
|
1496 |
if (addr&0x800000) |
70 |
|
|
{ |
71 |
|
294 |
addr=((addr&0x7F0000)>>1|(addr&0x7FFF)); |
72 |
|
|
} |
73 |
|
|
else |
74 |
|
|
{ |
75 |
|
1202 |
addr=((addr&0x7F0000)>>1|(addr&0x7FFF))+0x400000; |
76 |
|
|
} |
77 |
|
1496 |
return addr; |
78 |
|
|
} |
79 |
2/2
✓ Branch 0 taken 774 times.
✓ Branch 1 taken 689 times.
|
1463 |
if (mapper==exhirom) |
80 |
|
|
{ |
81 |
1/2
✓ Branch 0 taken 1548 times.
✗ Branch 1 not taken.
|
1548 |
if ((addr&0xFE0000)==0x7E0000 ||//wram |
82 |
2/2
✓ Branch 0 taken 774 times.
✓ Branch 1 taken 774 times.
|
1548 |
(addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk |
83 |
|
✗ |
return -1; |
84 |
2/2
✓ Branch 0 taken 1204 times.
✓ Branch 1 taken 344 times.
|
1548 |
if ((addr&0x800000)==0x000000) return (addr&0x3FFFFF)|0x400000; |
85 |
|
344 |
return addr&0x3FFFFF; |
86 |
|
|
} |
87 |
2/2
✓ Branch 0 taken 47 times.
✓ Branch 1 taken 642 times.
|
689 |
if (mapper==sfxrom) |
88 |
|
|
{ |
89 |
|
|
// Asar emulates GSU1, because apparently emulators don't support the extra ROM data from GSU2 |
90 |
1/2
✓ Branch 0 taken 94 times.
✗ Branch 1 not taken.
|
94 |
if ((addr&0x600000)==0x600000 ||//wram, sram, open bus |
91 |
1/2
✓ Branch 0 taken 94 times.
✗ Branch 1 not taken.
|
94 |
(addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, rom mirrors, other strange junk |
92 |
2/2
✓ Branch 0 taken 47 times.
✓ Branch 1 taken 47 times.
|
94 |
(addr&0x800000)==0x800000)//fastrom isn't valid either in superfx |
93 |
|
✗ |
return -1; |
94 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 94 times.
|
94 |
if (addr&0x400000) return addr&0x3FFFFF; |
95 |
|
94 |
else return (addr&0x7F0000)>>1|(addr&0x7FFF); |
96 |
|
|
} |
97 |
2/2
✓ Branch 0 taken 102 times.
✓ Branch 1 taken 540 times.
|
642 |
if (mapper==sa1rom) |
98 |
|
|
{ |
99 |
1/2
✓ Branch 0 taken 204 times.
✗ Branch 1 not taken.
|
204 |
if ((addr&0x408000)==0x008000) |
100 |
|
|
{ |
101 |
|
204 |
return sa1banks[(addr&0xE00000)>>21]|((addr&0x1F0000)>>1)|(addr&0x007FFF); |
102 |
|
|
} |
103 |
|
✗ |
if ((addr&0xC00000)==0xC00000) |
104 |
|
|
{ |
105 |
|
✗ |
return sa1banks[((addr&0x100000)>>20)|((addr&0x200000)>>19)]|(addr&0x0FFFFF); |
106 |
|
|
} |
107 |
|
✗ |
return -1; |
108 |
|
|
} |
109 |
2/2
✓ Branch 0 taken 202 times.
✓ Branch 1 taken 338 times.
|
540 |
if (mapper==bigsa1rom) |
110 |
|
|
{ |
111 |
2/2
✓ Branch 0 taken 192 times.
✓ Branch 1 taken 212 times.
|
404 |
if ((addr&0xC00000)==0xC00000)//hirom |
112 |
|
|
{ |
113 |
|
192 |
return (addr&0x3FFFFF)|0x400000; |
114 |
|
|
} |
115 |
3/4
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 116 times.
✓ Branch 2 taken 96 times.
✗ Branch 3 not taken.
|
212 |
if ((addr&0xC00000)==0x000000 || (addr&0xC00000)==0x800000)//lorom |
116 |
|
|
{ |
117 |
2/2
✓ Branch 0 taken 106 times.
✓ Branch 1 taken 106 times.
|
212 |
if ((addr&0x008000)==0x000000) return -1; |
118 |
|
212 |
return (addr&0x800000)>>2 | (addr&0x3F0000)>>1 | (addr&0x7FFF); |
119 |
|
|
} |
120 |
|
✗ |
return -1; |
121 |
|
|
} |
122 |
1/2
✓ Branch 0 taken 338 times.
✗ Branch 1 not taken.
|
338 |
if (mapper==norom) |
123 |
|
|
{ |
124 |
|
676 |
return addr; |
125 |
|
|
} |
126 |
|
✗ |
return -1; |
127 |
|
|
} |
128 |
|
|
|
129 |
|
160648 |
inline int pctosnes(int addr) |
130 |
|
|
{ |
131 |
2/2
✓ Branch 0 taken 80324 times.
✓ Branch 1 taken 80324 times.
|
160648 |
if (addr<0) return -1; |
132 |
2/2
✓ Branch 0 taken 159400 times.
✓ Branch 1 taken 1248 times.
|
160648 |
if (mapper==lorom) |
133 |
|
|
{ |
134 |
2/2
✓ Branch 0 taken 79700 times.
✓ Branch 1 taken 79700 times.
|
159400 |
if (addr>=0x400000) return -1; |
135 |
|
159400 |
addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000; |
136 |
|
159400 |
return addr|0x800000; |
137 |
|
|
} |
138 |
2/2
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 526 times.
|
624 |
if (mapper==hirom) |
139 |
|
|
{ |
140 |
2/2
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 98 times.
|
196 |
if (addr>=0x400000) return -1; |
141 |
|
196 |
return addr|0xC00000; |
142 |
|
|
} |
143 |
2/2
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 448 times.
|
526 |
if (mapper == exlorom) |
144 |
|
|
{ |
145 |
2/2
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 78 times.
|
156 |
if (addr>=0x800000) return -1; |
146 |
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 150 times.
|
156 |
if (addr&0x400000) |
147 |
|
|
{ |
148 |
|
6 |
addr-=0x400000; |
149 |
|
6 |
addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000; |
150 |
|
6 |
return addr; |
151 |
|
|
} |
152 |
|
|
else |
153 |
|
|
{ |
154 |
|
150 |
addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000; |
155 |
|
150 |
return addr|0x800000; |
156 |
|
|
} |
157 |
|
|
} |
158 |
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 358 times.
|
448 |
if (mapper == exhirom) |
159 |
|
|
{ |
160 |
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 90 times.
|
180 |
if (addr>=0x800000) return -1; |
161 |
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 90 times.
|
180 |
if (addr&0x400000) return addr; |
162 |
|
174 |
return addr|0xC00000; |
163 |
|
|
} |
164 |
2/2
✓ Branch 0 taken 58 times.
✓ Branch 1 taken 300 times.
|
358 |
if (mapper==sa1rom) |
165 |
|
|
{ |
166 |
1/2
✓ Branch 0 taken 276 times.
✗ Branch 1 not taken.
|
276 |
for (int i=0;i<8;i++) |
167 |
|
|
{ |
168 |
2/2
✓ Branch 0 taken 116 times.
✓ Branch 1 taken 160 times.
|
276 |
if (sa1banks[i]==(addr&0x700000)){ return 0x008000|(i<<21)|((addr&0x0F8000)<<1)|(addr&0x7FFF);} |
169 |
|
|
} |
170 |
|
✗ |
return -1; |
171 |
|
|
} |
172 |
2/2
✓ Branch 0 taken 101 times.
✓ Branch 1 taken 199 times.
|
300 |
if (mapper==bigsa1rom) |
173 |
|
|
{ |
174 |
2/2
✓ Branch 0 taken 101 times.
✓ Branch 1 taken 101 times.
|
202 |
if (addr>=0x800000) return -1; |
175 |
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 106 times.
|
202 |
if ((addr&0x400000)==0x400000) |
176 |
|
|
{ |
177 |
|
96 |
return addr|0xC00000; |
178 |
|
|
} |
179 |
2/2
✓ Branch 0 taken 58 times.
✓ Branch 1 taken 48 times.
|
106 |
if ((addr&0x600000)==0x000000) |
180 |
|
|
{ |
181 |
|
58 |
return ((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF); |
182 |
|
|
} |
183 |
1/2
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
|
48 |
if ((addr&0x600000)==0x200000) |
184 |
|
|
{ |
185 |
|
48 |
return 0x800000|((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF); |
186 |
|
|
} |
187 |
|
✗ |
return -1; |
188 |
|
|
} |
189 |
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 170 times.
|
199 |
if (mapper==sfxrom) |
190 |
|
|
{ |
191 |
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 29 times.
|
58 |
if (addr>=0x200000) return -1; |
192 |
|
54 |
return ((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000; |
193 |
|
|
} |
194 |
1/2
✓ Branch 0 taken 170 times.
✗ Branch 1 not taken.
|
170 |
if (mapper==norom) |
195 |
|
|
{ |
196 |
|
340 |
return addr; |
197 |
|
|
} |
198 |
|
✗ |
return -1; |
199 |
|
|
} |
200 |
|
|
|
201 |
|
|
int getpcfreespace(int size, int target_bank, bool autoexpand=true, bool respectbankborders=true, bool align=false, unsigned char freespacebyte=0x00, bool write_rats=true, int search_start=-1); |
202 |
|
|
int getsnesfreespace(int size, int target_bank, bool autoexpand=true, bool respectbankborders=true, bool align=false, unsigned char freespacebyte=0x00, bool write_rats=true, int search_start=-1); |
203 |
|
|
|
204 |
|
|
void removerats(int snesaddr, unsigned char clean_byte); |
205 |
|
|
void handle_cleared_rats_tags(); |
206 |
|
|
int ratsstart(int pcaddr); |
207 |
|
|
|
208 |
|
|
void fixchecksum(); |
209 |
|
|
|
210 |
|
|
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. |
211 |
|
|
|