asar coverage - build #216


src/asar/
File: src/asar/libsmw.h
Date: 2024-03-01 22:08:24
Lines:
70/91
76.9%
Functions:
2/2
100.0%
Branches:
78/106
73.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 unsigned char default_freespacebyte;
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 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, bool add_write = true);
31
32 struct writtenblockdata {
33 int pcoffset;
34 int snesoffset;
35 int numbytes;
36 };
37
38 extern autoarray<writtenblockdata> writtenblocks;
39
40 87130 inline int snestopc(int addr)
41 {
42
2/4
✓ Branch 0 taken 87130 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 43565 times.
87130 if (addr<0 || addr>0xFFFFFF) return -1;//not 24bit
43
2/2
✓ Branch 0 taken 82552 times.
✓ Branch 1 taken 4578 times.
87130 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 82552 times.
✗ Branch 1 not taken.
82552 if ((addr&0xFE0000)==0x7E0000 ||//wram
48
2/2
✓ Branch 0 taken 82550 times.
✓ Branch 1 taken 2 times.
82552 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, other strange junk
49
2/2
✓ Branch 0 taken 41275 times.
✓ Branch 1 taken 41275 times.
82550 (addr&0x708000)==0x700000)//sram (low parts of banks 70-7D)
50 1 return -1;
51 82550 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
52 82550 return addr;
53 }
54
2/2
✓ Branch 0 taken 697 times.
✓ Branch 1 taken 1592 times.
2289 if (mapper==hirom)
55 {
56
1/2
✓ Branch 0 taken 1394 times.
✗ Branch 1 not taken.
1394 if ((addr&0xFE0000)==0x7E0000 ||//wram
57
2/2
✓ Branch 0 taken 697 times.
✓ Branch 1 taken 697 times.
1394 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
58 return -1;
59 1394 return addr&0x3FFFFF;
60 }
61
2/2
✓ Branch 0 taken 692 times.
✓ Branch 1 taken 900 times.
1592 if (mapper==exlorom)
62 {
63
1/2
✓ Branch 0 taken 1384 times.
✗ Branch 1 not taken.
1384 if ((addr&0xF00000)==0x700000 ||//wram, sram
64
2/2
✓ Branch 0 taken 692 times.
✓ Branch 1 taken 692 times.
1384 (addr&0x408000)==0x000000)//area that shouldn't be used in lorom
65 return -1;
66
2/2
✓ Branch 0 taken 84 times.
✓ Branch 1 taken 1300 times.
1384 if (addr&0x800000)
67 {
68 84 addr=((addr&0x7F0000)>>1|(addr&0x7FFF));
69 }
70 else
71 {
72 1300 addr=((addr&0x7F0000)>>1|(addr&0x7FFF))+0x400000;
73 }
74 1384 return addr;
75 }
76
2/2
✓ Branch 0 taken 702 times.
✓ Branch 1 taken 198 times.
900 if (mapper==exhirom)
77 {
78
1/2
✓ Branch 0 taken 1404 times.
✗ Branch 1 not taken.
1404 if ((addr&0xFE0000)==0x7E0000 ||//wram
79
2/2
✓ Branch 0 taken 702 times.
✓ Branch 1 taken 702 times.
1404 (addr&0x408000)==0x000000)//hardware regs, ram mirrors, other strange junk
80 return -1;
81
2/2
✓ Branch 0 taken 1304 times.
✓ Branch 1 taken 100 times.
1404 if ((addr&0x800000)==0x000000) return (addr&0x3FFFFF)|0x400000;
82 100 return addr&0x3FFFFF;
83 }
84
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 169 times.
198 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 58 times.
✗ Branch 1 not taken.
58 if ((addr&0x600000)==0x600000 ||//wram, sram, open bus
88
1/2
✓ Branch 0 taken 58 times.
✗ Branch 1 not taken.
58 (addr&0x408000)==0x000000 ||//hardware regs, ram mirrors, rom mirrors, other strange junk
89
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 29 times.
58 (addr&0x800000)==0x800000)//fastrom isn't valid either in superfx
90 return -1;
91
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 58 times.
58 if (addr&0x400000) return addr&0x3FFFFF;
92 58 else return (addr&0x7F0000)>>1|(addr&0x7FFF);
93 }
94
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 137 times.
169 if (mapper==sa1rom)
95 {
96
1/2
✓ Branch 0 taken 64 times.
✗ Branch 1 not taken.
64 if ((addr&0x408000)==0x008000)
97 {
98 64 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 53 times.
✓ Branch 1 taken 84 times.
137 if (mapper==bigsa1rom)
107 {
108
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 58 times.
106 if ((addr&0xC00000)==0xC00000)//hirom
109 {
110 48 return (addr&0x3FFFFF)|0x400000;
111 }
112
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
113 {
114
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 29 times.
58 if ((addr&0x008000)==0x000000) return -1;
115 58 return (addr&0x800000)>>2 | (addr&0x3F0000)>>1 | (addr&0x7FFF);
116 }
117 return -1;
118 }
119
1/2
✓ Branch 0 taken 84 times.
✗ Branch 1 not taken.
84 if (mapper==norom)
120 {
121 168 return addr;
122 }
123 return -1;
124 }
125
126 838 inline int pctosnes(int addr)
127 {
128
2/2
✓ Branch 0 taken 419 times.
✓ Branch 1 taken 419 times.
838 if (addr<0) return -1;
129
2/2
✓ Branch 0 taken 766 times.
✓ Branch 1 taken 72 times.
838 if (mapper==lorom)
130 {
131
2/2
✓ Branch 0 taken 383 times.
✓ Branch 1 taken 383 times.
766 if (addr>=0x400000) return -1;
132 766 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
133 766 return addr|0x800000;
134 }
135
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 28 times.
36 if (mapper==hirom)
136 {
137
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
16 if (addr>=0x400000) return -1;
138 16 return addr|0xC00000;
139 }
140
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 16 times.
28 if (mapper == exlorom)
141 {
142
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
24 if (addr>=0x800000) return -1;
143
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
24 if (addr&0x400000)
144 {
145 12 addr-=0x400000;
146 12 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
147 12 return addr;
148 }
149 else
150 {
151 12 addr=((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
152 12 return addr|0x800000;
153 }
154 }
155
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 4 times.
16 if (mapper == exhirom)
156 {
157
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
24 if (addr>=0x800000) return -1;
158
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
24 if (addr&0x400000) return addr;
159 12 return addr|0xC00000;
160 }
161
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
4 if (mapper==sa1rom)
162 {
163
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 for (int i=0;i<8;i++)
164 {
165
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);}
166 }
167 return -1;
168 }
169
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (mapper==bigsa1rom)
170 {
171 if (addr>=0x800000) return -1;
172 if ((addr&0x400000)==0x400000)
173 {
174 return addr|0xC00000;
175 }
176 if ((addr&0x600000)==0x000000)
177 {
178 return ((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
179 }
180 if ((addr&0x600000)==0x200000)
181 {
182 return 0x800000|((addr<<1)&0x3F0000)|0x8000|(addr&0x7FFF);
183 }
184 return -1;
185 }
186
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if (mapper==sfxrom)
187 {
188
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
4 if (addr>=0x200000) return -1;
189 4 return ((addr<<1)&0x7F0000)|(addr&0x7FFF)|0x8000;
190 }
191 if (mapper==norom)
192 {
193 return addr;
194 }
195 return -1;
196 }
197
198 int getpcfreespace(int size, bool isforcode, bool autoexpand=true, bool respectbankborders=true, bool align=false, unsigned char freespacebyte=0x00);
199 int getsnesfreespace(int size, bool isforcode, bool autoexpand=true, bool respectbankborders=true, bool align=false, unsigned char freespacebyte=0x00);
200
201 void resizerats(int snesaddr, int newlen);
202 void removerats(int snesaddr, unsigned char clean_byte);
203 int ratsstart(int pcaddr);
204
205 bool goodchecksum();
206 void fixchecksum();
207
208 void WalkRatsTags(void(*func)(int loc, int len));//This one calls func() for each RATS tag in the ROM. The pointer is SNES format.
209 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.
210