asar coverage - build #69


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

Line Branch Exec Source
1 #pragma once
2
3 #include "errors.h"
4 #include "autoarray.h"
5 #include <cstdint>
6
7 extern const unsigned char * romdata;
8 extern int romlen;
9 extern asar_error_id openromerror;
10 bool openrom(const char * filename, bool confirm=true);
11 uint32_t closerom(bool save = true);
12
13 enum mapper_t {
14 invalid_mapper,
15 lorom,
16 hirom,
17 sa1rom,
18 bigsa1rom,
19 sfxrom,
20 exlorom,
21 exhirom,
22 norom
23 } extern mapper;
24
25 extern int sa1banks[8];//only 0, 1, 4, 5 are used
26
27 void addromwrite(int pcoffset, int numbytes);
28 void writeromdata(int pcoffset, const void * indata, int numbytes);
29 void writeromdata_byte(int pcoffset, unsigned char indata);
30 void writeromdata_bytes(int pcoffset, unsigned char indata, int numbytes);
31
32 struct writtenblockdata {
33 int pcoffset;
34 int snesoffset;
35 int numbytes;
36 };
37
38 extern autoarray<writtenblockdata> writtenblocks;
39
40 319125 inline int snestopc(int addr)
41 {
42
3/4
✓ Branch 0 taken 319117 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 159560 times.
319125 if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit
43
2/2
✓ Branch 0 taken 313111 times.
✓ Branch 1 taken 6006 times.
319117 if (mapper==lorom)
44 {
45 // randomdude999: The low pages ($0000-$7FFF) of banks 70-7D are used
46 // for SRAM, the high pages are available for ROM data though
47
1/2
✓ Branch 0 taken 313111 times.
✗ Branch 1 not taken.
313111 if ((addr&0xFE0000)==0x7E0000 ||//wram
48
2/2
✓ Branch 0 taken 313101 times.
✓ Branch 1 taken 10 times.
313111 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, other strange junk
49
2/2
✓ Branch 0 taken 156549 times.
✓ Branch 1 taken 156552 times.
313101 (addr&0x708000)==0x700000)//sram (low parts of banks 70-7D)
50 5 return -1;
51 313101 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
52 313101 return addr;
53 }
54
2/2
✓ Branch 0 taken 794 times.
✓ Branch 1 taken 2209 times.
3003 if (mapper==hirom)
55 {
56
1/2
✓ Branch 0 taken 1588 times.
✗ Branch 1 not taken.
1588 if ((addr&0xFE0000)==0x7E0000 ||//wram
57
2/2
✓ Branch 0 taken 794 times.
✓ Branch 1 taken 794 times.
1588 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
58 return -1;
59 1588 return addr&0x3FFFFF;
60 }
61
2/2
✓ Branch 0 taken 748 times.
✓ Branch 1 taken 1461 times.
2209 if (mapper==exlorom)
62 {
63
1/2
✓ Branch 0 taken 1496 times.
✗ Branch 1 not taken.
1496 if ((addr&0xF00000)==0x700000 ||//wram, sram
64
2/2
✓ Branch 0 taken 748 times.
✓ Branch 1 taken 748 times.
1496 (addr&0x408000)==0x000000)//area that shouldn't be used in lorom
65 return -1;
66
2/2
✓ Branch 0 taken 294 times.
✓ Branch 1 taken 1202 times.
1496 if (addr&0x800000)
67 {
68 294 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
69 }
70 else
71 {
72 1202 addr=((addr&0x7F0000)>>1|(addr&0x7FFF))+0x400000;
73 }
74 1496 return addr;
75 }
76
2/2
✓ Branch 0 taken 774 times.
✓ Branch 1 taken 687 times.
1461 if (mapper==exhirom)
77 {
78
1/2
✓ Branch 0 taken 1548 times.
✗ Branch 1 not taken.
1548 if ((addr&0xFE0000)==0x7E0000 ||//wram
79
2/2
✓ Branch 0 taken 774 times.
✓ Branch 1 taken 774 times.
1548 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
80 return -1;
81
2/2
✓ Branch 0 taken 1204 times.
✓ Branch 1 taken 344 times.
1548 if ((addr&0x800000)==0x000000) return (addr&0x3FFFFF)|0x400000;
82 344 return addr&0x3FFFFF;
83 }
84
2/2
✓ Branch 0 taken 46 times.
✓ Branch 1 taken 641 times.
687 if (mapper==sfxrom)
85 {
86 // Asar emulates GSU1, because apparently emulators don't support the extra ROM data from GSU2
87
1/2
✓ Branch 0 taken 92 times.
✗ Branch 1 not taken.
92 if ((addr&0x600000)==0x600000 ||//wram, sram, open bus
88
1/2
✓ Branch 0 taken 92 times.
✗ Branch 1 not taken.
92 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, rom mirrors, other strange junk
89
2/2
✓ Branch 0 taken 46 times.
✓ Branch 1 taken 46 times.
92 (addr&0x800000)==0x800000)//fastrom isn't valid either in superfx
90 return -1;
91
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 92 times.
92 if (addr&0x400000) return addr&0x3FFFFF;
92 92 else return (addr&0x7F0000)>>1|(addr&0x7FFF);
93 }
94
2/2
✓ Branch 0 taken 101 times.
✓ Branch 1 taken 540 times.
641 if (mapper==sa1rom)
95 {
96
1/2
✓ Branch 0 taken 202 times.
✗ Branch 1 not taken.
202 if ((addr&0x408000)==0x008000)
97 {
98 202 return sa1banks[(addr&0xE00000)>>21]|((addr&0x1F0000)>>1)|(addr&0x007FFF);
99 }
100 if ((addr&0xC00000)==0xC00000)
101 {
102 return sa1banks[((addr&0x100000)>>20)|((addr&0x200000)>>19)]|(addr&0x0FFFFF);
103 }
104 return -1;
105 }
106
2/2
✓ Branch 0 taken 202 times.
✓ Branch 1 taken 338 times.
540 if (mapper==bigsa1rom)
107 {
108
2/2
✓ Branch 0 taken 192 times.
✓ Branch 1 taken 212 times.
404 if ((addr&0xC00000)==0xC00000)//hirom
109 {
110 192 return (addr&0x3FFFFF)|0x400000;
111 }
112
3/4
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 116 times.
✓ Branch 2 taken 96 times.
✗ Branch 3 not taken.
212 if ((addr&0xC00000)==0x000000 || (addr&0xC00000)==0x800000)//lorom
113 {
114
2/2
✓ Branch 0 taken 106 times.
✓ Branch 1 taken 106 times.
212 if ((addr&0x008000)==0x000000) return -1;
115 212 return (addr&0x800000)>>2 | (addr&0x3F0000)>>1 | (addr&0x7FFF);
116 }
117 return -1;
118 }
119
1/2
✓ Branch 0 taken 338 times.
✗ Branch 1 not taken.
338 if (mapper==norom)
120 {
121 676 return addr;
122 }
123 return -1;
124 }
125
126 159706 inline int pctosnes(int addr)
127 {
128
2/2
✓ Branch 0 taken 79853 times.
✓ Branch 1 taken 79853 times.
159706 if (addr<0) return -1;
129
2/2
✓ Branch 0 taken 158458 times.
✓ Branch 1 taken 1248 times.
159706 if (mapper==lorom)
130 {
131
2/2
✓ Branch 0 taken 79229 times.
✓ Branch 1 taken 79229 times.
158458 if (addr>=0x400000) return -1;
132 158458 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
133 158458 return addr|0x800000;
134 }
135
2/2
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 526 times.
624 if (mapper==hirom)
136 {
137
2/2
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 98 times.
196 if (addr>=0x400000) return -1;
138 196 return addr|0xC00000;
139 }
140
2/2
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 448 times.
526 if (mapper == exlorom)
141 {
142
2/2
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 78 times.
156 if (addr>=0x800000) return -1;
143
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 150 times.
156 if (addr&0x400000)
144 {
145 6 addr-=0x400000;
146 6 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
147 6 return addr;
148 }
149 else
150 {
151 150 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
152 150 return addr|0x800000;
153 }
154 }
155
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 358 times.
448 if (mapper == exhirom)
156 {
157
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 90 times.
180 if (addr>=0x800000) return -1;
158
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 90 times.
180 if (addr&0x400000) return addr;
159 174 return addr|0xC00000;
160 }
161
2/2
✓ Branch 0 taken 58 times.
✓ Branch 1 taken 300 times.
358 if (mapper==sa1rom)
162 {
163
1/2
✓ Branch 0 taken 276 times.
✗ Branch 1 not taken.
276 for (int i=0;i<8;i++)
164 {
165
2/2
✓ Branch 0 taken 116 times.
✓ Branch 1 taken 160 times.
276 if (sa1banks[i]==(addr&0x700000)){ return 0x008000|(i<<21)|((addr&0x0F8000)<<1)|(addr&0x7FFF);}
166 }
167 return -1;
168 }
169
2/2
✓ Branch 0 taken 101 times.
✓ Branch 1 taken 199 times.
300 if (mapper==bigsa1rom)
170 {
171
2/2
✓ Branch 0 taken 101 times.
✓ Branch 1 taken 101 times.
202 if (addr>=0x800000) return -1;
172
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 106 times.
202 if ((addr&0x400000)==0x400000)
173 {
174 96 return addr|0xC00000;
175 }
176
2/2
✓ Branch 0 taken 58 times.
✓ Branch 1 taken 48 times.
106 if ((addr&0x600000)==0x000000)
177 {
178 58 return ((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
179 }
180
1/2
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
48 if ((addr&0x600000)==0x200000)
181 {
182 48 return 0x800000|((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
183 }
184 return -1;
185 }
186
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 170 times.
199 if (mapper==sfxrom)
187 {
188
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 29 times.
58 if (addr>=0x200000) return -1;
189 54 return ((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
190 }
191
1/2
✓ Branch 0 taken 170 times.
✗ Branch 1 not taken.
170 if (mapper==norom)
192 {
193 340 return addr;
194 }
195 return -1;
196 }
197
198 int getpcfreespace(int size, int target_bank, bool autoexpand=true, bool respectbankborders=true, bool align=false, unsigned char freespacebyte=0x00, bool write_rats=true);
199 int getsnesfreespace(int size, int target_bank, bool autoexpand=true, bool respectbankborders=true, bool align=false, unsigned char freespacebyte=0x00, bool write_rats=true);
200
201 void removerats(int snesaddr, unsigned char clean_byte);
202 void handle_cleared_rats_tags();
203 int ratsstart(int pcaddr);
204
205 void fixchecksum();
206
207 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.
208