asar coverage - build #133


src/asar/
File: src/asar/libsmw.h
Date: 2024-01-22 23:28:38
Lines:
79/91
86.8%
Functions:
2/2
100.0%
Branches:
90/106
84.9%

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 950973 inline int snestopc(int addr)
44 {
45
3/4
✓ Branch 0 taken 949515 times.
✓ Branch 1 taken 1458 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 474930 times.
950973 if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit
46
2/2
✓ Branch 0 taken 938001 times.
✓ Branch 1 taken 11514 times.
949515 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 938001 times.
✗ Branch 1 not taken.
938001 if ((addr&0xFE0000)==0x7E0000 ||//wram
51
2/2
✓ Branch 0 taken 937971 times.
✓ Branch 1 taken 30 times.
938001 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, other strange junk
52
2/2
✓ Branch 0 taken 468858 times.
✓ Branch 1 taken 469113 times.
937971 (addr&0x708000)==0x700000)//sram (low parts of banks 70-7D)
53 15 return -1;
54 937971 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
55 937971 return addr;
56 }
57
2/2
✓ Branch 0 taken 1399 times.
✓ Branch 1 taken 4403 times.
5802 if (mapper==hirom)
58 {
59
1/2
✓ Branch 0 taken 2782 times.
✗ Branch 1 not taken.
2782 if ((addr&0xFE0000)==0x7E0000 ||//wram
60
2/2
✓ Branch 0 taken 1383 times.
✓ Branch 1 taken 1399 times.
2782 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
61 return -1;
62 2782 return addr&0x3FFFFF;
63 }
64
2/2
✓ Branch 0 taken 1127 times.
✓ Branch 1 taken 3276 times.
4403 if (mapper==exlorom)
65 {
66
1/2
✓ Branch 0 taken 2244 times.
✗ Branch 1 not taken.
2244 if ((addr&0xF00000)==0x700000 ||//wram, sram
67
2/2
✓ Branch 0 taken 1117 times.
✓ Branch 1 taken 1127 times.
2244 (addr&0x408000)==0x000000)//area that shouldn't be used in lorom
68 return -1;
69
2/2
✓ Branch 0 taken 882 times.
✓ Branch 1 taken 1362 times.
2244 if (addr&0x800000)
70 {
71 882 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
72 }
73 else
74 {
75 1362 addr=((addr&0x7F0000)>>1|(addr&0x7FFF))+0x400000;
76 }
77 2244 return addr;
78 }
79
2/2
✓ Branch 0 taken 1205 times.
✓ Branch 1 taken 2071 times.
3276 if (mapper==exhirom)
80 {
81
1/2
✓ Branch 0 taken 2400 times.
✗ Branch 1 not taken.
2400 if ((addr&0xFE0000)==0x7E0000 ||//wram
82
2/2
✓ Branch 0 taken 1195 times.
✓ Branch 1 taken 1205 times.
2400 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
83 return -1;
84
2/2
✓ Branch 0 taken 1368 times.
✓ Branch 1 taken 1032 times.
2400 if ((addr&0x800000)==0x000000) return (addr&0x3FFFFF)|0x400000;
85 1032 return addr&0x3FFFFF;
86 }
87
2/2
✓ Branch 0 taken 131 times.
✓ Branch 1 taken 1940 times.
2071 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 252 times.
✗ Branch 1 not taken.
252 if ((addr&0x600000)==0x600000 ||//wram, sram, open bus
91
1/2
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
252 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, rom mirrors, other strange junk
92
2/2
✓ Branch 0 taken 121 times.
✓ Branch 1 taken 131 times.
252 (addr&0x800000)==0x800000)//fastrom isn't valid either in superfx
93 return -1;
94
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
252 if (addr&0x400000) return addr&0x3FFFFF;
95 252 else return (addr&0x7F0000)>>1|(addr&0x7FFF);
96 }
97
2/2
✓ Branch 0 taken 296 times.
✓ Branch 1 taken 1644 times.
1940 if (mapper==sa1rom)
98 {
99
1/2
✓ Branch 0 taken 582 times.
✗ Branch 1 not taken.
582 if ((addr&0x408000)==0x008000)
100 {
101 582 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 606 times.
✓ Branch 1 taken 1038 times.
1644 if (mapper==bigsa1rom)
110 {
111
2/2
✓ Branch 0 taken 576 times.
✓ Branch 1 taken 626 times.
1202 if ((addr&0xC00000)==0xC00000)//hirom
112 {
113 576 return (addr&0x3FFFFF)|0x400000;
114 }
115
3/4
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 338 times.
✓ Branch 2 taken 288 times.
✗ Branch 3 not taken.
626 if ((addr&0xC00000)==0x000000 || (addr&0xC00000)==0x800000)//lorom
116 {
117
2/2
✓ Branch 0 taken 308 times.
✓ Branch 1 taken 318 times.
626 if ((addr&0x008000)==0x000000) return -1;
118 626 return (addr&0x800000)>>2 | (addr&0x3F0000)>>1 | (addr&0x7FFF);
119 }
120 return -1;
121 }
122
1/2
✓ Branch 0 taken 1038 times.
✗ Branch 1 not taken.
1038 if (mapper==norom)
123 {
124 2052 return addr;
125 }
126 return -1;
127 }
128
129 482158 inline int pctosnes(int addr)
130 {
131
2/2
✓ Branch 0 taken 240996 times.
✓ Branch 1 taken 241162 times.
482158 if (addr<0) return -1;
132
2/2
✓ Branch 0 taken 478114 times.
✓ Branch 1 taken 4044 times.
482158 if (mapper==lorom)
133 {
134
2/2
✓ Branch 0 taken 238995 times.
✓ Branch 1 taken 239119 times.
478114 if (addr>=0x400000) return -1;
135 478114 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
136 478114 return addr|0x800000;
137 }
138
2/2
✓ Branch 0 taken 453 times.
✓ Branch 1 taken 1590 times.
2043 if (mapper==hirom)
139 {
140
2/2
✓ Branch 0 taken 448 times.
✓ Branch 1 taken 453 times.
901 if (addr>=0x400000) return -1;
141 901 return addr|0xC00000;
142 }
143
2/2
✓ Branch 0 taken 239 times.
✓ Branch 1 taken 1351 times.
1590 if (mapper == exlorom)
144 {
145
2/2
✓ Branch 0 taken 234 times.
✓ Branch 1 taken 239 times.
473 if (addr>=0x800000) return -1;
146
2/2
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 450 times.
473 if (addr&0x400000)
147 {
148 23 addr-=0x400000;
149 23 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
150 23 return addr;
151 }
152 else
153 {
154 450 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
155 450 return addr|0x800000;
156 }
157 }
158
2/2
✓ Branch 0 taken 275 times.
✓ Branch 1 taken 1076 times.
1351 if (mapper == exhirom)
159 {
160
2/2
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 275 times.
545 if (addr>=0x800000) return -1;
161
2/2
✓ Branch 0 taken 275 times.
✓ Branch 1 taken 270 times.
545 if (addr&0x400000) return addr;
162 522 return addr|0xC00000;
163 }
164
2/2
✓ Branch 0 taken 169 times.
✓ Branch 1 taken 907 times.
1076 if (mapper==sa1rom)
165 {
166
1/2
✓ Branch 0 taken 813 times.
✗ Branch 1 not taken.
813 for (int i=0;i<8;i++)
167 {
168
2/2
✓ Branch 0 taken 333 times.
✓ Branch 1 taken 480 times.
813 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 303 times.
✓ Branch 1 taken 604 times.
907 if (mapper==bigsa1rom)
173 {
174
2/2
✓ Branch 0 taken 298 times.
✓ Branch 1 taken 303 times.
601 if (addr>=0x800000) return -1;
175
2/2
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 313 times.
601 if ((addr&0x400000)==0x400000)
176 {
177 288 return addr|0xC00000;
178 }
179
2/2
✓ Branch 0 taken 169 times.
✓ Branch 1 taken 144 times.
313 if ((addr&0x600000)==0x000000)
180 {
181 169 return ((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
182 }
183
1/2
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
144 if ((addr&0x600000)==0x200000)
184 {
185 144 return 0x800000|((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
186 }
187 return -1;
188 }
189
2/2
✓ Branch 0 taken 82 times.
✓ Branch 1 taken 522 times.
604 if (mapper==sfxrom)
190 {
191
2/2
✓ Branch 0 taken 77 times.
✓ Branch 1 taken 82 times.
159 if (addr>=0x200000) return -1;
192 147 return ((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
193 }
194
1/2
✓ Branch 0 taken 522 times.
✗ Branch 1 not taken.
522 if (mapper==norom)
195 {
196 1032 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