asar coverage - build #139


src/asar/
File: src/asar/libsmw.h
Date: 2024-01-23 10:16:20
Lines:
69/91
75.8%
Functions:
2/2
100.0%
Branches:
77/106
72.6%

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 writeromdata(int pcoffset, const void * indata, int numbytes);
28 void writeromdata_byte(int pcoffset, unsigned char indata);
29 void writeromdata_bytes(int pcoffset, unsigned char indata, int numbytes);
30
31 struct writtenblockdata {
32 int pcoffset;
33 int snesoffset;
34 int numbytes;
35 };
36
37 extern autoarray<writtenblockdata> writtenblocks;
38
39 85866 inline int snestopc(int addr)
40 {
41
2/4
✓ Branch 0 taken 85866 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 42933 times.
85866 if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit
42
2/2
✓ Branch 0 taken 81840 times.
✓ Branch 1 taken 4026 times.
85866 if (mapper==lorom)
43 {
44 // randomdude999: The low pages ($0000-$7FFF) of banks 70-7D are used
45 // for SRAM, the high pages are available for ROM data though
46
1/2
✓ Branch 0 taken 81840 times.
✗ Branch 1 not taken.
81840 if ((addr&0xFE0000)==0x7E0000 ||//wram
47
1/2
✓ Branch 0 taken 81840 times.
✗ Branch 1 not taken.
81840 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, other strange junk
48
2/2
✓ Branch 0 taken 40920 times.
✓ Branch 1 taken 40920 times.
81840 (addr&0x708000)==0x700000)//sram (low parts of banks 70-7D)
49 return -1;
50 81840 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
51 81840 return addr;
52 }
53
2/2
✓ Branch 0 taken 605 times.
✓ Branch 1 taken 1408 times.
2013 if (mapper==hirom)
54 {
55
1/2
✓ Branch 0 taken 1210 times.
✗ Branch 1 not taken.
1210 if ((addr&0xFE0000)==0x7E0000 ||//wram
56
2/2
✓ Branch 0 taken 605 times.
✓ Branch 1 taken 605 times.
1210 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
57 return -1;
58 1210 return addr&0x3FFFFF;
59 }
60
2/2
✓ Branch 0 taken 600 times.
✓ Branch 1 taken 808 times.
1408 if (mapper==exlorom)
61 {
62
1/2
✓ Branch 0 taken 1200 times.
✗ Branch 1 not taken.
1200 if ((addr&0xF00000)==0x700000 ||//wram, sram
63
2/2
✓ Branch 0 taken 600 times.
✓ Branch 1 taken 600 times.
1200 (addr&0x408000)==0x000000)//area that shouldn't be used in lorom
64 return -1;
65
2/2
✓ Branch 0 taken 84 times.
✓ Branch 1 taken 1116 times.
1200 if (addr&0x800000)
66 {
67 84 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
68 }
69 else
70 {
71 1116 addr=((addr&0x7F0000)>>1|(addr&0x7FFF))+0x400000;
72 }
73 1200 return addr;
74 }
75
2/2
✓ Branch 0 taken 610 times.
✓ Branch 1 taken 198 times.
808 if (mapper==exhirom)
76 {
77
1/2
✓ Branch 0 taken 1220 times.
✗ Branch 1 not taken.
1220 if ((addr&0xFE0000)==0x7E0000 ||//wram
78
2/2
✓ Branch 0 taken 610 times.
✓ Branch 1 taken 610 times.
1220 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
79 return -1;
80
2/2
✓ Branch 0 taken 1120 times.
✓ Branch 1 taken 100 times.
1220 if ((addr&0x800000)==0x000000) return (addr&0x3FFFFF)|0x400000;
81 100 return addr&0x3FFFFF;
82 }
83
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 169 times.
198 if (mapper==sfxrom)
84 {
85 // Asar emulates GSU1, because apparently emulators don't support the extra ROM data from GSU2
86
1/2
✓ Branch 0 taken 58 times.
✗ Branch 1 not taken.
58 if ((addr&0x600000)==0x600000 ||//wram, sram, open bus
87
1/2
✓ Branch 0 taken 58 times.
✗ Branch 1 not taken.
58 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, rom mirrors, other strange junk
88
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 29 times.
58 (addr&0x800000)==0x800000)//fastrom isn't valid either in superfx
89 return -1;
90
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 58 times.
58 if (addr&0x400000) return addr&0x3FFFFF;
91 58 else return (addr&0x7F0000)>>1|(addr&0x7FFF);
92 }
93
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 137 times.
169 if (mapper==sa1rom)
94 {
95
1/2
✓ Branch 0 taken 64 times.
✗ Branch 1 not taken.
64 if ((addr&0x408000)==0x008000)
96 {
97 64 return sa1banks[(addr&0xE00000)>>21]|((addr&0x1F0000)>>1)|(addr&0x007FFF);
98 }
99 if ((addr&0xC00000)==0xC00000)
100 {
101 return sa1banks[((addr&0x100000)>>20)|((addr&0x200000)>>19)]|(addr&0x0FFFFF);
102 }
103 return -1;
104 }
105
2/2
✓ Branch 0 taken 53 times.
✓ Branch 1 taken 84 times.
137 if (mapper==bigsa1rom)
106 {
107
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 58 times.
106 if ((addr&0xC00000)==0xC00000)//hirom
108 {
109 48 return (addr&0x3FFFFF)|0x400000;
110 }
111
3/4
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 34 times.
✓ Branch 2 taken 24 times.
✗ Branch 3 not taken.
58 if ((addr&0xC00000)==0x000000 || (addr&0xC00000)==0x800000)//lorom
112 {
113
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 29 times.
58 if ((addr&0x008000)==0x000000) return -1;
114 58 return (addr&0x800000)>>2 | (addr&0x3F0000)>>1 | (addr&0x7FFF);
115 }
116 return -1;
117 }
118
1/2
✓ Branch 0 taken 84 times.
✗ Branch 1 not taken.
84 if (mapper==norom)
119 {
120 168 return addr;
121 }
122 return -1;
123 }
124
125 746 inline int pctosnes(int addr)
126 {
127
2/2
✓ Branch 0 taken 373 times.
✓ Branch 1 taken 373 times.
746 if (addr<0) return -1;
128
2/2
✓ Branch 0 taken 674 times.
✓ Branch 1 taken 72 times.
746 if (mapper==lorom)
129 {
130
2/2
✓ Branch 0 taken 337 times.
✓ Branch 1 taken 337 times.
674 if (addr>=0x400000) return -1;
131 674 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
132 674 return addr|0x800000;
133 }
134
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 28 times.
36 if (mapper==hirom)
135 {
136
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
16 if (addr>=0x400000) return -1;
137 16 return addr|0xC00000;
138 }
139
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 16 times.
28 if (mapper == exlorom)
140 {
141
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
24 if (addr>=0x800000) return -1;
142
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
24 if (addr&0x400000)
143 {
144 12 addr-=0x400000;
145 12 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
146 12 return addr;
147 }
148 else
149 {
150 12 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
151 12 return addr|0x800000;
152 }
153 }
154
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 4 times.
16 if (mapper == exhirom)
155 {
156
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
24 if (addr>=0x800000) return -1;
157
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
24 if (addr&0x400000) return addr;
158 12 return addr|0xC00000;
159 }
160
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
4 if (mapper==sa1rom)
161 {
162
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 for (int i=0;i<8;i++)
163 {
164
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 if (sa1banks[i]==(addr&0x700000)){ return 0x008000|(i<<21)|((addr&0x0F8000)<<1)|(addr&0x7FFF);}
165 }
166 return -1;
167 }
168
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (mapper==bigsa1rom)
169 {
170 if (addr>=0x800000) return -1;
171 if ((addr&0x400000)==0x400000)
172 {
173 return addr|0xC00000;
174 }
175 if ((addr&0x600000)==0x000000)
176 {
177 return ((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
178 }
179 if ((addr&0x600000)==0x200000)
180 {
181 return 0x800000|((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
182 }
183 return -1;
184 }
185
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if (mapper==sfxrom)
186 {
187
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
4 if (addr>=0x200000) return -1;
188 4 return ((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
189 }
190 if (mapper==norom)
191 {
192 return addr;
193 }
194 return -1;
195 }
196
197 int getpcfreespace(int size, bool isforcode, bool autoexpand=true, bool respectbankborders=true, bool align=false, unsigned char freespacebyte=0x00);
198 int getsnesfreespace(int size, bool isforcode, bool autoexpand=true, bool respectbankborders=true, bool align=false, unsigned char freespacebyte=0x00);
199
200 void resizerats(int snesaddr, int newlen);
201 void removerats(int snesaddr, unsigned char clean_byte);
202 int ratsstart(int pcaddr);
203
204 bool goodchecksum();
205 void fixchecksum();
206
207 void WalkRatsTags(void(*func)(int loc, int len));//This one calls func() for each RATS tag in the ROM. The pointer is SNES format.
208 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.
209