asar coverage - build #72


src/asar/
File: src/asar/libsmw.h
Date: 2024-01-18 08:25:45
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 void writeromdata_byte(int pcoffset, unsigned char indata);
31 void writeromdata_bytes(int pcoffset, unsigned char indata, int numbytes);
32
33 struct writtenblockdata {
34 int pcoffset;
35 int snesoffset;
36 int numbytes;
37 };
38
39 extern autoarray<writtenblockdata> writtenblocks;
40 extern std::vector<writtenblockdata> found_rats_tags;
41 extern bool found_rats_tags_initialized;
42
43 321145 inline int snestopc(int addr)
44 {
45
3/4
✓ Branch 0 taken 320661 times.
✓ Branch 1 taken 484 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 160333 times.
321145 if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit
46
2/2
✓ Branch 0 taken 314123 times.
✓ Branch 1 taken 6538 times.
320661 if (mapper==lorom)
47 {
48 // randomdude999: The low pages ($0000-$7FFF) of banks 70-7D are used
49 // for SRAM, the high pages are available for ROM data though
50
1/2
✓ Branch 0 taken 314123 times.
✗ Branch 1 not taken.
314123 if ((addr&0xFE0000)==0x7E0000 ||//wram
51
2/2
✓ Branch 0 taken 314113 times.
✓ Branch 1 taken 10 times.
314123 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, other strange junk
52
2/2
✓ Branch 0 taken 157055 times.
✓ Branch 1 taken 157058 times.
314113 (addr&0x708000)==0x700000)//sram (low parts of banks 70-7D)
53 5 return -1;
54 314113 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
55 314113 return addr;
56 }
57
2/2
✓ Branch 0 taken 921 times.
✓ Branch 1 taken 2349 times.
3270 if (mapper==hirom)
58 {
59
1/2
✓ Branch 0 taken 1840 times.
✗ Branch 1 not taken.
1840 if ((addr&0xFE0000)==0x7E0000 ||//wram
60
2/2
✓ Branch 0 taken 919 times.
✓ Branch 1 taken 921 times.
1840 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
61 return -1;
62 1840 return addr&0x3FFFFF;
63 }
64
2/2
✓ Branch 0 taken 817 times.
✓ Branch 1 taken 1532 times.
2349 if (mapper==exlorom)
65 {
66
1/2
✓ Branch 0 taken 1634 times.
✗ Branch 1 not taken.
1634 if ((addr&0xF00000)==0x700000 ||//wram, sram
67
2/2
✓ Branch 0 taken 817 times.
✓ Branch 1 taken 817 times.
1634 (addr&0x408000)==0x000000)//area that shouldn't be used in lorom
68 return -1;
69
2/2
✓ Branch 0 taken 294 times.
✓ Branch 1 taken 1340 times.
1634 if (addr&0x800000)
70 {
71 294 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
72 }
73 else
74 {
75 1340 addr=((addr&0x7F0000)>>1|(addr&0x7FFF))+0x400000;
76 }
77 1634 return addr;
78 }
79
2/2
✓ Branch 0 taken 843 times.
✓ Branch 1 taken 689 times.
1532 if (mapper==exhirom)
80 {
81
1/2
✓ Branch 0 taken 1686 times.
✗ Branch 1 not taken.
1686 if ((addr&0xFE0000)==0x7E0000 ||//wram
82
2/2
✓ Branch 0 taken 843 times.
✓ Branch 1 taken 843 times.
1686 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
83 return -1;
84
2/2
✓ Branch 0 taken 1342 times.
✓ Branch 1 taken 344 times.
1686 if ((addr&0x800000)==0x000000) return (addr&0x3FFFFF)|0x400000;
85 344 return addr&0x3FFFFF;
86 }
87
2/2
✓ Branch 0 taken 47 times.
✓ Branch 1 taken 642 times.
689 if (mapper==sfxrom)
88 {
89 // Asar emulates GSU1, because apparently emulators don't support the extra ROM data from GSU2
90
1/2
✓ Branch 0 taken 94 times.
✗ Branch 1 not taken.
94 if ((addr&0x600000)==0x600000 ||//wram, sram, open bus
91
1/2
✓ Branch 0 taken 94 times.
✗ Branch 1 not taken.
94 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, rom mirrors, other strange junk
92
2/2
✓ Branch 0 taken 47 times.
✓ Branch 1 taken 47 times.
94 (addr&0x800000)==0x800000)//fastrom isn't valid either in superfx
93 return -1;
94
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 94 times.
94 if (addr&0x400000) return addr&0x3FFFFF;
95 94 else return (addr&0x7F0000)>>1|(addr&0x7FFF);
96 }
97
2/2
✓ Branch 0 taken 102 times.
✓ Branch 1 taken 540 times.
642 if (mapper==sa1rom)
98 {
99
1/2
✓ Branch 0 taken 204 times.
✗ Branch 1 not taken.
204 if ((addr&0x408000)==0x008000)
100 {
101 204 return sa1banks[(addr&0xE00000)>>21]|((addr&0x1F0000)>>1)|(addr&0x007FFF);
102 }
103 if ((addr&0xC00000)==0xC00000)
104 {
105 return sa1banks[((addr&0x100000)>>20)|((addr&0x200000)>>19)]|(addr&0x0FFFFF);
106 }
107 return -1;
108 }
109
2/2
✓ Branch 0 taken 202 times.
✓ Branch 1 taken 338 times.
540 if (mapper==bigsa1rom)
110 {
111
2/2
✓ Branch 0 taken 192 times.
✓ Branch 1 taken 212 times.
404 if ((addr&0xC00000)==0xC00000)//hirom
112 {
113 192 return (addr&0x3FFFFF)|0x400000;
114 }
115
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
116 {
117
2/2
✓ Branch 0 taken 106 times.
✓ Branch 1 taken 106 times.
212 if ((addr&0x008000)==0x000000) return -1;
118 212 return (addr&0x800000)>>2 | (addr&0x3F0000)>>1 | (addr&0x7FFF);
119 }
120 return -1;
121 }
122
1/2
✓ Branch 0 taken 338 times.
✗ Branch 1 not taken.
338 if (mapper==norom)
123 {
124 676 return addr;
125 }
126 return -1;
127 }
128
129 160942 inline int pctosnes(int addr)
130 {
131
2/2
✓ Branch 0 taken 80471 times.
✓ Branch 1 taken 80471 times.
160942 if (addr<0) return -1;
132
2/2
✓ Branch 0 taken 159578 times.
✓ Branch 1 taken 1364 times.
160942 if (mapper==lorom)
133 {
134
2/2
✓ Branch 0 taken 79789 times.
✓ Branch 1 taken 79789 times.
159578 if (addr>=0x400000) return -1;
135 159578 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
136 159578 return addr|0x800000;
137 }
138
2/2
✓ Branch 0 taken 156 times.
✓ Branch 1 taken 526 times.
682 if (mapper==hirom)
139 {
140
2/2
✓ Branch 0 taken 156 times.
✓ Branch 1 taken 156 times.
312 if (addr>=0x400000) return -1;
141 312 return addr|0xC00000;
142 }
143
2/2
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 448 times.
526 if (mapper == exlorom)
144 {
145
2/2
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 78 times.
156 if (addr>=0x800000) return -1;
146
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 150 times.
156 if (addr&0x400000)
147 {
148 6 addr-=0x400000;
149 6 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
150 6 return addr;
151 }
152 else
153 {
154 150 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
155 150 return addr|0x800000;
156 }
157 }
158
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 358 times.
448 if (mapper == exhirom)
159 {
160
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 90 times.
180 if (addr>=0x800000) return -1;
161
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 90 times.
180 if (addr&0x400000) return addr;
162 174 return addr|0xC00000;
163 }
164
2/2
✓ Branch 0 taken 58 times.
✓ Branch 1 taken 300 times.
358 if (mapper==sa1rom)
165 {
166
1/2
✓ Branch 0 taken 276 times.
✗ Branch 1 not taken.
276 for (int i=0;i<8;i++)
167 {
168
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);}
169 }
170 return -1;
171 }
172
2/2
✓ Branch 0 taken 101 times.
✓ Branch 1 taken 199 times.
300 if (mapper==bigsa1rom)
173 {
174
2/2
✓ Branch 0 taken 101 times.
✓ Branch 1 taken 101 times.
202 if (addr>=0x800000) return -1;
175
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 106 times.
202 if ((addr&0x400000)==0x400000)
176 {
177 96 return addr|0xC00000;
178 }
179
2/2
✓ Branch 0 taken 58 times.
✓ Branch 1 taken 48 times.
106 if ((addr&0x600000)==0x000000)
180 {
181 58 return ((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
182 }
183
1/2
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
48 if ((addr&0x600000)==0x200000)
184 {
185 48 return 0x800000|((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
186 }
187 return -1;
188 }
189
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 170 times.
199 if (mapper==sfxrom)
190 {
191
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 29 times.
58 if (addr>=0x200000) return -1;
192 54 return ((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
193 }
194
1/2
✓ Branch 0 taken 170 times.
✗ Branch 1 not taken.
170 if (mapper==norom)
195 {
196 340 return addr;
197 }
198 return -1;
199 }
200
201 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);
202 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);
203
204 void removerats(int snesaddr, unsigned char clean_byte);
205 void handle_cleared_rats_tags();
206 int ratsstart(int pcaddr);
207
208 void fixchecksum();
209
210 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.
211