Line |
Branch |
Exec |
Source |
1 |
|
|
#pragma once |
2 |
|
|
|
3 |
|
|
#include "errors.h" |
4 |
|
|
#include "autoarray.h" |
5 |
|
|
#include <cstdint> |
6 |
|
|
|
7 |
|
|
extern const unsigned char * romdata; |
8 |
|
|
extern int romlen; |
9 |
|
|
extern unsigned char default_freespacebyte; |
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 writeromdata(int pcoffset, const void * indata, int numbytes); |
29 |
|
|
void writeromdata_byte(int pcoffset, unsigned char indata); |
30 |
|
|
void writeromdata_bytes(int pcoffset, unsigned char indata, int numbytes, bool add_write = true); |
31 |
|
|
|
32 |
|
|
struct writtenblockdata { |
33 |
|
|
int pcoffset; |
34 |
|
|
int snesoffset; |
35 |
|
|
int numbytes; |
36 |
|
|
}; |
37 |
|
|
|
38 |
|
|
extern autoarray<writtenblockdata> writtenblocks; |
39 |
|
|
|
40 |
|
87088 |
inline int snestopc(int addr) |
41 |
|
|
{ |
42 |
2/4
✓ Branch 0 taken 87088 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 43544 times.
|
87088 |
if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit |
43 |
2/2
✓ Branch 0 taken 82510 times.
✓ Branch 1 taken 4578 times.
|
87088 |
if (mapper==lorom) |
44 |
|
|
{ |
45 |
|
|
// randomdude999: The low pages ($0000-$7FFF) of banks 70-7D are used |
46 |
|
|
// for SRAM, the high pages are available for ROM data though |
47 |
1/2
✓ Branch 0 taken 82510 times.
✗ Branch 1 not taken.
|
82510 |
if ((addr&0xFE0000)==0x7E0000 ||//wram |
48 |
2/2
✓ Branch 0 taken 82508 times.
✓ Branch 1 taken 2 times.
|
82510 |
(addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, other strange junk |
49 |
2/2
✓ Branch 0 taken 41254 times.
✓ Branch 1 taken 41254 times.
|
82508 |
(addr&0x708000)==0x700000)//sram (low parts of banks 70-7D) |
50 |
|
1 |
return -1; |
51 |
|
82508 |
addr=((addr&0x7F0000)>>1|(addr&0x7FFF)); |
52 |
|
82508 |
return addr; |
53 |
|
|
} |
54 |
2/2
✓ Branch 0 taken 697 times.
✓ Branch 1 taken 1592 times.
|
2289 |
if (mapper==hirom) |
55 |
|
|
{ |
56 |
1/2
✓ Branch 0 taken 1394 times.
✗ Branch 1 not taken.
|
1394 |
if ((addr&0xFE0000)==0x7E0000 ||//wram |
57 |
2/2
✓ Branch 0 taken 697 times.
✓ Branch 1 taken 697 times.
|
1394 |
(addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk |
58 |
|
✗ |
return -1; |
59 |
|
1394 |
return addr&0x3FFFFF; |
60 |
|
|
} |
61 |
2/2
✓ Branch 0 taken 692 times.
✓ Branch 1 taken 900 times.
|
1592 |
if (mapper==exlorom) |
62 |
|
|
{ |
63 |
1/2
✓ Branch 0 taken 1384 times.
✗ Branch 1 not taken.
|
1384 |
if ((addr&0xF00000)==0x700000 ||//wram, sram |
64 |
2/2
✓ Branch 0 taken 692 times.
✓ Branch 1 taken 692 times.
|
1384 |
(addr&0x408000)==0x000000)//area that shouldn't be used in lorom |
65 |
|
✗ |
return -1; |
66 |
2/2
✓ Branch 0 taken 84 times.
✓ Branch 1 taken 1300 times.
|
1384 |
if (addr&0x800000) |
67 |
|
|
{ |
68 |
|
84 |
addr=((addr&0x7F0000)>>1|(addr&0x7FFF)); |
69 |
|
|
} |
70 |
|
|
else |
71 |
|
|
{ |
72 |
|
1300 |
addr=((addr&0x7F0000)>>1|(addr&0x7FFF))+0x400000; |
73 |
|
|
} |
74 |
|
1384 |
return addr; |
75 |
|
|
} |
76 |
2/2
✓ Branch 0 taken 702 times.
✓ Branch 1 taken 198 times.
|
900 |
if (mapper==exhirom) |
77 |
|
|
{ |
78 |
1/2
✓ Branch 0 taken 1404 times.
✗ Branch 1 not taken.
|
1404 |
if ((addr&0xFE0000)==0x7E0000 ||//wram |
79 |
2/2
✓ Branch 0 taken 702 times.
✓ Branch 1 taken 702 times.
|
1404 |
(addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk |
80 |
|
✗ |
return -1; |
81 |
2/2
✓ Branch 0 taken 1304 times.
✓ Branch 1 taken 100 times.
|
1404 |
if ((addr&0x800000)==0x000000) return (addr&0x3FFFFF)|0x400000; |
82 |
|
100 |
return addr&0x3FFFFF; |
83 |
|
|
} |
84 |
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 169 times.
|
198 |
if (mapper==sfxrom) |
85 |
|
|
{ |
86 |
|
|
// Asar emulates GSU1, because apparently emulators don't support the extra ROM data from GSU2 |
87 |
1/2
✓ Branch 0 taken 58 times.
✗ Branch 1 not taken.
|
58 |
if ((addr&0x600000)==0x600000 ||//wram, sram, open bus |
88 |
1/2
✓ Branch 0 taken 58 times.
✗ Branch 1 not taken.
|
58 |
(addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, rom mirrors, other strange junk |
89 |
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 29 times.
|
58 |
(addr&0x800000)==0x800000)//fastrom isn't valid either in superfx |
90 |
|
✗ |
return -1; |
91 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 58 times.
|
58 |
if (addr&0x400000) return addr&0x3FFFFF; |
92 |
|
58 |
else return (addr&0x7F0000)>>1|(addr&0x7FFF); |
93 |
|
|
} |
94 |
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 137 times.
|
169 |
if (mapper==sa1rom) |
95 |
|
|
{ |
96 |
1/2
✓ Branch 0 taken 64 times.
✗ Branch 1 not taken.
|
64 |
if ((addr&0x408000)==0x008000) |
97 |
|
|
{ |
98 |
|
64 |
return sa1banks[(addr&0xE00000)>>21]|((addr&0x1F0000)>>1)|(addr&0x007FFF); |
99 |
|
|
} |
100 |
|
✗ |
if ((addr&0xC00000)==0xC00000) |
101 |
|
|
{ |
102 |
|
✗ |
return sa1banks[((addr&0x100000)>>20)|((addr&0x200000)>>19)]|(addr&0x0FFFFF); |
103 |
|
|
} |
104 |
|
✗ |
return -1; |
105 |
|
|
} |
106 |
2/2
✓ Branch 0 taken 53 times.
✓ Branch 1 taken 84 times.
|
137 |
if (mapper==bigsa1rom) |
107 |
|
|
{ |
108 |
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 58 times.
|
106 |
if ((addr&0xC00000)==0xC00000)//hirom |
109 |
|
|
{ |
110 |
|
48 |
return (addr&0x3FFFFF)|0x400000; |
111 |
|
|
} |
112 |
3/4
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 34 times.
✓ Branch 2 taken 24 times.
✗ Branch 3 not taken.
|
58 |
if ((addr&0xC00000)==0x000000 || (addr&0xC00000)==0x800000)//lorom |
113 |
|
|
{ |
114 |
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 29 times.
|
58 |
if ((addr&0x008000)==0x000000) return -1; |
115 |
|
58 |
return (addr&0x800000)>>2 | (addr&0x3F0000)>>1 | (addr&0x7FFF); |
116 |
|
|
} |
117 |
|
✗ |
return -1; |
118 |
|
|
} |
119 |
1/2
✓ Branch 0 taken 84 times.
✗ Branch 1 not taken.
|
84 |
if (mapper==norom) |
120 |
|
|
{ |
121 |
|
168 |
return addr; |
122 |
|
|
} |
123 |
|
✗ |
return -1; |
124 |
|
|
} |
125 |
|
|
|
126 |
|
838 |
inline int pctosnes(int addr) |
127 |
|
|
{ |
128 |
2/2
✓ Branch 0 taken 419 times.
✓ Branch 1 taken 419 times.
|
838 |
if (addr<0) return -1; |
129 |
2/2
✓ Branch 0 taken 766 times.
✓ Branch 1 taken 72 times.
|
838 |
if (mapper==lorom) |
130 |
|
|
{ |
131 |
2/2
✓ Branch 0 taken 383 times.
✓ Branch 1 taken 383 times.
|
766 |
if (addr>=0x400000) return -1; |
132 |
|
766 |
addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000; |
133 |
|
766 |
return addr|0x800000; |
134 |
|
|
} |
135 |
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 28 times.
|
36 |
if (mapper==hirom) |
136 |
|
|
{ |
137 |
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
|
16 |
if (addr>=0x400000) return -1; |
138 |
|
16 |
return addr|0xC00000; |
139 |
|
|
} |
140 |
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 16 times.
|
28 |
if (mapper == exlorom) |
141 |
|
|
{ |
142 |
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
|
24 |
if (addr>=0x800000) return -1; |
143 |
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
|
24 |
if (addr&0x400000) |
144 |
|
|
{ |
145 |
|
12 |
addr-=0x400000; |
146 |
|
12 |
addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000; |
147 |
|
12 |
return addr; |
148 |
|
|
} |
149 |
|
|
else |
150 |
|
|
{ |
151 |
|
12 |
addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000; |
152 |
|
12 |
return addr|0x800000; |
153 |
|
|
} |
154 |
|
|
} |
155 |
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 4 times.
|
16 |
if (mapper == exhirom) |
156 |
|
|
{ |
157 |
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
|
24 |
if (addr>=0x800000) return -1; |
158 |
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
|
24 |
if (addr&0x400000) return addr; |
159 |
|
12 |
return addr|0xC00000; |
160 |
|
|
} |
161 |
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
|
4 |
if (mapper==sa1rom) |
162 |
|
|
{ |
163 |
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
|
4 |
for (int i=0;i<8;i++) |
164 |
|
|
{ |
165 |
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
|
4 |
if (sa1banks[i]==(addr&0x700000)){ return 0x008000|(i<<21)|((addr&0x0F8000)<<1)|(addr&0x7FFF);} |
166 |
|
|
} |
167 |
|
✗ |
return -1; |
168 |
|
|
} |
169 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
|
2 |
if (mapper==bigsa1rom) |
170 |
|
|
{ |
171 |
|
✗ |
if (addr>=0x800000) return -1; |
172 |
|
✗ |
if ((addr&0x400000)==0x400000) |
173 |
|
|
{ |
174 |
|
✗ |
return addr|0xC00000; |
175 |
|
|
} |
176 |
|
✗ |
if ((addr&0x600000)==0x000000) |
177 |
|
|
{ |
178 |
|
✗ |
return ((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF); |
179 |
|
|
} |
180 |
|
✗ |
if ((addr&0x600000)==0x200000) |
181 |
|
|
{ |
182 |
|
✗ |
return 0x800000|((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF); |
183 |
|
|
} |
184 |
|
✗ |
return -1; |
185 |
|
|
} |
186 |
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2 |
if (mapper==sfxrom) |
187 |
|
|
{ |
188 |
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
|
4 |
if (addr>=0x200000) return -1; |
189 |
|
4 |
return ((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000; |
190 |
|
|
} |
191 |
|
✗ |
if (mapper==norom) |
192 |
|
|
{ |
193 |
|
✗ |
return addr; |
194 |
|
|
} |
195 |
|
✗ |
return -1; |
196 |
|
|
} |
197 |
|
|
|
198 |
|
|
int getpcfreespace(int size, bool isforcode, bool autoexpand=true, bool respectbankborders=true, bool align=false, unsigned char freespacebyte=0x00); |
199 |
|
|
int getsnesfreespace(int size, bool isforcode, bool autoexpand=true, bool respectbankborders=true, bool align=false, unsigned char freespacebyte=0x00); |
200 |
|
|
|
201 |
|
|
void resizerats(int snesaddr, int newlen); |
202 |
|
|
void removerats(int snesaddr, unsigned char clean_byte); |
203 |
|
|
int ratsstart(int pcaddr); |
204 |
|
|
|
205 |
|
|
bool goodchecksum(); |
206 |
|
|
void fixchecksum(); |
207 |
|
|
|
208 |
|
|
void WalkRatsTags(void(*func)(int loc, int len));//This one calls func() for each RATS tag in the ROM. The pointer is SNES format. |
209 |
|
|
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. |
210 |
|
|
|