asar coverage - build #116


src/asar/
File: src/asar/libsmw.h
Date: 2024-01-21 06:03:33
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 85526 inline int snestopc(int addr)
40 {
41
2/4
✓ Branch 0 taken 85526 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 42763 times.
85526 if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit
42
2/2
✓ Branch 0 taken 81638 times.
✓ Branch 1 taken 3888 times.
85526 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 81638 times.
✗ Branch 1 not taken.
81638 if ((addr&0xFE0000)==0x7E0000 ||//wram
47
1/2
✓ Branch 0 taken 81638 times.
✗ Branch 1 not taken.
81638 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, other strange junk
48
2/2
✓ Branch 0 taken 40819 times.
✓ Branch 1 taken 40819 times.
81638 (addr&0x708000)==0x700000)//sram (low parts of banks 70-7D)
49 return -1;
50 81638 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
51 81638 return addr;
52 }
53
2/2
✓ Branch 0 taken 582 times.
✓ Branch 1 taken 1362 times.
1944 if (mapper==hirom)
54 {
55
1/2
✓ Branch 0 taken 1164 times.
✗ Branch 1 not taken.
1164 if ((addr&0xFE0000)==0x7E0000 ||//wram
56
2/2
✓ Branch 0 taken 582 times.
✓ Branch 1 taken 582 times.
1164 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
57 return -1;
58 1164 return addr&0x3FFFFF;
59 }
60
2/2
✓ Branch 0 taken 577 times.
✓ Branch 1 taken 785 times.
1362 if (mapper==exlorom)
61 {
62
1/2
✓ Branch 0 taken 1154 times.
✗ Branch 1 not taken.
1154 if ((addr&0xF00000)==0x700000 ||//wram, sram
63
2/2
✓ Branch 0 taken 577 times.
✓ Branch 1 taken 577 times.
1154 (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 1070 times.
1154 if (addr&0x800000)
66 {
67 84 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
68 }
69 else
70 {
71 1070 addr=((addr&0x7F0000)>>1|(addr&0x7FFF))+0x400000;
72 }
73 1154 return addr;
74 }
75
2/2
✓ Branch 0 taken 587 times.
✓ Branch 1 taken 198 times.
785 if (mapper==exhirom)
76 {
77
1/2
✓ Branch 0 taken 1174 times.
✗ Branch 1 not taken.
1174 if ((addr&0xFE0000)==0x7E0000 ||//wram
78
2/2
✓ Branch 0 taken 587 times.
✓ Branch 1 taken 587 times.
1174 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
79 return -1;
80
2/2
✓ Branch 0 taken 1074 times.
✓ Branch 1 taken 100 times.
1174 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 738 inline int pctosnes(int addr)
126 {
127
2/2
✓ Branch 0 taken 369 times.
✓ Branch 1 taken 369 times.
738 if (addr<0) return -1;
128
2/2
✓ Branch 0 taken 666 times.
✓ Branch 1 taken 72 times.
738 if (mapper==lorom)
129 {
130
2/2
✓ Branch 0 taken 333 times.
✓ Branch 1 taken 333 times.
666 if (addr>=0x400000) return -1;
131 666 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
132 666 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