asar coverage - build #287


src/asar/
File: src/asar/libsmw.h
Date: 2025-03-09 20:28:22
Lines:
79/91
86.8%
Functions:
2/2
100.0%
Branches:
120/156
76.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 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 294507 inline int snestopc(int addr)
46 {
47
3/4
✓ Branch 0 taken 294003 times.
✓ Branch 1 taken 504 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 294003 times.
294507 if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit
48
4/4
✓ Branch 0 taken 146132 times.
✓ Branch 1 taken 147871 times.
✓ Branch 2 taken 146467 times.
✓ Branch 3 taken 748 times.
294003 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
1/2
✓ Branch 0 taken 292599 times.
✗ Branch 1 not taken.
292599 if ((addr&0xFE0000)==0x7E0000 ||//wram
53
2/2
✓ Branch 0 taken 292583 times.
✓ Branch 1 taken 16 times.
292599 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, other strange junk
54
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 292583 times.
292583 (addr&0x708000)==0x700000)//sram (low parts of banks 70-7D)
55 16 return -1;
56 292583 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
57 292583 return addr;
58 }
59
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)
60 {
61
1/2
✓ Branch 0 taken 248 times.
✗ Branch 1 not taken.
248 if ((addr&0xFE0000)==0x7E0000 ||//wram
62
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 248 times.
248 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
63 return -1;
64 248 return addr&0x3FFFFF;
65 }
66
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)
67 {
68
1/2
✓ Branch 0 taken 168 times.
✗ Branch 1 not taken.
168 if ((addr&0xF00000)==0x700000 ||//wram, sram
69
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 168 times.
168 (addr&0x408000)==0x000000)//area that shouldn't be used in lorom
70 return -1;
71
2/2
✓ Branch 0 taken 152 times.
✓ Branch 1 taken 16 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
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)
82 {
83
1/2
✓ Branch 0 taken 196 times.
✗ Branch 1 not taken.
196 if ((addr&0xFE0000)==0x7E0000 ||//wram
84
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 196 times.
196 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
85 return -1;
86
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 178 times.
196 if ((addr&0x800000)==0x000000) return (addr&0x3FFFFF)|0x400000;
87 178 return addr&0x3FFFFF;
88 }
89
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)
90 {
91 // Asar emulates GSU1, because apparently emulators don't support the extra ROM data from GSU2
92
1/2
✓ Branch 0 taken 50 times.
✗ Branch 1 not taken.
50 if ((addr&0x600000)==0x600000 ||//wram, sram, open bus
93
1/2
✓ Branch 0 taken 50 times.
✗ Branch 1 not taken.
50 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, rom mirrors, other strange junk
94
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 50 times.
50 (addr&0x800000)==0x800000)//fastrom isn't valid either in superfx
95 return -1;
96
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 50 times.
50 if (addr&0x400000) return addr&0x3FFFFF;
97 50 else return (addr&0x7F0000)>>1|(addr&0x7FFF);
98 }
99
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)
100 {
101
1/2
✓ Branch 0 taken 130 times.
✗ Branch 1 not taken.
130 if ((addr&0x408000)==0x008000)
102 {
103 130 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
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)
112 {
113
2/2
✓ Branch 0 taken 112 times.
✓ Branch 1 taken 122 times.
234 if ((addr&0xC00000)==0xC00000)//hirom
114 {
115 112 return (addr&0x3FFFFF)|0x400000;
116 }
117
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
118 {
119
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 122 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/4
✓ Branch 0 taken 176 times.
✓ Branch 1 taken 202 times.
✓ Branch 2 taken 202 times.
✗ Branch 3 not taken.
378 if (mapper==norom)
125 {
126 378 return addr;
127 }
128 return -1;
129 }
130
131 152041 inline int pctosnes(int addr)
132 {
133
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 152041 times.
152041 if (addr<0) return -1;
134
4/4
✓ Branch 0 taken 75545 times.
✓ Branch 1 taken 76496 times.
✓ Branch 2 taken 75706 times.
✓ Branch 3 taken 418 times.
152041 if (mapper==lorom)
135 {
136
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 151251 times.
151251 if (addr>=0x400000) return -1;
137
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 75706 times.
151251 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
138 151251 return addr|0x800000;
139 }
140
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)
141 {
142
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 208 times.
208 if (addr>=0x400000) return -1;
143 208 return addr|0xC00000;
144 }
145
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)
146 {
147
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 89 times.
89 if (addr>=0x800000) return -1;
148
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 78 times.
89 if (addr&0x400000)
149 {
150 11 addr-=0x400000;
151
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
11 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
152 11 return addr;
153 }
154 else
155 {
156
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 39 times.
78 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
157 78 return addr|0x800000;
158 }
159 }
160
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)
161 {
162
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 101 times.
101 if (addr>=0x800000) return -1;
163
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 90 times.
101 if (addr&0x400000) return addr;
164 90 return addr|0xC00000;
165 }
166
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)
167 {
168
1/2
✓ Branch 0 taken 149 times.
✗ Branch 1 not taken.
149 for (int i=0;i<8;i++)
169 {
170
6/8
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 40 times.
✓ Branch 2 taken 37 times.
✓ Branch 3 taken 40 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 37 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 37 times.
149 if (sa1banks[i]==(addr&0x700000)){ return 0x008000|(i<<21)|((addr&0x0F8000)<<1)|(addr&0x7FFF);}
171 }
172 return -1;
173 }
174
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)
175 {
176
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 101 times.
101 if (addr>=0x800000) return -1;
177
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 53 times.
101 if ((addr&0x400000)==0x400000)
178 {
179 48 return addr|0xC00000;
180 }
181
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 24 times.
53 if ((addr&0x600000)==0x000000)
182 {
183
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
29 return ((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
184 }
185
1/2
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
24 if ((addr&0x600000)==0x200000)
186 {
187
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
24 return 0x800000|((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
188 }
189 return -1;
190 }
191
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)
192 {
193
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 37 times.
39 if (addr>=0x200000) return -1;
194
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 21 times.
37 return ((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
195 }
196
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)
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