asar coverage - build #136


src/asar/
File: src/asar/libsmw.h
Date: 2024-01-23 08:00:15
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 // optionally don't add the romwrite, because sometimes we did that in an earlier pass already
31 void writeromdata_byte(int pcoffset, unsigned char indata, bool add_write = true);
32 void writeromdata_bytes(int pcoffset, unsigned char indata, int numbytes);
33
34 struct writtenblockdata {
35 int pcoffset;
36 int snesoffset;
37 int numbytes;
38 };
39
40 extern autoarray<writtenblockdata> writtenblocks;
41 extern std::vector<writtenblockdata> found_rats_tags;
42 extern bool found_rats_tags_initialized;
43
44 890363 inline int snestopc(int addr)
45 {
46
3/4
✓ Branch 0 taken 888911 times.
✓ Branch 1 taken 1452 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 444600 times.
890363 if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit
47
2/2
✓ Branch 0 taken 880528 times.
✓ Branch 1 taken 8383 times.
888911 if (mapper==lorom)
48 {
49 // randomdude999: The low pages ($0000-$7FFF) of banks 70-7D are used
50 // for SRAM, the high pages are available for ROM data though
51
1/2
✓ Branch 0 taken 880528 times.
✗ Branch 1 not taken.
880528 if ((addr&0xFE0000)==0x7E0000 ||//wram
52
2/2
✓ Branch 0 taken 880498 times.
✓ Branch 1 taken 30 times.
880528 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, other strange junk
53
2/2
✓ Branch 0 taken 440147 times.
✓ Branch 1 taken 440351 times.
880498 (addr&0x708000)==0x700000)//sram (low parts of banks 70-7D)
54 15 return -1;
55 880498 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
56 880498 return addr;
57 }
58
2/2
✓ Branch 0 taken 1117 times.
✓ Branch 1 taken 3117 times.
4234 if (mapper==hirom)
59 {
60
1/2
✓ Branch 0 taken 2212 times.
✗ Branch 1 not taken.
2212 if ((addr&0xFE0000)==0x7E0000 ||//wram
61
2/2
✓ Branch 0 taken 1095 times.
✓ Branch 1 taken 1117 times.
2212 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
62 return -1;
63 2212 return addr&0x3FFFFF;
64 }
65
2/2
✓ Branch 0 taken 914 times.
✓ Branch 1 taken 2203 times.
3117 if (mapper==exlorom)
66 {
67
1/2
✓ Branch 0 taken 1818 times.
✗ Branch 1 not taken.
1818 if ((addr&0xF00000)==0x700000 ||//wram, sram
68
2/2
✓ Branch 0 taken 904 times.
✓ Branch 1 taken 914 times.
1818 (addr&0x408000)==0x000000)//area that shouldn't be used in lorom
69 return -1;
70
2/2
✓ Branch 0 taken 456 times.
✓ Branch 1 taken 1362 times.
1818 if (addr&0x800000)
71 {
72 456 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
73 }
74 else
75 {
76 1362 addr=((addr&0x7F0000)>>1|(addr&0x7FFF))+0x400000;
77 }
78 1818 return addr;
79 }
80
2/2
✓ Branch 0 taken 956 times.
✓ Branch 1 taken 1247 times.
2203 if (mapper==exhirom)
81 {
82
1/2
✓ Branch 0 taken 1902 times.
✗ Branch 1 not taken.
1902 if ((addr&0xFE0000)==0x7E0000 ||//wram
83
2/2
✓ Branch 0 taken 946 times.
✓ Branch 1 taken 956 times.
1902 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
84 return -1;
85
2/2
✓ Branch 0 taken 1368 times.
✓ Branch 1 taken 534 times.
1902 if ((addr&0x800000)==0x000000) return (addr&0x3FFFFF)|0x400000;
86 534 return addr&0x3FFFFF;
87 }
88
2/2
✓ Branch 0 taken 110 times.
✓ Branch 1 taken 1137 times.
1247 if (mapper==sfxrom)
89 {
90 // Asar emulates GSU1, because apparently emulators don't support the extra ROM data from GSU2
91
1/2
✓ Branch 0 taken 210 times.
✗ Branch 1 not taken.
210 if ((addr&0x600000)==0x600000 ||//wram, sram, open bus
92
1/2
✓ Branch 0 taken 210 times.
✗ Branch 1 not taken.
210 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, rom mirrors, other strange junk
93
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 110 times.
210 (addr&0x800000)==0x800000)//fastrom isn't valid either in superfx
94 return -1;
95
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 210 times.
210 if (addr&0x400000) return addr&0x3FFFFF;
96 210 else return (addr&0x7F0000)>>1|(addr&0x7FFF);
97 }
98
2/2
✓ Branch 0 taken 230 times.
✓ Branch 1 taken 907 times.
1137 if (mapper==sa1rom)
99 {
100
1/2
✓ Branch 0 taken 450 times.
✗ Branch 1 not taken.
450 if ((addr&0x408000)==0x008000)
101 {
102 450 return sa1banks[(addr&0xE00000)>>21]|((addr&0x1F0000)>>1)|(addr&0x007FFF);
103 }
104 if ((addr&0xC00000)==0xC00000)
105 {
106 return sa1banks[((addr&0x100000)>>20)|((addr&0x200000)>>19)]|(addr&0x0FFFFF);
107 }
108 return -1;
109 }
110
2/2
✓ Branch 0 taken 366 times.
✓ Branch 1 taken 541 times.
907 if (mapper==bigsa1rom)
111 {
112
2/2
✓ Branch 0 taken 336 times.
✓ Branch 1 taken 386 times.
722 if ((addr&0xC00000)==0xC00000)//hirom
113 {
114 336 return (addr&0x3FFFFF)|0x400000;
115 }
116
3/4
✓ Branch 0 taken 168 times.
✓ Branch 1 taken 218 times.
✓ Branch 2 taken 168 times.
✗ Branch 3 not taken.
386 if ((addr&0xC00000)==0x000000 || (addr&0xC00000)==0x800000)//lorom
117 {
118
2/2
✓ Branch 0 taken 188 times.
✓ Branch 1 taken 198 times.
386 if ((addr&0x008000)==0x000000) return -1;
119 386 return (addr&0x800000)>>2 | (addr&0x3F0000)>>1 | (addr&0x7FFF);
120 }
121 return -1;
122 }
123
1/2
✓ Branch 0 taken 541 times.
✗ Branch 1 not taken.
541 if (mapper==norom)
124 {
125 1069 return addr;
126 }
127 return -1;
128 }
129
130 455659 inline int pctosnes(int addr)
131 {
132
2/2
✓ Branch 0 taken 227764 times.
✓ Branch 1 taken 227895 times.
455659 if (addr<0) return -1;
133
2/2
✓ Branch 0 taken 453214 times.
✓ Branch 1 taken 2445 times.
455659 if (mapper==lorom)
134 {
135
2/2
✓ Branch 0 taken 226561 times.
✓ Branch 1 taken 226653 times.
453214 if (addr>=0x400000) return -1;
136 453214 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
137 453214 return addr|0x800000;
138 }
139
2/2
✓ Branch 0 taken 345 times.
✓ Branch 1 taken 897 times.
1242 if (mapper==hirom)
140 {
141
2/2
✓ Branch 0 taken 337 times.
✓ Branch 1 taken 345 times.
682 if (addr>=0x400000) return -1;
142 682 return addr|0xC00000;
143 }
144
2/2
✓ Branch 0 taken 131 times.
✓ Branch 1 taken 766 times.
897 if (mapper == exlorom)
145 {
146
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 131 times.
257 if (addr>=0x800000) return -1;
147
2/2
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 234 times.
257 if (addr&0x400000)
148 {
149 23 addr-=0x400000;
150 23 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
151 23 return addr;
152 }
153 else
154 {
155 234 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
156 234 return addr|0x800000;
157 }
158 }
159
2/2
✓ Branch 0 taken 149 times.
✓ Branch 1 taken 617 times.
766 if (mapper == exhirom)
160 {
161
2/2
✓ Branch 0 taken 144 times.
✓ Branch 1 taken 149 times.
293 if (addr>=0x800000) return -1;
162
2/2
✓ Branch 0 taken 149 times.
✓ Branch 1 taken 144 times.
293 if (addr&0x400000) return addr;
163 270 return addr|0xC00000;
164 }
165
2/2
✓ Branch 0 taken 121 times.
✓ Branch 1 taken 496 times.
617 if (mapper==sa1rom)
166 {
167
1/2
✓ Branch 0 taken 477 times.
✗ Branch 1 not taken.
477 for (int i=0;i<8;i++)
168 {
169
2/2
✓ Branch 0 taken 237 times.
✓ Branch 1 taken 240 times.
477 if (sa1banks[i]==(addr&0x700000)){ return 0x008000|(i<<21)|((addr&0x0F8000)<<1)|(addr&0x7FFF);}
170 }
171 return -1;
172 }
173
2/2
✓ Branch 0 taken 159 times.
✓ Branch 1 taken 337 times.
496 if (mapper==bigsa1rom)
174 {
175
2/2
✓ Branch 0 taken 154 times.
✓ Branch 1 taken 159 times.
313 if (addr>=0x800000) return -1;
176
2/2
✓ Branch 0 taken 144 times.
✓ Branch 1 taken 169 times.
313 if ((addr&0x400000)==0x400000)
177 {
178 144 return addr|0xC00000;
179 }
180
2/2
✓ Branch 0 taken 97 times.
✓ Branch 1 taken 72 times.
169 if ((addr&0x600000)==0x000000)
181 {
182 97 return ((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
183 }
184
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 if ((addr&0x600000)==0x200000)
185 {
186 72 return 0x800000|((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
187 }
188 return -1;
189 }
190
2/2
✓ Branch 0 taken 76 times.
✓ Branch 1 taken 261 times.
337 if (mapper==sfxrom)
191 {
192
2/2
✓ Branch 0 taken 71 times.
✓ Branch 1 taken 76 times.
147 if (addr>=0x200000) return -1;
193 141 return ((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
194 }
195
1/2
✓ Branch 0 taken 261 times.
✗ Branch 1 not taken.
261 if (mapper==norom)
196 {
197 516 return addr;
198 }
199 return -1;
200 }
201
202 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);
203 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);
204
205 void removerats(int snesaddr, unsigned char clean_byte);
206 void handle_cleared_rats_tags();
207 int ratsstart(int pcaddr);
208
209 void fixchecksum();
210
211 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.
212