asar coverage - build #


src/asar/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
79 of 91, 0 excluded
86.8%
Functions:
2 of 2, 0 excluded
100.0%
Branches:
176 of 252, 0 excluded
69.8%

libsmw.h
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 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 // optionally don't add the romwrite, because sometimes we did that in an earlier pass already
31 // (or sometimes the bytes are just rom size padding)
32 void writeromdata_byte(int pcoffset, unsigned char indata, bool add_write = true);
33 void writeromdata_bytes(int pcoffset, unsigned char indata, int numbytes, bool add_write = true);
34
35 struct writtenblockdata {
36 int pcoffset;
37 int snesoffset;
38 int numbytes;
39 };
40
41 extern autoarray<writtenblockdata> writtenblocks;
42 extern std::vector<writtenblockdata> found_rats_tags;
43 extern bool found_rats_tags_initialized;
44
45 294630 inline int snestopc(int addr)
46 {
47
3/4
✓ Branch 2 → 3 taken 294116 times.
✓ Branch 2 → 4 taken 514 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 294116 times.
294630 if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit
48
5/5
✓ Branch 5 → 6 taken 146183 times.
✓ Branch 5 → 7 taken 147261 times.
✓ Branch 5 → 11 taken 672 times.
✓ Branch 7 → 8 taken 146497 times.
✓ Branch 7 → 13 taken 764 times.
294116 if (mapper==lorom)
49 {
50 // randomdude999: The low pages ($0000-$7FFF) of banks 70-7D are used
51 // for SRAM, the high pages are available for ROM data though
52
2/4
✓ Branch 6 → 7 taken 146183 times.
✗ Branch 6 → 9 not taken.
✓ Branch 8 → 9 taken 146497 times.
✗ Branch 8 → 11 not taken.
292680 if ((addr&0xFE0000)==0x7E0000 ||//wram
53
4/4
✓ Branch 7 → 8 taken 146179 times.
✓ Branch 7 → 9 taken 4 times.
✓ Branch 9 → 10 taken 146493 times.
✓ Branch 9 → 11 taken 4 times.
292680 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, other strange junk
54
2/4
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 146179 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 146493 times.
292672 (addr&0x708000)==0x700000)//sram (low parts of banks 70-7D)
55 8 return -1;
56 292672 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
57 292672 return addr;
58 }
59
5/6
✓ Branch 11 → 12 taken 131 times.
✓ Branch 11 → 16 taken 541 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 764 times.
✓ Branch 15 → 16 taken 147 times.
✓ Branch 15 → 20 taken 617 times.
1436 if (mapper==hirom)
60 {
61
2/4
✓ Branch 12 → 13 taken 131 times.
✗ Branch 12 → 14 not taken.
✓ Branch 16 → 17 taken 147 times.
✗ Branch 16 → 18 not taken.
278 if ((addr&0xFE0000)==0x7E0000 ||//wram
62
2/4
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 131 times.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 147 times.
278 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
63 return -1;
64 278 return addr&0x3FFFFF;
65 }
66
5/6
✓ Branch 16 → 17 taken 79 times.
✓ Branch 16 → 24 taken 462 times.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 617 times.
✓ Branch 22 → 23 taken 89 times.
✓ Branch 22 → 30 taken 528 times.
1158 if (mapper==exlorom)
67 {
68
2/4
✓ Branch 17 → 18 taken 79 times.
✗ Branch 17 → 19 not taken.
✓ Branch 23 → 24 taken 89 times.
✗ Branch 23 → 25 not taken.
168 if ((addr&0xF00000)==0x700000 ||//wram, sram
69
2/4
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 79 times.
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 26 taken 89 times.
168 (addr&0x408000)==0x000000)//area that shouldn't be used in lorom
70 return -1;
71
4/4
✓ Branch 20 → 21 taken 76 times.
✓ Branch 20 → 22 taken 3 times.
✓ Branch 26 → 27 taken 76 times.
✓ Branch 26 → 28 taken 13 times.
168 if (addr&0x800000)
72 {
73 152 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
74 }
75 else
76 {
77 16 addr=((addr&0x7F0000)>>1|(addr&0x7FFF))+0x400000;
78 }
79 168 return addr;
80 }
81
5/6
✓ Branch 24 → 25 taken 93 times.
✓ Branch 24 → 31 taken 369 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 528 times.
✓ Branch 32 → 33 taken 103 times.
✓ Branch 32 → 39 taken 425 times.
990 if (mapper==exhirom)
82 {
83
2/4
✓ Branch 25 → 26 taken 93 times.
✗ Branch 25 → 27 not taken.
✓ Branch 33 → 34 taken 103 times.
✗ Branch 33 → 35 not taken.
196 if ((addr&0xFE0000)==0x7E0000 ||//wram
84
2/4
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 28 taken 93 times.
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 36 taken 103 times.
196 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
85 return -1;
86
4/4
✓ Branch 28 → 29 taken 4 times.
✓ Branch 28 → 30 taken 89 times.
✓ Branch 36 → 37 taken 14 times.
✓ Branch 36 → 38 taken 89 times.
196 if ((addr&0x800000)==0x000000) return (addr&0x3FFFFF)|0x400000;
87 178 return addr&0x3FFFFF;
88 }
89
5/6
✓ Branch 31 → 32 taken 20 times.
✓ Branch 31 → 39 taken 349 times.
✗ Branch 39 → 40 not taken.
✓ Branch 39 → 41 taken 425 times.
✓ Branch 41 → 42 taken 30 times.
✓ Branch 41 → 49 taken 395 times.
794 if (mapper==sfxrom)
90 {
91 // Asar emulates GSU1, because apparently emulators don't support the extra ROM data from GSU2
92
2/4
✓ Branch 32 → 33 taken 20 times.
✗ Branch 32 → 35 not taken.
✓ Branch 42 → 43 taken 30 times.
✗ Branch 42 → 45 not taken.
50 if ((addr&0x600000)==0x600000 ||//wram, sram, open bus
93
2/4
✓ Branch 33 → 34 taken 20 times.
✗ Branch 33 → 35 not taken.
✓ Branch 43 → 44 taken 30 times.
✗ Branch 43 → 45 not taken.
50 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, rom mirrors, other strange junk
94
2/4
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 36 taken 20 times.
✗ Branch 44 → 45 not taken.
✓ Branch 44 → 46 taken 30 times.
50 (addr&0x800000)==0x800000)//fastrom isn't valid either in superfx
95 return -1;
96
2/4
✗ Branch 36 → 37 not taken.
✓ Branch 36 → 38 taken 20 times.
✗ Branch 46 → 47 not taken.
✓ Branch 46 → 48 taken 30 times.
50 if (addr&0x400000) return addr&0x3FFFFF;
97 50 else return (addr&0x7F0000)>>1|(addr&0x7FFF);
98 }
99
5/6
✓ Branch 39 → 40 taken 61 times.
✓ Branch 39 → 45 taken 288 times.
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 51 taken 395 times.
✓ Branch 51 → 52 taken 71 times.
✓ Branch 51 → 63 taken 324 times.
744 if (mapper==sa1rom)
100 {
101
2/4
✓ Branch 40 → 41 taken 61 times.
✗ Branch 40 → 42 not taken.
✓ Branch 52 → 53 taken 71 times.
✗ Branch 52 → 57 not taken.
132 if ((addr&0x408000)==0x008000)
102 {
103 132 return sa1banks[(addr&0xE00000)>>21]|((addr&0x1F0000)>>1)|(addr&0x007FFF);
104 }
105 if ((addr&0xC00000)==0xC00000)
106 {
107 return sa1banks[((addr&0x100000)>>20)|((addr&0x200000)>>19)]|(addr&0x0FFFFF);
108 }
109 return -1;
110 }
111
5/6
✓ Branch 45 → 46 taken 112 times.
✓ Branch 45 → 54 taken 176 times.
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 65 taken 324 times.
✓ Branch 65 → 66 taken 122 times.
✓ Branch 65 → 74 taken 202 times.
612 if (mapper==bigsa1rom)
112 {
113
4/4
✓ Branch 46 → 47 taken 56 times.
✓ Branch 46 → 48 taken 56 times.
✓ Branch 66 → 67 taken 56 times.
✓ Branch 66 → 68 taken 66 times.
234 if ((addr&0xC00000)==0xC00000)//hirom
114 {
115 112 return (addr&0x3FFFFF)|0x400000;
116 }
117
6/8
✓ Branch 48 → 49 taken 28 times.
✓ Branch 48 → 50 taken 28 times.
✓ Branch 49 → 50 taken 28 times.
✗ Branch 49 → 53 not taken.
✓ Branch 68 → 69 taken 28 times.
✓ Branch 68 → 70 taken 38 times.
✓ Branch 69 → 70 taken 28 times.
✗ Branch 69 → 73 not taken.
122 if ((addr&0xC00000)==0x000000 || (addr&0xC00000)==0x800000)//lorom
118 {
119
2/4
✗ Branch 50 → 51 not taken.
✓ Branch 50 → 52 taken 56 times.
✗ Branch 70 → 71 not taken.
✓ Branch 70 → 72 taken 66 times.
122 if ((addr&0x008000)==0x000000) return -1;
120 122 return (addr&0x800000)>>2 | (addr&0x3F0000)>>1 | (addr&0x7FFF);
121 }
122 return -1;
123 }
124
3/6
✓ Branch 54 → 55 taken 176 times.
✗ Branch 54 → 56 not taken.
✗ Branch 74 → 75 not taken.
✓ Branch 74 → 76 taken 202 times.
✓ Branch 76 → 77 taken 202 times.
✗ Branch 76 → 78 not taken.
378 if (mapper==norom)
125 {
126 378 return addr;
127 }
128 return -1;
129 }
130
131 152143 inline int pctosnes(int addr)
132 {
133
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 152143 times.
152143 if (addr<0) return -1;
134
5/5
✓ Branch 4 → 5 taken 75594 times.
✓ Branch 4 → 6 taken 76170 times.
✓ Branch 4 → 8 taken 379 times.
✓ Branch 6 → 7 taken 75745 times.
✓ Branch 6 → 12 taken 425 times.
152143 if (mapper==lorom)
135 {
136
2/4
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 75594 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 75745 times.
151339 if (addr>=0x400000) return -1;
137
1/2
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 75745 times.
151339 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
138 151339 return addr|0x800000;
139 }
140
5/6
✓ Branch 8 → 9 taken 107 times.
✓ Branch 8 → 12 taken 272 times.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 425 times.
✓ Branch 14 → 15 taken 115 times.
✓ Branch 14 → 18 taken 310 times.
804 if (mapper==hirom)
141 {
142
2/4
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 107 times.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 115 times.
222 if (addr>=0x400000) return -1;
143 222 return addr|0xC00000;
144 }
145
5/6
✓ Branch 12 → 13 taken 42 times.
✓ Branch 12 → 18 taken 230 times.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 310 times.
✓ Branch 20 → 21 taken 47 times.
✓ Branch 20 → 30 taken 263 times.
582 if (mapper == exlorom)
146 {
147
2/4
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 42 times.
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 47 times.
89 if (addr>=0x800000) return -1;
148
4/4
✓ Branch 15 → 16 taken 3 times.
✓ Branch 15 → 17 taken 39 times.
✓ Branch 23 → 24 taken 8 times.
✓ Branch 23 → 27 taken 39 times.
89 if (addr&0x400000)
149 {
150 11 addr-=0x400000;
151
1/2
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 26 taken 8 times.
11 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
152 11 return addr;
153 }
154 else
155 {
156
1/2
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 29 taken 39 times.
78 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
157 78 return addr|0x800000;
158 }
159 }
160
5/6
✓ Branch 18 → 19 taken 48 times.
✓ Branch 18 → 24 taken 182 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 263 times.
✓ Branch 32 → 33 taken 53 times.
✓ Branch 32 → 38 taken 210 times.
493 if (mapper == exhirom)
161 {
162
2/4
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 21 taken 48 times.
✗ Branch 33 → 34 not taken.
✓ Branch 33 → 35 taken 53 times.
101 if (addr>=0x800000) return -1;
163
4/4
✓ Branch 21 → 22 taken 3 times.
✓ Branch 21 → 23 taken 45 times.
✓ Branch 35 → 36 taken 8 times.
✓ Branch 35 → 37 taken 45 times.
101 if (addr&0x400000) return addr;
164 90 return addr|0xC00000;
165 }
166
5/6
✓ Branch 24 → 25 taken 32 times.
✓ Branch 24 → 31 taken 150 times.
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 40 taken 210 times.
✓ Branch 40 → 41 taken 37 times.
✓ Branch 40 → 54 taken 173 times.
392 if (mapper==sa1rom)
167 {
168
2/4
✓ Branch 29 → 26 taken 72 times.
✗ Branch 29 → 30 not taken.
✓ Branch 52 → 42 taken 77 times.
✗ Branch 52 → 53 not taken.
149 for (int i=0;i<8;i++)
169 {
170
6/8
✓ Branch 26 → 27 taken 32 times.
✓ Branch 26 → 28 taken 40 times.
✓ Branch 45 → 46 taken 37 times.
✓ Branch 45 → 51 taken 40 times.
✗ Branch 46 → 47 not taken.
✓ Branch 46 → 48 taken 37 times.
✗ Branch 48 → 49 not taken.
✓ Branch 48 → 50 taken 37 times.
149 if (sa1banks[i]==(addr&0x700000)){ return 0x008000|(i<<21)|((addr&0x0F8000)<<1)|(addr&0x7FFF);}
171 }
172 return -1;
173 }
174
5/6
✓ Branch 31 → 32 taken 48 times.
✓ Branch 31 → 41 taken 102 times.
✗ Branch 54 → 55 not taken.
✓ Branch 54 → 56 taken 173 times.
✓ Branch 56 → 57 taken 53 times.
✓ Branch 56 → 70 taken 120 times.
323 if (mapper==bigsa1rom)
175 {
176
2/4
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 34 taken 48 times.
✗ Branch 57 → 58 not taken.
✓ Branch 57 → 59 taken 53 times.
101 if (addr>=0x800000) return -1;
177
4/4
✓ Branch 34 → 35 taken 24 times.
✓ Branch 34 → 36 taken 24 times.
✓ Branch 59 → 60 taken 24 times.
✓ Branch 59 → 61 taken 29 times.
101 if ((addr&0x400000)==0x400000)
178 {
179 48 return addr|0xC00000;
180 }
181
4/4
✓ Branch 36 → 37 taken 12 times.
✓ Branch 36 → 38 taken 12 times.
✓ Branch 61 → 62 taken 17 times.
✓ Branch 61 → 65 taken 12 times.
53 if ((addr&0x600000)==0x000000)
182 {
183
1/2
✗ Branch 62 → 63 not taken.
✓ Branch 62 → 64 taken 17 times.
29 return ((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
184 }
185
2/4
✓ Branch 38 → 39 taken 12 times.
✗ Branch 38 → 40 not taken.
✓ Branch 65 → 66 taken 12 times.
✗ Branch 65 → 69 not taken.
24 if ((addr&0x600000)==0x200000)
186 {
187
1/2
✗ Branch 66 → 67 not taken.
✓ Branch 66 → 68 taken 12 times.
24 return 0x800000|((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
188 }
189 return -1;
190 }
191
5/6
✓ Branch 41 → 42 taken 17 times.
✓ Branch 41 → 45 taken 85 times.
✗ Branch 70 → 71 not taken.
✓ Branch 70 → 72 taken 120 times.
✓ Branch 72 → 73 taken 22 times.
✓ Branch 72 → 78 taken 98 times.
222 if (mapper==sfxrom)
192 {
193
4/4
✓ Branch 42 → 43 taken 1 time.
✓ Branch 42 → 44 taken 16 times.
✓ Branch 73 → 74 taken 1 time.
✓ Branch 73 → 75 taken 21 times.
39 if (addr>=0x200000) return -1;
194
1/2
✗ Branch 75 → 76 not taken.
✓ Branch 75 → 77 taken 21 times.
37 return ((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
195 }
196
3/6
✓ Branch 45 → 46 taken 85 times.
✗ Branch 45 → 47 not taken.
✗ Branch 78 → 79 not taken.
✓ Branch 78 → 80 taken 98 times.
✓ Branch 80 → 81 taken 98 times.
✗ Branch 80 → 82 not taken.
183 if (mapper==norom)
197 {
198 183 return addr;
199 }
200 return -1;
201 }
202
203 int getpcfreespace(int size, int target_bank, bool autoexpand=true, bool respectbankborders=true, bool align=false, bool write_rats=true, int search_start=-1);
204 int getsnesfreespace(int size, int target_bank, bool autoexpand=true, bool respectbankborders=true, bool align=false, bool write_rats=true, int search_start=-1);
205
206 void removerats(int snesaddr, unsigned char clean_byte);
207 void handle_cleared_rats_tags();
208 int ratsstart(int pcaddr);
209
210 void fixchecksum();
211
212 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.
213