asar coverage - build #175


src/asar/
File: src/asar/libsmw.h
Date: 2024-01-28 00:44:31
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 unsigned char freespacebyte;
11 extern asar_error_id openromerror;
12 bool openrom(const char * filename, bool confirm=true);
13 uint32_t closerom(bool save = true);
14
15 enum mapper_t {
16 invalid_mapper,
17 lorom,
18 hirom,
19 sa1rom,
20 bigsa1rom,
21 sfxrom,
22 exlorom,
23 exhirom,
24 norom
25 } extern mapper;
26
27 extern int sa1banks[8];//only 0, 1, 4, 5 are used
28
29 void addromwrite(int pcoffset, int numbytes);
30 void writeromdata(int pcoffset, const void * indata, int numbytes);
31 // optionally don't add the romwrite, because sometimes we did that in an earlier pass already
32 // (or sometimes the bytes are just rom size padding)
33 void writeromdata_byte(int pcoffset, unsigned char indata, bool add_write = true);
34 void writeromdata_bytes(int pcoffset, unsigned char indata, int numbytes, bool add_write = true);
35
36 struct writtenblockdata {
37 int pcoffset;
38 int snesoffset;
39 int numbytes;
40 };
41
42 extern autoarray<writtenblockdata> writtenblocks;
43 extern std::vector<writtenblockdata> found_rats_tags;
44 extern bool found_rats_tags_initialized;
45
46 892941 inline int snestopc(int addr)
47 {
48
3/4
✓ Branch 0 taken 891429 times.
✓ Branch 1 taken 1512 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 445859 times.
892941 if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit
49
2/2
✓ Branch 0 taken 882632 times.
✓ Branch 1 taken 8797 times.
891429 if (mapper==lorom)
50 {
51 // randomdude999: The low pages ($0000-$7FFF) of banks 70-7D are used
52 // for SRAM, the high pages are available for ROM data though
53
1/2
✓ Branch 0 taken 882632 times.
✗ Branch 1 not taken.
882632 if ((addr&0xFE0000)==0x7E0000 ||//wram
54
2/2
✓ Branch 0 taken 882620 times.
✓ Branch 1 taken 12 times.
882632 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, other strange junk
55
2/2
✓ Branch 0 taken 441208 times.
✓ Branch 1 taken 441412 times.
882620 (addr&0x708000)==0x700000)//sram (low parts of banks 70-7D)
56 6 return -1;
57 882620 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
58 882620 return addr;
59 }
60
2/2
✓ Branch 0 taken 1186 times.
✓ Branch 1 taken 3255 times.
4441 if (mapper==hirom)
61 {
62
1/2
✓ Branch 0 taken 2350 times.
✗ Branch 1 not taken.
2350 if ((addr&0xFE0000)==0x7E0000 ||//wram
63
2/2
✓ Branch 0 taken 1164 times.
✓ Branch 1 taken 1186 times.
2350 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
64 return -1;
65 2350 return addr&0x3FFFFF;
66 }
67
2/2
✓ Branch 0 taken 983 times.
✓ Branch 1 taken 2272 times.
3255 if (mapper==exlorom)
68 {
69
1/2
✓ Branch 0 taken 1956 times.
✗ Branch 1 not taken.
1956 if ((addr&0xF00000)==0x700000 ||//wram, sram
70
2/2
✓ Branch 0 taken 973 times.
✓ Branch 1 taken 983 times.
1956 (addr&0x408000)==0x000000)//area that shouldn't be used in lorom
71 return -1;
72
2/2
✓ Branch 0 taken 456 times.
✓ Branch 1 taken 1500 times.
1956 if (addr&0x800000)
73 {
74 456 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
75 }
76 else
77 {
78 1500 addr=((addr&0x7F0000)>>1|(addr&0x7FFF))+0x400000;
79 }
80 1956 return addr;
81 }
82
2/2
✓ Branch 0 taken 1025 times.
✓ Branch 1 taken 1247 times.
2272 if (mapper==exhirom)
83 {
84
1/2
✓ Branch 0 taken 2040 times.
✗ Branch 1 not taken.
2040 if ((addr&0xFE0000)==0x7E0000 ||//wram
85
2/2
✓ Branch 0 taken 1015 times.
✓ Branch 1 taken 1025 times.
2040 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
86 return -1;
87
2/2
✓ Branch 0 taken 1506 times.
✓ Branch 1 taken 534 times.
2040 if ((addr&0x800000)==0x000000) return (addr&0x3FFFFF)|0x400000;
88 534 return addr&0x3FFFFF;
89 }
90
2/2
✓ Branch 0 taken 110 times.
✓ Branch 1 taken 1137 times.
1247 if (mapper==sfxrom)
91 {
92 // Asar emulates GSU1, because apparently emulators don't support the extra ROM data from GSU2
93
1/2
✓ Branch 0 taken 210 times.
✗ Branch 1 not taken.
210 if ((addr&0x600000)==0x600000 ||//wram, sram, open bus
94
1/2
✓ Branch 0 taken 210 times.
✗ Branch 1 not taken.
210 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, rom mirrors, other strange junk
95
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 110 times.
210 (addr&0x800000)==0x800000)//fastrom isn't valid either in superfx
96 return -1;
97
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 210 times.
210 if (addr&0x400000) return addr&0x3FFFFF;
98 210 else return (addr&0x7F0000)>>1|(addr&0x7FFF);
99 }
100
2/2
✓ Branch 0 taken 230 times.
✓ Branch 1 taken 907 times.
1137 if (mapper==sa1rom)
101 {
102
1/2
✓ Branch 0 taken 450 times.
✗ Branch 1 not taken.
450 if ((addr&0x408000)==0x008000)
103 {
104 450 return sa1banks[(addr&0xE00000)>>21]|((addr&0x1F0000)>>1)|(addr&0x007FFF);
105 }
106 if ((addr&0xC00000)==0xC00000)
107 {
108 return sa1banks[((addr&0x100000)>>20)|((addr&0x200000)>>19)]|(addr&0x0FFFFF);
109 }
110 return -1;
111 }
112
2/2
✓ Branch 0 taken 366 times.
✓ Branch 1 taken 541 times.
907 if (mapper==bigsa1rom)
113 {
114
2/2
✓ Branch 0 taken 336 times.
✓ Branch 1 taken 386 times.
722 if ((addr&0xC00000)==0xC00000)//hirom
115 {
116 336 return (addr&0x3FFFFF)|0x400000;
117 }
118
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
119 {
120
2/2
✓ Branch 0 taken 188 times.
✓ Branch 1 taken 198 times.
386 if ((addr&0x008000)==0x000000) return -1;
121 386 return (addr&0x800000)>>2 | (addr&0x3F0000)>>1 | (addr&0x7FFF);
122 }
123 return -1;
124 }
125
1/2
✓ Branch 0 taken 541 times.
✗ Branch 1 not taken.
541 if (mapper==norom)
126 {
127 1069 return addr;
128 }
129 return -1;
130 }
131
132 457491 inline int pctosnes(int addr)
133 {
134
2/2
✓ Branch 0 taken 228680 times.
✓ Branch 1 taken 228811 times.
457491 if (addr<0) return -1;
135
2/2
✓ Branch 0 taken 455046 times.
✓ Branch 1 taken 2445 times.
457491 if (mapper==lorom)
136 {
137
2/2
✓ Branch 0 taken 227477 times.
✓ Branch 1 taken 227569 times.
455046 if (addr>=0x400000) return -1;
138 455046 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
139 455046 return addr|0x800000;
140 }
141
2/2
✓ Branch 0 taken 345 times.
✓ Branch 1 taken 897 times.
1242 if (mapper==hirom)
142 {
143
2/2
✓ Branch 0 taken 337 times.
✓ Branch 1 taken 345 times.
682 if (addr>=0x400000) return -1;
144 682 return addr|0xC00000;
145 }
146
2/2
✓ Branch 0 taken 131 times.
✓ Branch 1 taken 766 times.
897 if (mapper == exlorom)
147 {
148
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 131 times.
257 if (addr>=0x800000) return -1;
149
2/2
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 234 times.
257 if (addr&0x400000)
150 {
151 23 addr-=0x400000;
152 23 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
153 23 return addr;
154 }
155 else
156 {
157 234 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
158 234 return addr|0x800000;
159 }
160 }
161
2/2
✓ Branch 0 taken 149 times.
✓ Branch 1 taken 617 times.
766 if (mapper == exhirom)
162 {
163
2/2
✓ Branch 0 taken 144 times.
✓ Branch 1 taken 149 times.
293 if (addr>=0x800000) return -1;
164
2/2
✓ Branch 0 taken 149 times.
✓ Branch 1 taken 144 times.
293 if (addr&0x400000) return addr;
165 270 return addr|0xC00000;
166 }
167
2/2
✓ Branch 0 taken 121 times.
✓ Branch 1 taken 496 times.
617 if (mapper==sa1rom)
168 {
169
1/2
✓ Branch 0 taken 477 times.
✗ Branch 1 not taken.
477 for (int i=0;i<8;i++)
170 {
171
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);}
172 }
173 return -1;
174 }
175
2/2
✓ Branch 0 taken 159 times.
✓ Branch 1 taken 337 times.
496 if (mapper==bigsa1rom)
176 {
177
2/2
✓ Branch 0 taken 154 times.
✓ Branch 1 taken 159 times.
313 if (addr>=0x800000) return -1;
178
2/2
✓ Branch 0 taken 144 times.
✓ Branch 1 taken 169 times.
313 if ((addr&0x400000)==0x400000)
179 {
180 144 return addr|0xC00000;
181 }
182
2/2
✓ Branch 0 taken 97 times.
✓ Branch 1 taken 72 times.
169 if ((addr&0x600000)==0x000000)
183 {
184 97 return ((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
185 }
186
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 if ((addr&0x600000)==0x200000)
187 {
188 72 return 0x800000|((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
189 }
190 return -1;
191 }
192
2/2
✓ Branch 0 taken 76 times.
✓ Branch 1 taken 261 times.
337 if (mapper==sfxrom)
193 {
194
2/2
✓ Branch 0 taken 71 times.
✓ Branch 1 taken 76 times.
147 if (addr>=0x200000) return -1;
195 141 return ((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
196 }
197
1/2
✓ Branch 0 taken 261 times.
✗ Branch 1 not taken.
261 if (mapper==norom)
198 {
199 516 return addr;
200 }
201 return -1;
202 }
203
204 int getpcfreespace(int size, int target_bank, bool autoexpand=true, bool respectbankborders=true, bool align=false, bool write_rats=true, int search_start=-1);
205 int getsnesfreespace(int size, int target_bank, bool autoexpand=true, bool respectbankborders=true, bool align=false, bool write_rats=true, int search_start=-1);
206
207 void removerats(int snesaddr, unsigned char clean_byte);
208 void handle_cleared_rats_tags();
209 int ratsstart(int pcaddr);
210
211 void fixchecksum();
212
213 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.
214