asar coverage - build #158


src/asar/
File: src/asar/assembleblock.cpp
Date: 2024-01-26 20:14:55
Lines:
1332/1448
92.0%
Functions:
42/42
100.0%
Branches:
1984/3175
62.5%

Line Branch Exec Source
1 #include "addr2line.h"
2 #include "asar.h"
3 #include "assembleblock.h"
4 #include "asar_math.h"
5 #include "macro.h"
6 #include "platform/file-helpers.h"
7 #include "table.h"
8 #include "unicode.h"
9 #include <cinttypes>
10
11 #include "interface-shared.h"
12 #include "arch-shared.h"
13
14 int arch=arch_65816;
15
16 bool snespos_valid = false;
17 int snespos;
18 int realsnespos;
19 int startpos;
20 int realstartpos;
21
22 bool mapper_set = false;
23 bool warn_endwhile = true;
24 int label_counter = 0;
25
26 static int old_snespos;
27 static int old_startpos;
28 static int old_optimizeforbank;
29 static bool old_snespos_valid;
30 static int struct_base;
31 static string struct_name;
32 static string struct_parent;
33 static bool in_struct = false;
34 static bool in_sub_struct = false;
35 static bool static_struct = false;
36 static bool in_spcblock = false;
37
38 assocarr<snes_struct> structs;
39
40 static bool movinglabelspossible = false;
41
42 static bool disable_bank_cross_errors = false;
43 static bool check_half_banks_crossed = false;
44
45 int bytes;
46 static int freespaceuse=0;
47
48 static enum {
49 ratsmeta_ban,
50 ratsmeta_allow,
51 ratsmeta_used,
52 } ratsmetastate=ratsmeta_ban;
53
54 enum spcblock_type{
55 spcblock_nspc,
56 spcblock_custom
57 };
58
59 struct spcblock_data{
60 unsigned int destination;
61 spcblock_type type;
62 string macro_name;
63
64 unsigned int execute_address; // Can be removed in Asar 2.0
65 unsigned int size_address;
66 mapper_t old_mapper;
67 }spcblock;
68
69 492 int snestopc_pick(int addr)
70 {
71 828 return snestopc(addr);
72 }
73
74 1311120 inline void verifysnespos()
75 {
76
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1311120 times.
1311120 if (!snespos_valid)
77 {
78 asar_throw_error(0, error_type_block, error_id_missing_org);
79 snespos=0x008000;
80 realsnespos=0x008000;
81 startpos=0x008000;
82 realstartpos=0x008000;
83 snespos_valid = true;
84 }
85 1311120 }
86
87 1656 static int fixsnespos(int inaddr, int step)
88 {
89 // randomdude999: turns out it wasn't very reliable at all.
90 /* // RPG Hacker: No idea how reliable this is.
91 // Might not work with some of the more exotic mappers.
92 return pctosnes(snestopc(inaddr) + step); */
93
2/2
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 1368 times.
1656 if (mapper == lorom) {
94
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 252 times.
288 if ((inaddr&0xFFFF)+step > 0xFFFF) {
95 // bank crossed
96 36 return inaddr+step+0x8000;
97 }
98 252 return inaddr+step;
99
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == hirom) {
100 if ((inaddr&0x400000) == 0) {
101 // system pages, need to account for low pages and stuff
102 if ((inaddr&0xFFFF)+step > 0xFFFF) {
103 return inaddr+step+0x8000;
104 }
105 }
106 return inaddr+step;
107
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == exlorom) {
108 // exlorom has no mirroring so this should work fine
109 return pctosnes(snestopc(inaddr)+step);
110
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == exhirom) {
111 // apparently exhirom is pretty similar to hirom after all
112 if ((inaddr&0x400000) == 0) {
113 // system pages, need to account for low pages and stuff
114 if ((inaddr&0xFFFF)+step > 0xFFFF) {
115 return inaddr+step+0x8000;
116 }
117 }
118 return inaddr+step;
119
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == sa1rom) {
120 if((inaddr&0x400000) == 0) {
121 // lorom area
122 if ((inaddr&0xFFFF)+step > 0xFFFF) {
123 return inaddr+step+0x8000;
124 }
125 return inaddr+step;
126 } else {
127 // hirom area
128 return inaddr+step;
129 }
130
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == sfxrom) {
131 if ((inaddr&0x400000) == 0) {
132 // lorom area
133 if ((inaddr&0xFFFF)+step > 0xFFFF) {
134 return inaddr+step+0x8000;
135 }
136 } else {
137 // hirom area
138 return inaddr+step;
139 }
140
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == bigsa1rom) {
141 // no mirrors here, so this should work
142 return pctosnes(snestopc(inaddr)+step);
143
1/2
✓ Branch 0 taken 684 times.
✗ Branch 1 not taken.
684 } else if (mapper == norom) {
144 1368 return inaddr+step;
145 }
146 return -1;
147 }
148
149 1309965 inline void step(int num)
150 {
151
2/2
✓ Branch 0 taken 828 times.
✓ Branch 1 taken 1309137 times.
1309965 if (disable_bank_cross_errors)
152 {
153 828 snespos = fixsnespos(snespos, num);
154 828 realsnespos = fixsnespos(realsnespos, num);
155
156 // RPG Hacker: Not adjusting startpos here will eventually throw
157 // an error in checkbankcross() if we set warn bankcross on again.
158 // As far as I can tell, those are pretty much just used for
159 // checking bank crossing, anyways, so it's hopefully save to just
160 // adjust them here.
161 828 startpos = snespos;
162 828 realstartpos = realsnespos;
163 }
164 else
165 {
166 1309137 snespos += num;
167 1309137 realsnespos += num;
168 }
169 1309965 bytes+=num;
170 1309965 }
171
172 1308165 inline void write1_65816(unsigned int num)
173 {
174 1308165 verifysnespos();
175
2/2
✓ Branch 0 taken 435973 times.
✓ Branch 1 taken 872192 times.
1308165 if (pass==2)
176 {
177 435973 int pcpos=snestopc(realsnespos&0xFFFFFF);
178
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 435973 times.
435973 if (pcpos<0)
179 {
180 movinglabelspossible=true;
181 asar_throw_error(2, error_type_block, error_id_snes_address_doesnt_map_to_rom, hex((unsigned int)realsnespos, 6).data());
182 }
183 435973 writeromdata_byte(pcpos, (unsigned char)num, freespaceid != 0);
184
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 435973 times.
435973 if (pcpos>=romlen) {
185 if(pcpos - romlen > 0) writeromdata_bytes(romlen, default_freespacebyte, pcpos - romlen, false);
186 romlen=pcpos+1;
187 }
188 }
189
4/4
✓ Branch 0 taken 436093 times.
✓ Branch 1 taken 872072 times.
✓ Branch 2 taken 26857 times.
✓ Branch 3 taken 409236 times.
1308165 if(pass == 1 && freespaceid == 0) {
190 26857 int pcpos = snestopc(realsnespos & 0xFFFFFF);
191
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 26857 times.
26857 if(pcpos < 0) asar_throw_error(pass, error_type_fatal, error_id_internal_error, "invalid pos in pass 1");
192 26857 addromwrite(pcpos, 1);
193
2/2
✓ Branch 0 taken 25846 times.
✓ Branch 1 taken 1011 times.
26857 if (pcpos>=romlen) romlen=pcpos+1;
194 }
195 1308165 step(1);
196 1308165 ratsmetastate=ratsmeta_ban;
197 1308165 }
198
199 685515 void write1_pick(unsigned int num)
200 {
201
9/18
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 63 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 63 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 63 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 63 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 63 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 63 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 63 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 63 times.
✗ Branch 17 not taken.
686082 write1_65816(num);
202 1265565 }
203
204 86286 static bool asblock_pick(char** word, int numwords)
205 {
206
4/4
✓ Branch 0 taken 79248 times.
✓ Branch 1 taken 7038 times.
✓ Branch 2 taken 90 times.
✓ Branch 3 taken 79158 times.
86286 if (arch==arch_spc700 || in_spcblock) return asblock_spc700(word, numwords);
207
2/2
✓ Branch 0 taken 68196 times.
✓ Branch 1 taken 10962 times.
79158 if (arch==arch_65816) return asblock_65816(word, numwords);
208
1/2
✓ Branch 0 taken 10962 times.
✗ Branch 1 not taken.
10962 if (arch==arch_superfx) return asblock_superfx(word, numwords);
209 return true;
210 }
211
212 #define write1 write1_pick
213 #define snestopc snestopc_pick
214
215 29559 const char * safedequote(char * str)
216 {
217 29559 const char * tmp=dequote(str);
218
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 29559 times.
29559 if (!tmp) asar_throw_error(0, error_type_block, error_id_garbage_near_quoted_string);
219 29559 return tmp;
220 }
221
222 extern char romtitle[30];
223 extern bool stdlib;
224
225 5418 void write2(unsigned int num)
226 {
227 2712 write1(num);
228 5418 write1(num/256);
229 5418 }
230
231 3420 void write3(unsigned int num)
232 {
233 1710 write1(num);
234 3420 write1(num/256);
235 3420 write1(num/65536);
236 3420 }
237
238 342 void write4(unsigned int num)
239 {
240 171 write1(num);
241 342 write1(num/256);
242 342 write1(num/65536);
243 342 write1(num/16777216);
244 342 }
245
246 //these are NOT used by the math parser - see math.cpp for that
247 42 int read2(int insnespos)
248 {
249 21 int addr=snestopc(insnespos);
250
3/4
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 21 times.
✓ Branch 3 taken 21 times.
42 if (addr<0 || addr+2>romlen_r) return -1;
251 return
252 42 romdata_r[addr ] |
253 42 (romdata_r[addr+1]<< 8);
254 }
255
256 102 int read3(int insnespos)
257 {
258 51 int addr=snestopc(insnespos);
259
3/4
✓ Branch 0 taken 102 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 51 times.
✓ Branch 3 taken 51 times.
102 if (addr<0 || addr+3>romlen_r) return -1;
260 return
261 102 romdata_r[addr ] |
262 102 (romdata_r[addr+1]<< 8)|
263 102 (romdata_r[addr+2]<<16);
264 }
265
266 4356 int getlenfromchar(char c)
267 {
268 4356 c=(char)to_lower(c);
269
2/2
✓ Branch 0 taken 2178 times.
✓ Branch 1 taken 2178 times.
4356 if (c=='b') return 1;
270
2/2
✓ Branch 0 taken 1188 times.
✓ Branch 1 taken 1188 times.
2376 if (c=='w') return 2;
271
2/2
✓ Branch 0 taken 153 times.
✓ Branch 1 taken 153 times.
306 if (c=='l') return 3;
272 18 asar_throw_error(0, error_type_block, error_id_invalid_opcode_length);
273 return -1;
274 }
275
276 assocarr<snes_label> labels;
277 static autoarray<int> poslabels;
278 static autoarray<int> neglabels;
279
280 autoarray<int>* macroposlabels;
281 autoarray<int>* macroneglabels;
282
283 autoarray<string> sublabels;
284 autoarray<string>* macrosublabels;
285
286 // randomdude999: ns is still the string to prefix to all labels, it's calculated whenever namespace_list is changed
287 string ns;
288 string ns_backup;
289 autoarray<string> namespace_list;
290
291 autoarray<string> includeonce;
292
293 autoarray<freespace_data> freespaces;
294
295 // id of the next unused freespace.
296 static int freespaceidnext;
297 // id of the current freespace, or 0 if not in freespace.
298 int freespaceid;
299 // start address of the current freespace, used for computing the length of the
300 // current freespace.
301 static int freespacestart;
302
303
304 7395 bool confirmname(const char * name)
305 {
306
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7395 times.
7395 if (!name[0]) return false;
307
2/2
✓ Branch 0 taken 1836 times.
✓ Branch 1 taken 5559 times.
7395 if (is_digit(name[0])) return false;
308
2/2
✓ Branch 0 taken 46461 times.
✓ Branch 1 taken 5541 times.
52002 for (int i=0;name[i];i++)
309 {
310
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 46443 times.
46461 if (!is_ualnum(name[i])) return false;
311 }
312 2772 return true;
313 }
314
315 163644 string posneglabelname(const char ** input, bool define)
316 {
317 163644 const char* label = *input;
318
319 78860 string output;
320
321 78860 int depth = 0;
322 78860 bool ismacro = false;
323
324
2/2
✓ Branch 0 taken 138 times.
✓ Branch 1 taken 163506 times.
163644 if (label[0] == '?')
325 {
326 69 ismacro = true;
327 138 label++;
328 }
329
4/4
✓ Branch 0 taken 78853 times.
✓ Branch 1 taken 84791 times.
✓ Branch 2 taken 403 times.
✓ Branch 3 taken 163078 times.
163644 if (label[0] == '-' || label[0] == '+')
330 {
331 290 char first = label[0];
332
4/4
✓ Branch 0 taken 746 times.
✓ Branch 1 taken 386 times.
✓ Branch 2 taken 566 times.
✓ Branch 3 taken 180 times.
1132 for (depth = 0; label[0] && label[0] == first; depth++) label++;
333
334
2/2
✓ Branch 0 taken 518 times.
✓ Branch 1 taken 48 times.
566 if (!ismacro)
335 {
336
2/2
✓ Branch 0 taken 379 times.
✓ Branch 1 taken 139 times.
518 if (first == '+')
337 {
338 379 *input = label;
339
8/16
✓ Branch 0 taken 193 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 193 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 193 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 193 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 193 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 193 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 193 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 193 times.
✗ Branch 15 not taken.
565 output = STR":pos_" + dec(depth) + "_" + dec(poslabels[depth]);
340
3/4
✓ Branch 0 taken 309 times.
✓ Branch 1 taken 70 times.
✓ Branch 2 taken 156 times.
✗ Branch 3 not taken.
532 if (define) poslabels[depth]++;
341 }
342 else
343 {
344 139 *input = label;
345
3/4
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 118 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
148 if (define) neglabels[depth]++;
346
8/16
✓ Branch 0 taken 73 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 73 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 73 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 73 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 73 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 73 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 73 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 73 times.
✗ Branch 15 not taken.
205 output = STR":neg_" + dec(depth) + "_" + dec(neglabels[depth]);
347 }
348 }
349 else
350 {
351
3/6
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 48 times.
48 if (macrorecursion == 0 || macroposlabels == nullptr || macroneglabels == nullptr)
352 {
353 if (!macrorecursion) asar_throw_error(0, error_type_block, error_id_macro_label_outside_of_macro);
354 }
355 else
356 {
357
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 24 times.
48 if (first == '+')
358 {
359 24 *input = label;
360
11/22
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 12 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 12 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 12 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 12 times.
✗ Branch 21 not taken.
36 output = STR":macro_" + dec(calledmacros) + "_pos_" + dec(depth) + "_" + dec((*macroposlabels)[depth]);
361
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
24 if (define) (*macroposlabels)[depth]++;
362 }
363 else
364 {
365 24 *input = label;
366
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
33 if (define) (*macroneglabels)[depth]++;
367
11/22
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 12 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 12 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 12 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 12 times.
✗ Branch 21 not taken.
36 output = STR":macro_" + dec(calledmacros) + "_neg_" + dec(depth) + "_" + dec((*macroneglabels)[depth]);
368 }
369 }
370 }
371 }
372
373 163644 return output;
374 }
375
376 7009 static string labelname(const char ** rawname, bool define=false)
377 {
378 #define deref_rawname (*rawname)
379 3513 autoarray<string>* sublabellist = &sublabels;
380
381 7009 bool ismacro = (deref_rawname[0] == '?');
382 3513 bool issublabel = false;
383
384
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 6937 times.
7009 if (ismacro)
385 {
386 72 deref_rawname++;
387 72 sublabellist = macrosublabels;
388 }
389
390 3513 string name;
391 3513 int i=-1;
392
393
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 7009 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7009 if (is_digit(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
394
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 6919 times.
7009 if (*deref_rawname ==':')
395 {
396 90 deref_rawname++;
397
1/2
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
48 name=":";
398 }
399
4/4
✓ Branch 0 taken 3465 times.
✓ Branch 1 taken 3454 times.
✓ Branch 2 taken 3168 times.
✓ Branch 3 taken 3157 times.
6919 else if (!in_struct && !in_sub_struct)
400 {
401
2/2
✓ Branch 0 taken 285 times.
✓ Branch 1 taken 6253 times.
6538 for (i=0;(*deref_rawname =='.');i++) deref_rawname++;
402
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6253 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6253 if (!is_ualnum(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
403
2/2
✓ Branch 0 taken 267 times.
✓ Branch 1 taken 5986 times.
6253 if (i)
404 {
405
6/12
✓ Branch 0 taken 267 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 135 times.
✓ Branch 3 taken 132 times.
✓ Branch 4 taken 135 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 135 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 135 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
267 if (!sublabellist || !(*sublabellist)[i - 1]) asar_throw_error(2, error_type_block, error_id_label_missing_parent);
406
4/8
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 135 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 135 times.
✗ Branch 7 not taken.
399 name+=STR(*sublabellist)[i-1]+"_";
407 135 issublabel = true;
408 }
409 }
410
411
4/4
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 6949 times.
✓ Branch 2 taken 24 times.
✓ Branch 3 taken 12 times.
7009 if (ismacro && !issublabel)
412 {
413 // RPG Hacker: Don't add the prefix for sublabels, because they already inherit it from
414 // their parents' names.
415
4/6
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 30 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
48 if (!macrorecursion || macrosublabels == nullptr) asar_throw_error(2, error_type_block, error_id_macro_label_outside_of_macro);
416
6/12
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 15 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 15 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 15 times.
✗ Branch 11 not taken.
45 name = STR":macro_" + dec(calledmacros) + "_" + name;
417 }
418
419
420
4/4
✓ Branch 0 taken 6397 times.
✓ Branch 1 taken 594 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 6325 times.
6991 if (in_struct || in_sub_struct)
421 {
422
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 594 times.
666 if(in_sub_struct)
423 {
424
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 name += struct_parent + ".";
425 }
426
1/2
✓ Branch 0 taken 333 times.
✗ Branch 1 not taken.
666 name += struct_name;
427
1/2
✓ Branch 0 taken 333 times.
✗ Branch 1 not taken.
666 name += '.';
428
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 648 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
666 if(*deref_rawname != '.') asar_throw_error(2, error_type_block, error_id_invalid_label_name); //probably should be a better error. TODO!!!
429 648 deref_rawname++;
430 }
431
432
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6973 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6973 if (!is_ualnum(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
433
434
6/6
✓ Branch 0 taken 27895 times.
✓ Branch 1 taken 27966 times.
✓ Branch 2 taken 678 times.
✓ Branch 3 taken 6973 times.
✓ Branch 4 taken 24488 times.
✓ Branch 5 taken 3495 times.
55861 while (is_ualnum(*deref_rawname) || *deref_rawname == '.')
435 {
436
1/2
✓ Branch 0 taken 24488 times.
✗ Branch 1 not taken.
48888 name+=*(deref_rawname++);
437 }
438
439
4/4
✓ Branch 0 taken 4384 times.
✓ Branch 1 taken 2589 times.
✓ Branch 2 taken 174 times.
✓ Branch 3 taken 4210 times.
6973 if(!define && *deref_rawname == '[')
440 {
441
3/4
✓ Branch 0 taken 570 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 396 times.
✓ Branch 3 taken 174 times.
570 while (*deref_rawname && *deref_rawname != ']') deref_rawname++;
442
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 174 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
174 if(*deref_rawname != ']') asar_throw_error(2, error_type_block, error_id_invalid_label_missing_closer);
443 174 deref_rawname++;
444 }
445
446
6/6
✓ Branch 0 taken 3915 times.
✓ Branch 1 taken 3898 times.
✓ Branch 2 taken 168 times.
✓ Branch 3 taken 6973 times.
✓ Branch 4 taken 420 times.
✓ Branch 5 taken 3495 times.
7813 while (is_ualnum(*deref_rawname) || *deref_rawname == '.')
447 {
448
1/2
✓ Branch 0 taken 420 times.
✗ Branch 1 not taken.
840 name+=*(deref_rawname++);
449 }
450
451
3/4
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 6901 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 72 times.
6973 if(*deref_rawname == '[') asar_throw_error(2, error_type_block, error_id_invalid_subscript);
452
453
4/4
✓ Branch 0 taken 2202 times.
✓ Branch 1 taken 4699 times.
✓ Branch 2 taken 948 times.
✓ Branch 3 taken 315 times.
6901 if (define && i>=0)
454 {
455
1/2
✓ Branch 0 taken 948 times.
✗ Branch 1 not taken.
1887 (*sublabellist).reset(i);
456
2/4
✓ Branch 0 taken 948 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 948 times.
✗ Branch 3 not taken.
948 (*sublabellist)[i]=name;
457 }
458 6901 return name;
459 #undef deref_rawname
460 108 }
461
462 4240 inline bool labelvalcore(const char ** rawname, snes_label * rval, bool define, bool shouldthrow)
463 {
464
1/2
✓ Branch 0 taken 2124 times.
✗ Branch 1 not taken.
4240 string name=labelname(rawname, define);
465
14/20
✓ Branch 0 taken 2214 times.
✓ Branch 1 taken 2026 times.
✓ Branch 2 taken 143 times.
✓ Branch 3 taken 4097 times.
✓ Branch 4 taken 92 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 92 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 51 times.
✓ Branch 9 taken 41 times.
✓ Branch 10 taken 92 times.
✓ Branch 11 taken 2032 times.
✓ Branch 12 taken 51 times.
✓ Branch 13 taken 2073 times.
✓ Branch 14 taken 51 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 51 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
4381 if (ns && labels.exists(ns+name)) {*rval = labels.find(ns+name);}
466
5/6
✓ Branch 0 taken 3910 times.
✓ Branch 1 taken 228 times.
✓ Branch 2 taken 1844 times.
✓ Branch 3 taken 229 times.
✓ Branch 4 taken 1844 times.
✗ Branch 5 not taken.
4138 else if (labels.exists(name)) {*rval = labels.find(name);}
467 else
468 {
469
4/4
✓ Branch 0 taken 73 times.
✓ Branch 1 taken 384 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 66 times.
457 if (shouldthrow && pass)
470 {
471
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 asar_throw_error(2, error_type_block, error_id_label_not_found, name.data());
472 }
473 450 rval->pos = (unsigned int)-1;
474 450 rval->freespace_id = 0;
475 450 rval->is_static = false;
476 450 return false;
477 }
478 1895 return true;
479 4240 }
480
481 1990 snes_label labelval(const char ** rawname, bool define)
482 {
483 996 snes_label rval;
484
2/2
✓ Branch 0 taken 992 times.
✓ Branch 1 taken 4 times.
1990 labelvalcore(rawname, &rval, define, true);
485 1983 return rval;
486 }
487
488 134 snes_label labelval(string name, bool define)
489 {
490 134 const char * rawname=name;
491 68 snes_label rval;
492
1/2
✓ Branch 0 taken 68 times.
✗ Branch 1 not taken.
134 labelvalcore(&rawname, &rval, define, true);
493 134 return rval;
494 }
495
496 2076 bool labelval(const char ** rawname, snes_label * rval, bool define)
497 {
498 2076 return labelvalcore(rawname, rval, define, false);
499 }
500
501 40 bool labelval(string name, snes_label * rval, bool define)
502 {
503 40 const char * str=name;
504
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
62 return labelvalcore(&str, rval, define, false);
505 }
506
507 3495 static void setlabel(string name, int loc=-1, bool is_static=false, int freespace_id = -1)
508 {
509
2/2
✓ Branch 0 taken 2937 times.
✓ Branch 1 taken 558 times.
3495 if (loc==-1)
510 {
511
1/2
✓ Branch 0 taken 1476 times.
✗ Branch 1 not taken.
2937 verifysnespos();
512 2937 loc=snespos;
513 }
514
515 1755 snes_label label_data;
516 3495 label_data.pos = (unsigned int)loc;
517 3495 label_data.is_static = is_static;
518
1/2
✓ Branch 0 taken 3495 times.
✗ Branch 1 not taken.
3495 label_data.freespace_id = freespace_id == -1 ? freespaceid : freespace_id;
519
520 unsigned int labelpos;
521
2/2
✓ Branch 0 taken 1165 times.
✓ Branch 1 taken 2330 times.
3495 if (pass==0)
522 {
523
4/4
✓ Branch 0 taken 588 times.
✓ Branch 1 taken 577 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 582 times.
1165 if (labels.exists(name))
524 {
525 6 movinglabelspossible=true;
526
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
6 asar_throw_error(0, error_type_block, error_id_label_redefined, name.data());
527 }
528
1/2
✓ Branch 0 taken 582 times.
✗ Branch 1 not taken.
1159 labels.create(name) = label_data;
529 }
530
2/2
✓ Branch 0 taken 1165 times.
✓ Branch 1 taken 1165 times.
2330 else if (pass==1)
531 {
532
1/2
✓ Branch 0 taken 585 times.
✗ Branch 1 not taken.
1165 labels.create(name) = label_data;
533 }
534
1/2
✓ Branch 0 taken 1165 times.
✗ Branch 1 not taken.
1165 else if (pass==2)
535 {
536 //all label locations are known at this point, add a sanity check
537
3/6
✓ Branch 0 taken 585 times.
✓ Branch 1 taken 580 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 585 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1165 if (!labels.exists(name)) asar_throw_error(2, error_type_block, error_id_label_on_third_pass);
538
1/2
✓ Branch 0 taken 585 times.
✗ Branch 1 not taken.
1165 labelpos = labels.find(name).pos;
539
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1153 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
1165 if ((int)labelpos != loc && !movinglabelspossible)
540 {
541
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
12 if((unsigned int)loc>>16 != labelpos>>16) asar_throw_error(2, error_type_block, error_id_label_ambiguous, name.raw());
542
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
12 else if(labelpos == (dp_base + 0xFFu)) asar_throw_error(2, error_type_block, error_id_label_ambiguous, name.raw());
543
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 else if(errored) return;
544 else asar_throw_error(2, error_type_block, error_id_label_moving);
545 }
546 }
547 }
548
549 table thetable;
550 static autoarray<table> tablestack;
551
552 2127 static void cleartable()
553 {
554
2/4
✓ Branch 0 taken 2127 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1095 times.
✗ Branch 3 not taken.
2127 thetable = table();
555 2127 }
556
557 struct pushable {
558 int arch;
559 int snespos;
560 int snesstart;
561 int snesposreal;
562 int snesstartreal;
563 int freeid;
564 int freest;
565 int arch1;
566 int arch2;
567 int arch3;
568 int arch4;
569 };
570 static autoarray<pushable> pushpc;
571 static int pushpcnum;
572
573 static autoarray<int> basestack;
574 static int basestacknum;
575
576 129 struct ns_pushable {
577 string ns;
578 autoarray<string> namespace_list;
579 bool nested_namespaces;
580 };
581
582 static autoarray<ns_pushable> pushns;
583 static int pushnsnum;
584
585
586 static unsigned char fillbyte[12];
587 static unsigned char padbyte[12];
588
589 static bool nested_namespaces = false;
590
591 4500 static int getfreespaceid()
592 {
593 /*static const int max_num_freespaces = 125;
594 if (freespaceidnext > max_num_freespaces) asar_throw_error(pass, error_type_fatal, error_id_freespace_limit_reached, max_num_freespaces);*/
595 4500 int newid = freespaceidnext++;
596
2/2
✓ Branch 0 taken 1500 times.
✓ Branch 1 taken 3000 times.
4500 if(newid >= freespaces.count) {
597 1500 freespaces[newid].leaked = true;
598 1500 freespaces[newid].orgpos = -2;
599 1500 freespaces[newid].orglen = -1;
600 1500 freespaces[newid].cleanbyte = 0x00;
601 }
602 4500 return newid;
603 }
604
605 134925 void checkbankcross()
606 {
607
2/2
✓ Branch 0 taken 67410 times.
✓ Branch 1 taken 67515 times.
134925 if (!snespos_valid) return;
608
2/2
✓ Branch 0 taken 54291 times.
✓ Branch 1 taken 54453 times.
108744 if (disable_bank_cross_errors) return;
609
2/2
✓ Branch 0 taken 53724 times.
✓ Branch 1 taken 53886 times.
107610 unsigned int mask = 0x7FFF0000 | (check_half_banks_crossed ? 0x8000 : 0);
610
4/4
✓ Branch 0 taken 1716 times.
✓ Branch 1 taken 105894 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 1704 times.
107610 if (((snespos^startpos) & mask) && (((snespos - 1) ^ startpos) & mask))
611 {
612 12 asar_throw_error(pass, error_type_fatal, error_id_bank_border_crossed, snespos);
613 }
614 // don't verify realsnespos when using norom. this allows making custom mappers where the file layout doesn't follow bank borders
615
5/6
✓ Branch 0 taken 106722 times.
✓ Branch 1 taken 876 times.
✓ Branch 2 taken 1704 times.
✓ Branch 3 taken 105018 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1704 times.
107598 else if (mapper != norom && ((realsnespos^realstartpos) & mask) && (((realsnespos - 1) ^ realstartpos) & mask))
616 {
617 asar_throw_error(pass, error_type_fatal, error_id_bank_border_crossed, realsnespos);
618 }
619 }
620
621 9003 static void freespaceend()
622 {
623
2/2
✓ Branch 0 taken 4518 times.
✓ Branch 1 taken 4485 times.
9003 if (freespaceid > 0)
624 {
625 4518 freespaces[freespaceid].len = snespos-freespacestart;
626 4518 snespos=(int)0xFFFFFFFF;
627 4518 snespos_valid = false;
628 }
629 9003 freespaceid = 0;
630 9003 }
631
632
1/2
✓ Branch 0 taken 9605 times.
✗ Branch 1 not taken.
19417 static void adddefine(const string & key, string & value)
633 {
634
1/2
✓ Branch 0 taken 19417 times.
✗ Branch 1 not taken.
19417 if (!defines.exists(key)) defines.create(key) = value;
635 19417 }
636
637 2109 void initstuff()
638 {
639
2/2
✓ Branch 0 taken 723 times.
✓ Branch 1 taken 1386 times.
2109 if (pass==0)
640 {
641 723 freespaces.reset();
642 723 movinglabelspossible = false;
643 723 found_rats_tags_initialized = false;
644 723 found_rats_tags.clear();
645 }
646 2109 arch=arch_65816;
647 2109 mapper=lorom;
648 2109 mapper_set = false;
649 2109 calledmacros = 0;
650 2109 reallycalledmacros = 0;
651 2109 macrorecursion = 0;
652 2109 defines.reset();
653 2109 builtindefines.each(adddefine);
654 2109 clidefines.each(adddefine);
655 1086 ns="";
656 2109 namespace_list.reset();
657 2109 sublabels.reset();
658 2109 poslabels.reset();
659 2109 neglabels.reset();
660 2109 macroposlabels = nullptr;
661 2109 macroneglabels = nullptr;
662 2109 macrosublabels = nullptr;
663 2109 cleartable();
664 2109 pushpc.reset();
665 2109 pushpcnum=0;
666 2109 pushns.reset();
667 2109 pushnsnum = 0;
668 2109 bytes=0;
669 2109 freespaceuse=0;
670 2109 memset(fillbyte, 0, sizeof(fillbyte));
671 2109 memset(padbyte, 0, sizeof(padbyte));
672 2109 snespos_valid = false;
673 2109 snespos=(int)0xFFFFFFFF;
674 2109 realsnespos= (int)0xFFFFFFFF;
675 2109 startpos= (int)0xFFFFFFFF;
676 2109 realstartpos= (int)0xFFFFFFFF;
677 2109 freespaceidnext=1;
678 2109 freespaceid=0;
679 2109 default_freespacebyte=0x00;
680 2109 incsrcdepth = 0;
681
682 2109 optimizeforbank = -1;
683 2109 optimize_dp = optimize_dp_flag::NONE;
684 2109 dp_base = 0;
685 2109 optimize_address = optimize_address_flag::DEFAULT;
686
687 2109 in_struct = false;
688 2109 in_sub_struct = false;
689 2109 in_spcblock = false;
690
691
1/2
✓ Branch 0 taken 2109 times.
✗ Branch 1 not taken.
2109 if (arch==arch_65816) asinit_65816();
692
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2109 times.
2109 if (arch==arch_spc700) asinit_spc700();
693
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2109 times.
2109 if (arch==arch_superfx) asinit_superfx();
694
695 2109 disable_bank_cross_errors = false;
696 2109 check_half_banks_crossed = false;
697 2109 nested_namespaces = false;
698
699 2109 includeonce.reset();
700
701 extern AddressToLineMapping addressToLineMapping;
702 2109 addressToLineMapping.reset();
703
704 2109 push_warnings(false);
705
706 2109 initmathcore();
707
708 2109 callstack.reset();
709 #if defined(_WIN32) || !defined(NO_USE_THREADS)
710 2109 init_stack_use_check();
711 #endif
712 2109 }
713
714 1524 int get_freespace_pin_target(int target_id) {
715 // union-find algorithm
716
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1524 times.
2298 while(freespaces[target_id].pin_target_id != target_id) {
717 // i love programming
718 18 freespaces[target_id].pin_target_id =
719 12 freespaces[freespaces[target_id].pin_target_id].pin_target_id;
720 12 target_id = freespaces[target_id].pin_target_id;
721 }
722 1524 return target_id;
723 }
724
725 693 void resolve_pinned_freespaces() {
726
2/2
✓ Branch 0 taken 1500 times.
✓ Branch 1 taken 693 times.
2193 for(int i = 1; i < freespaces.count; i++)
727 // default to everyone being in a separate component
728 1500 freespaces[i].pin_target_id = i;
729
2/2
✓ Branch 0 taken 1500 times.
✓ Branch 1 taken 693 times.
2193 for(int i = 1; i < freespaces.count; i++) {
730
1/2
✓ Branch 0 taken 750 times.
✗ Branch 1 not taken.
750 freespace_data& fs = freespaces[i];
731
2/2
✓ Branch 0 taken 1476 times.
✓ Branch 1 taken 24 times.
1500 if(fs.pin_target == "") continue;
732 12 snes_label value;
733
5/16
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
24 if(fs.pin_target_ns && labels.exists(fs.pin_target_ns + fs.pin_target))
734 value = labels.find(fs.pin_target_ns + fs.pin_target);
735
2/4
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
24 else if(labels.exists(fs.pin_target))
736
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
24 value = labels.find(fs.pin_target);
737 else continue; // the error for this is thrown in the freespace command during pass 2
738
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
24 fs.pin_target_id = get_freespace_pin_target(value.freespace_id);
739 24 fs.len = 0;
740 }
741 693 }
742
743 693 void allocate_freespaces() {
744 // compute real size of all pinned freespace blocks
745
2/2
✓ Branch 0 taken 1500 times.
✓ Branch 1 taken 693 times.
2193 for(int i = 1; i < freespaces.count; i++) {
746 750 freespace_data& fs = freespaces[i];
747 // just in case the pin target changed again or something
748 1500 fs.pin_target_id = get_freespace_pin_target(fs.pin_target_id);
749 750 freespace_data& target = freespaces[fs.pin_target_id];
750 1500 target.total_len += fs.len;
751
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 750 times.
1500 target.search_start = std::max(fs.search_start, target.search_start);
752 }
753
754
2/2
✓ Branch 0 taken 1500 times.
✓ Branch 1 taken 693 times.
2193 for(int i = 1; i < freespaces.count; i++) {
755 750 freespace_data& fs = freespaces[i];
756
4/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1488 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 6 times.
1500 if(fs.is_static && fs.orgpos > 0) {
757 6 fs.pos = fs.orgpos;
758 6 continue;
759 }
760 // if this freespace is pinned to another one, set it later
761
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1476 times.
1494 if(fs.pin_target_id != i) continue;
762 // TODO: possibly fancier align
763 1476 fs.pos = getsnesfreespace(fs.total_len, fs.bank, true, true, fs.flag_align, fs.cleanbyte, fs.write_rats, fs.search_start);
764 1476 fs.used_len = fs.len;
765 }
766 // set pos for all pinned freespaces
767
2/2
✓ Branch 0 taken 1500 times.
✓ Branch 1 taken 693 times.
2193 for(int i = 1; i < freespaces.count; i++) {
768 750 freespace_data& fs = freespaces[i];
769
2/2
✓ Branch 0 taken 1482 times.
✓ Branch 1 taken 18 times.
1500 if(fs.pin_target_id == i) continue;
770 9 freespace_data& tgt = freespaces[fs.pin_target_id];
771 18 fs.pos = tgt.pos + tgt.used_len;
772 18 tgt.used_len += fs.len;
773 }
774
775 // relocate all labels that were in freespace to point them to their real location
776 693 labels.each([](const char * key, snes_label & val) {
777
2/2
✓ Branch 0 taken 216 times.
✓ Branch 1 taken 943 times.
1159 if(val.freespace_id != 0) {
778 216 val.pos += freespaces[val.freespace_id].pos;
779 }
780 1159 });
781 693 }
782
783 //void nerf(const string& left, string& right){puts(S left+" = "+right);}
784
785 2079 void finishpass()
786 {
787 2079 verify_warnings();
788 2079 pull_warnings(false);
789
790 //defines.traverse(nerf);
791
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2079 times.
2079 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_missing_endspcblock);
792
2/4
✓ Branch 0 taken 2079 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2079 times.
2079 if (in_struct || in_sub_struct) asar_throw_error(pass, error_type_null, error_id_struct_without_endstruct);
793
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2079 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2079 else if (pushpcnum && pass == 0) asar_throw_error(pass, error_type_null, error_id_pushpc_without_pullpc);
794
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2079 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2079 else if (pushnsnum && pass == 0) asar_throw_error(pass, error_type_null, error_id_pushns_without_pullns);
795 2079 freespaceend();
796
2/2
✓ Branch 0 taken 1971 times.
✓ Branch 1 taken 108 times.
2079 if (arch==arch_65816) asend_65816();
797
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 2007 times.
2079 if (arch==arch_spc700) asend_spc700();
798
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 2043 times.
2079 if (arch==arch_superfx) asend_superfx();
799
800 2079 deinitmathcore();
801
2/2
✓ Branch 0 taken 693 times.
✓ Branch 1 taken 1386 times.
2079 if(pass == 0) {
802 693 resolve_pinned_freespaces();
803
2/2
✓ Branch 0 taken 693 times.
✓ Branch 1 taken 693 times.
1386 } else if(pass == 1) {
804 693 allocate_freespaces();
805 693 handle_cleared_rats_tags();
806 }
807 #if defined(_WIN32) || !defined(NO_USE_THREADS)
808 2079 deinit_stack_use_check();
809 #endif
810 2079 }
811
812 149208 static bool addlabel(const char * label, int pos=-1, bool global_label = false)
813 {
814
4/4
✓ Branch 0 taken 103023 times.
✓ Branch 1 taken 46185 times.
✓ Branch 2 taken 54522 times.
✓ Branch 3 taken 48501 times.
149208 if (!label[0] || label[0]==':') return false;//colons are reserved for special labels
815
816 103023 const char* posneglabel = label;
817
1/2
✓ Branch 0 taken 48501 times.
✗ Branch 1 not taken.
103023 string posnegname = posneglabelname(&posneglabel, true);
818
819
4/4
✓ Branch 0 taken 48681 times.
✓ Branch 1 taken 54342 times.
✓ Branch 2 taken 186 times.
✓ Branch 3 taken 48315 times.
103023 if (posnegname.length() > 0)
820 {
821
2/2
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 186 times.
366 if (global_label) return false;
822
3/6
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 294 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 72 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
366 if (*posneglabel != '\0' && *posneglabel != ':') asar_throw_error(0, error_type_block, error_id_broken_label_definition);
823
2/4
✓ Branch 0 taken 366 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 186 times.
✗ Branch 3 not taken.
366 setlabel(posnegname, pos);
824 366 return true;
825 }
826
7/8
✓ Branch 0 taken 100107 times.
✓ Branch 1 taken 2550 times.
✓ Branch 2 taken 99924 times.
✓ Branch 3 taken 183 times.
✓ Branch 4 taken 99906 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 99906 times.
102657 if (label[strlen(label)-1]==':' || label[0]=='.' || label[0]=='?' || label[0] == '#')
827 {
828
2/2
✓ Branch 0 taken 1371 times.
✓ Branch 1 taken 1380 times.
2751 if (!label[1]) return false;
829
6/8
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 2589 times.
✓ Branch 2 taken 126 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 126 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 63 times.
✓ Branch 7 taken 63 times.
2715 if(global_label && (in_struct || in_sub_struct || label[0]=='?')) return false;
830
831 1353 bool define = true;
832
833
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 2625 times.
2697 if (label[0] == '#')
834 {
835 36 define = false;
836 72 label++;
837 }
838
839 // RPG Hacker: Also checking label[1] now, since it might be a macro sublabel.
840 // Also, apparently this here doesn't account for main labels. I guess because
841 // we don't even get here in the first place if they don't include a colon?
842
7/8
✓ Branch 0 taken 1812 times.
✓ Branch 1 taken 885 times.
✓ Branch 2 taken 1794 times.
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 1776 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 891 times.
2697 bool requirecolon = (label[0] != '.' && label[1] != '.') && (in_struct || in_sub_struct);
843
2/2
✓ Branch 0 taken 2589 times.
✓ Branch 1 taken 108 times.
2697 string name=labelname(&label, define);
844
2/2
✓ Branch 0 taken 2460 times.
✓ Branch 1 taken 129 times.
2589 if (label[0]==':') label++;
845
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 129 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
129 else if (requirecolon) asar_throw_error(0, error_type_block, error_id_broken_label_definition);
846
2/2
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 66 times.
129 else if (global_label) return false;
847
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2571 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2571 if (label[0]) asar_throw_error(0, error_type_block, error_id_broken_label_definition);
848
10/12
✓ Branch 0 taken 1452 times.
✓ Branch 1 taken 1119 times.
✓ Branch 2 taken 309 times.
✓ Branch 3 taken 1143 times.
✓ Branch 4 taken 147 times.
✓ Branch 5 taken 18 times.
✓ Branch 6 taken 147 times.
✓ Branch 7 taken 1143 times.
✓ Branch 8 taken 147 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 147 times.
✗ Branch 11 not taken.
2715 if (ns && !global_label) name=ns+name;
849
9/10
✓ Branch 0 taken 2013 times.
✓ Branch 1 taken 558 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 1941 times.
✓ Branch 4 taken 1500 times.
✓ Branch 5 taken 96 times.
✓ Branch 6 taken 1290 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1284 times.
✓ Branch 9 taken 6 times.
2577 setlabel(name, pos, ((in_struct || in_sub_struct) && static_struct));
850 2559 return true;
851 2589 }
852 46935 return false;
853 103023 }
854
855 45693 static void add_addr_to_line(int pos)
856 {
857
2/2
✓ Branch 0 taken 16113 times.
✓ Branch 1 taken 29580 times.
45693 if (pass == 2)
858 16113 addressToLineMapping.includeMapping(get_current_file_name(), get_current_line() + 1, pos);
859 45693 }
860
861 static autoarray<bool> elsestatus;
862 int numtrue=0;//if 1 -> increase both
863 int numif = 0; //if 0 or inside if 0 -> increase only numif
864
865 autoarray<whiletracker> whilestatus;
866 int single_line_for_tracker;
867
868
869 270 static void push_pc()
870 {
871 270 pushpc[pushpcnum].arch=arch;
872 270 pushpc[pushpcnum].snespos=snespos;
873 270 pushpc[pushpcnum].snesstart=startpos;
874 270 pushpc[pushpcnum].snesposreal=realsnespos;
875 270 pushpc[pushpcnum].snesstartreal=realstartpos;
876 270 pushpc[pushpcnum].freeid=freespaceid;
877 270 pushpc[pushpcnum].freest=freespacestart;
878 270 pushpcnum++;
879 270 }
880
881 270 static void pop_pc()
882 {
883 270 pushpcnum--;
884 270 snespos=pushpc[pushpcnum].snespos;
885 270 startpos=pushpc[pushpcnum].snesstart;
886 270 realsnespos=pushpc[pushpcnum].snesposreal;
887 270 realstartpos=pushpc[pushpcnum].snesstartreal;
888 270 freespaceid=pushpc[pushpcnum].freeid;
889 270 freespacestart=pushpc[pushpcnum].freest;
890 270 }
891
892
893 984 string handle_print(char* input)
894 {
895 498 string out;
896
1/2
✓ Branch 0 taken 984 times.
✗ Branch 1 not taken.
984 autoptr<char**> pars = qpsplit(input, ',');
897
1/2
✓ Branch 0 taken 984 times.
✗ Branch 1 not taken.
984 verify_paren(pars);
898
2/2
✓ Branch 0 taken 1659 times.
✓ Branch 1 taken 966 times.
2625 for (int i = 0; pars[i]; i++)
899 {
900 if (0);
901
4/6
✓ Branch 0 taken 1218 times.
✓ Branch 1 taken 441 times.
✓ Branch 2 taken 1218 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 615 times.
✗ Branch 5 not taken.
1659 else if (pars[i][0] == '"') out += safedequote(pars[i]);
902
5/6
✓ Branch 0 taken 234 times.
✓ Branch 1 taken 207 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 198 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
441 else if (!stricmp(pars[i], "bytes")) out += dec(bytes);
903
5/6
✓ Branch 0 taken 207 times.
✓ Branch 1 taken 198 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 189 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
405 else if (!stricmp(pars[i], "freespaceuse")) out += dec(freespaceuse);
904
3/6
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 198 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 189 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
387 else if (!stricmp(pars[i], "pc")) out += hex((unsigned int)(snespos & 0xFFFFFF), 6);
905
3/4
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 108 times.
✓ Branch 3 taken 36 times.
531 else if (!strncasecmp(pars[i], "bin(", strlen("bin(")) ||
906
4/4
✓ Branch 0 taken 258 times.
✓ Branch 1 taken 39 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 36 times.
405 !strncasecmp(pars[i], "dec(", strlen("dec(")) ||
907
6/6
✓ Branch 0 taken 297 times.
✓ Branch 1 taken 90 times.
✓ Branch 2 taken 180 times.
✓ Branch 3 taken 42 times.
✓ Branch 4 taken 252 times.
✓ Branch 5 taken 18 times.
792 !strncasecmp(pars[i], "hex(", strlen("hex(")) ||
908
2/2
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 9 times.
144 !strncasecmp(pars[i], "double(", strlen("double(")))
909 {
910 369 char * arg1pos = strchr(pars[i], '(') + 1;
911 369 char * endpos = strchr(arg1pos, '\0');
912
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 738 times.
✓ Branch 2 taken 369 times.
✓ Branch 3 taken 369 times.
738 while (*endpos == ' ' || *endpos == '\0') endpos--;
913
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 369 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
369 if (*endpos != ')') asar_throw_error(0, error_type_block, error_id_invalid_print_function_syntax);
914
1/2
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
369 string paramstr = string(arg1pos, (int)(endpos - arg1pos));
915
916 int numargs;
917
1/2
✓ Branch 0 taken 369 times.
✗ Branch 1 not taken.
369 autoptr<char**> params = qpsplit(paramstr.temp_raw(), ',', &numargs);
918
1/2
✓ Branch 0 taken 369 times.
✗ Branch 1 not taken.
369 verify_paren(params);
919
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 369 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
369 if (numargs > 2) asar_throw_error(0, error_type_block, error_id_wrong_num_parameters);
920 189 int precision = 0;
921 369 bool hasprec = numargs == 2;
922
2/2
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 189 times.
369 if (hasprec)
923 {
924
1/2
✓ Branch 0 taken 234 times.
✗ Branch 1 not taken.
234 precision = getnum(params[1]);
925
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 234 times.
234 if (precision < 0) precision = 0;
926
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 117 times.
234 if (precision > 64) precision = 64;
927 }
928 369 *(arg1pos - 1) = '\0'; // allows more convenient comparsion functions
929
4/4
✓ Branch 0 taken 225 times.
✓ Branch 1 taken 144 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 135 times.
369 if (!stricmp(pars[i], "bin"))
930 {
931 // sadly printf doesn't have binary, so let's roll our own
932
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 int64_t value = getnum(params[0]);
933 char buffer[65];
934
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 72 times.
90 if (value < 0) {
935
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 out += '-';
936 18 value = -value;
937 // decrement precision because we've output one char already
938 18 precision -= 1;
939
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if (precision<0) precision = 0;
940 }
941
2/2
✓ Branch 0 taken 5760 times.
✓ Branch 1 taken 90 times.
5850 for (int j = 0; j < 64; j++) {
942 5760 buffer[63 - j] = '0' + ((value & (1ull << j)) >> j);
943 }
944 90 buffer[64] = 0;
945 45 int startidx = 0;
946
4/4
✓ Branch 0 taken 5184 times.
✓ Branch 1 taken 72 times.
✓ Branch 2 taken 5166 times.
✓ Branch 3 taken 18 times.
5256 while (startidx < 64 - precision && buffer[startidx] == '0') startidx++;
947
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
90 if (startidx == 64) startidx--; // always want to print at least one digit
948
1/2
✓ Branch 0 taken 45 times.
✗ Branch 1 not taken.
90 out += buffer + startidx;
949 }
950
4/4
✓ Branch 0 taken 174 times.
✓ Branch 1 taken 105 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 99 times.
279 else if (!stricmp(pars[i], "dec"))
951 {
952
1/2
✓ Branch 0 taken 75 times.
✗ Branch 1 not taken.
75 int64_t value = getnum(params[0]);
953 char buffer[65];
954
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
75 snprintf(buffer, 65, "%0*" PRId64, precision, value);
955
1/2
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
75 out += buffer;
956 }
957
4/4
✓ Branch 0 taken 141 times.
✓ Branch 1 taken 63 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 63 times.
204 else if (!stricmp(pars[i], "hex"))
958 {
959
1/2
✓ Branch 0 taken 78 times.
✗ Branch 1 not taken.
78 int64_t value = getnum(params[0]);
960 char buffer[65];
961
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
78 snprintf(buffer, 65, "%0*" PRIX64, precision, value);
962
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
78 out += buffer;
963 }
964
2/4
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 63 times.
✗ Branch 3 not taken.
126 else if (!stricmp(pars[i], "double"))
965 {
966
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 18 times.
126 if (!hasprec) precision = 5;
967
3/6
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 63 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 63 times.
✗ Branch 5 not taken.
126 out += ftostrvar(getnumdouble(params[0]), precision);
968 }
969 369 }
970
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 else asar_throw_error(2, error_type_block, error_id_unknown_variable);
971 }
972 1455 return out;
973 1002 }
974
975 222 void handle_autoclean(string& arg, int checkbyte, int write_pos)
976 {
977
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 222 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
222 if(freespaceid > 0) asar_throw_error(0, error_type_block, error_id_autoclean_in_freespace);
978
979 222 const char* labeltest = arg.data();
980
1/2
✓ Branch 0 taken 111 times.
✗ Branch 1 not taken.
222 snes_label lblval = labelval(&labeltest);
981
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 222 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
222 if (*labeltest) asar_throw_error(0, error_type_block, error_id_label_not_found, arg.data());
982 222 int num = lblval.pos;
983
1/2
✓ Branch 0 taken 111 times.
✗ Branch 1 not taken.
222 auto& targetfs = freespaces[lblval.freespace_id];
984
985
2/2
✓ Branch 0 taken 102 times.
✓ Branch 1 taken 120 times.
222 if (pass == 1) {
986 102 targetfs.leaked = false;
987
3/4
✓ Branch 0 taken 84 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 34 times.
✗ Branch 3 not taken.
102 int orig_pos = read3(checkbyte != -1 ? write_pos+1 : write_pos);
988
1/2
✓ Branch 0 taken 34 times.
✗ Branch 1 not taken.
51 int write_pos_pc = snestopc(write_pos);
989 102 targetfs.orgpos = targetfs.orglen = -1;
990
6/8
✓ Branch 0 taken 102 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 102 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 84 times.
✓ Branch 5 taken 18 times.
✓ Branch 6 taken 36 times.
✓ Branch 7 taken 48 times.
102 if(write_pos_pc >= 0 && write_pos_pc < romlen_r && (checkbyte == -1 || romdata_r[write_pos_pc] == checkbyte)) {
991
1/2
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
54 int rats_loc = ratsstart(orig_pos);
992
2/2
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 12 times.
54 if(rats_loc != -1) {
993 42 targetfs.orgpos = rats_loc + 8;
994
1/2
✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
42 targetfs.orglen = read2(rats_loc + 4) + 1;
995
3/4
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
42 if(!targetfs.is_static) removerats(rats_loc + 8, targetfs.cleanbyte);
996 }
997 }
998
2/2
✓ Branch 0 taken 102 times.
✓ Branch 1 taken 18 times.
120 } else if(pass == 2) {
999
1/2
✓ Branch 0 taken 51 times.
✗ Branch 1 not taken.
102 int start = ratsstart(num);
1000
3/6
✓ Branch 0 taken 51 times.
✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 51 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
102 if(start >= num || start < 0) asar_throw_error(2, error_type_block, error_id_autoclean_label_at_freespace_end);
1001 }
1002 222 }
1003
1004 // single_line_for_tracker is:
1005 // 0 if not in first block of line, not in (single-line) for loop
1006 // 1 if first block of line
1007 // 2 if in single-line for loop
1008 // 3 if after endfor (of a single-line loop)
1009 159594 void assembleblock(const char * block, int& single_line_for_tracker)
1010 {
1011 #define is(test) (!stricmpwithlower(word[0], test))
1012 #define is0(test) (numwords==1 && !stricmpwithlower(word[0], test))
1013 #define is1(test) (numwords==2 && !stricmpwithlower(word[0], test))
1014 #define is2(test) (numwords==3 && !stricmpwithlower(word[0], test))
1015 #define is3(test) (numwords==4 && !stricmpwithlower(word[0], test))
1016 #define par word[1]
1017
1018
1/2
✓ Branch 0 taken 76806 times.
✗ Branch 1 not taken.
76806 callstack_push cs_push(callstack_entry_type::BLOCK, block);
1019
1020 int numwords;
1021
1/2
✓ Branch 0 taken 76806 times.
✗ Branch 1 not taken.
76806 string splitblock = block;
1022
1/2
✓ Branch 0 taken 159594 times.
✗ Branch 1 not taken.
159594 char ** word = qsplit(splitblock.temp_raw(), ' ', &numwords);
1023 76806 autoptr<char **> scope_word = word;
1024 // when writing out the data for the addrToLine mapping,
1025 // we want to write out the snespos we had before writing opcodes
1026 159594 int addrToLinePos = realsnespos & 0xFFFFFF;
1027
1028
14/14
✓ Branch 0 taken 152745 times.
✓ Branch 1 taken 9684 times.
✓ Branch 2 taken 150594 times.
✓ Branch 3 taken 2151 times.
✓ Branch 4 taken 87450 times.
✓ Branch 5 taken 63144 times.
✓ Branch 6 taken 85938 times.
✓ Branch 7 taken 1512 times.
✓ Branch 8 taken 148962 times.
✓ Branch 9 taken 120 times.
✓ Branch 10 taken 2835 times.
✓ Branch 11 taken 146127 times.
✓ Branch 12 taken 1425 times.
✓ Branch 13 taken 76746 times.
162429 while (numif==numtrue && word[0] && (!word[1] || strcmp(word[1], "=")) && addlabel(word[0]))
1029 {
1030 2835 word++;
1031 2835 numwords--;
1032 }
1033
4/4
✓ Branch 0 taken 157323 times.
✓ Branch 1 taken 2151 times.
✓ Branch 2 taken 81699 times.
✓ Branch 3 taken 75624 times.
159474 if (!word[0] || !word[0][0]) return;
1034
12/12
✓ Branch 0 taken 108702 times.
✓ Branch 1 taken 1644 times.
✓ Branch 2 taken 107712 times.
✓ Branch 3 taken 990 times.
✓ Branch 4 taken 107568 times.
✓ Branch 5 taken 144 times.
✓ Branch 6 taken 101790 times.
✓ Branch 7 taken 5778 times.
✓ Branch 8 taken 53913 times.
✓ Branch 9 taken 47877 times.
✓ Branch 10 taken 4800 times.
✓ Branch 11 taken 47355 times.
110346 if (is("if") || is("elseif") || is("assert") || is("while") || is("for"))
1035 {
1036 4800 string errmsg;
1037 4800 whiletracker wstatus;
1038
1/2
✓ Branch 0 taken 9600 times.
✗ Branch 1 not taken.
9600 wstatus.startline = get_current_line();
1039 9600 wstatus.iswhile = is("while");
1040 9600 wstatus.cond = false;
1041 9600 wstatus.is_for = false;
1042 9600 wstatus.for_start = wstatus.for_end = wstatus.for_cur = 0;
1043 9600 wstatus.for_has_var_backup = false;
1044
2/2
✓ Branch 0 taken 1044 times.
✓ Branch 1 taken 8556 times.
9600 if(is("for")) wstatus.is_for = true;
1045
1046 4800 bool is_for_cont = false;
1047 // if this is a for loop and a whilestatus entry already exists at this level,
1048 // and the for loop isn't finished, this is a continuation of the for loop
1049
6/6
✓ Branch 0 taken 1042 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1019 times.
✓ Branch 3 taken 23 times.
✓ Branch 4 taken 498 times.
✓ Branch 5 taken 23 times.
6365 if (is("for") && whilestatus.count > numif && whilestatus[numif].is_for
1050
9/10
✓ Branch 0 taken 1044 times.
✓ Branch 1 taken 8556 times.
✓ Branch 2 taken 627 times.
✓ Branch 3 taken 369 times.
✓ Branch 4 taken 498 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 369 times.
✓ Branch 7 taken 129 times.
✓ Branch 8 taken 369 times.
✓ Branch 9 taken 4431 times.
10620 && whilestatus[numif].for_cur < whilestatus[numif].for_end)
1051 369 is_for_cont = true;
1052
5/8
✓ Branch 0 taken 369 times.
✓ Branch 1 taken 4431 times.
✓ Branch 2 taken 369 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4431 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4431 times.
✗ Branch 7 not taken.
9600 whiletracker& addedwstatus = is_for_cont ? whilestatus[numif] : (whilestatus[numif] = wstatus);
1053
2/2
✓ Branch 0 taken 144 times.
✓ Branch 1 taken 9456 times.
9600 if (is("assert"))
1054 {
1055
1/2
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
144 autoptr<char**> tokens = qpsplit(word[numwords - 1], ',');
1056
1/2
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
144 verify_paren(tokens);
1057
5/6
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 108 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 54 times.
144 if (tokens[0] != NULL && tokens[1] != NULL)
1058 {
1059 18 string rawerrmsg;
1060 18 size_t pos = 1;
1061
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 36 times.
162 while (tokens[pos])
1062 {
1063
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
126 rawerrmsg += tokens[pos];
1064
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 36 times.
126 if (tokens[pos + 1] != NULL)
1065 {
1066
1/2
✓ Branch 0 taken 45 times.
✗ Branch 1 not taken.
90 rawerrmsg += ",";
1067 }
1068 63 pos++;
1069 }
1070
1071
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
36 errmsg = handle_print(rawerrmsg.raw());
1072 36 }
1073 144 }
1074
1075 //handle nested if statements
1076
8/8
✓ Branch 0 taken 1008 times.
✓ Branch 1 taken 8592 times.
✓ Branch 2 taken 666 times.
✓ Branch 3 taken 342 times.
✓ Branch 4 taken 333 times.
✓ Branch 5 taken 333 times.
✓ Branch 6 taken 243 times.
✓ Branch 7 taken 4557 times.
9600 if (numtrue!=numif && !(is("elseif") && numtrue+1==numif))
1077 {
1078
8/8
✓ Branch 0 taken 342 times.
✓ Branch 1 taken 144 times.
✓ Branch 2 taken 198 times.
✓ Branch 3 taken 144 times.
✓ Branch 4 taken 54 times.
✓ Branch 5 taken 144 times.
✓ Branch 6 taken 171 times.
✓ Branch 7 taken 72 times.
486 if ((is("if") || is("while") || is("for"))) numif++;
1079 243 return;
1080 }
1081
8/8
✓ Branch 0 taken 7614 times.
✓ Branch 1 taken 1500 times.
✓ Branch 2 taken 1980 times.
✓ Branch 3 taken 5634 times.
✓ Branch 4 taken 990 times.
✓ Branch 5 taken 990 times.
✓ Branch 6 taken 4062 times.
✓ Branch 7 taken 495 times.
9114 if ((is("if") || is("while") || is("for"))) numif++;
1082
1083
2/2
✓ Branch 0 taken 16020 times.
✓ Branch 1 taken 9114 times.
25134 for(int i = 1; i < numwords - 1; i++)
1084 {
1085 16020 word[i][strlen(word[i])] = ' ';
1086 }
1087 9114 numwords = 2;
1088
1089 bool cond;
1090
2/2
✓ Branch 0 taken 8124 times.
✓ Branch 1 taken 990 times.
9114 if(!is("for"))
1091 {
1092
1/2
✓ Branch 0 taken 8124 times.
✗ Branch 1 not taken.
8124 cond = getnum(word[1]);
1093
8/10
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 7944 times.
✓ Branch 2 taken 90 times.
✓ Branch 3 taken 90 times.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 45 times.
✓ Branch 7 taken 4062 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 45 times.
8124 if (foundlabel && !foundlabel_static && !is("assert")) asar_throw_error(1, error_type_block, error_id_label_in_conditional, word[0]);
1094 }
1095
1096
2/2
✓ Branch 0 taken 990 times.
✓ Branch 1 taken 8034 times.
9024 if (is("for"))
1097 {
1098
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 990 times.
990 if(single_line_for_tracker != 1)
1099 {
1100 numif--;
1101 asar_throw_error(0, error_type_line, error_id_bad_single_line_for);
1102 }
1103
1104
2/2
✓ Branch 0 taken 252 times.
✓ Branch 1 taken 738 times.
990 if(!is_for_cont)
1105 {
1106 252 char* past_eq = strchr(word[1], '=');
1107
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
252 if(!past_eq)
1108 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "missing loop range");
1109
1110
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 string varname(word[1], past_eq - word[1]);
1111 252 past_eq += 1;
1112
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 strip_whitespace(varname);
1113
2/4
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 252 times.
252 if(!validatedefinename(varname))
1114 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "invalid define name");
1115
1116
1/2
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
252 char* range_sep = strqpstr(past_eq, "..");
1117
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
252 if(!range_sep)
1118 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "invalid loop range");
1119
1120
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 string for_start(past_eq, range_sep - past_eq);
1121
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 strip_whitespace(for_start);
1122
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 string for_end(range_sep+2);
1123
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 strip_whitespace(for_end);
1124
1125
1/2
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
252 addedwstatus.for_start = getnum(for_start);
1126
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 if(foundlabel && !foundlabel_static)
1127 asar_throw_error(0, error_type_block, error_id_label_in_conditional, "for");
1128
1/2
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
252 addedwstatus.for_end = getnum(for_end);
1129
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 if(foundlabel && !foundlabel_static)
1130 asar_throw_error(0, error_type_block, error_id_label_in_conditional, "for");
1131
1132
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 addedwstatus.for_variable = varname;
1133 252 addedwstatus.for_cur = addedwstatus.for_start;
1134 252 }
1135 738 else addedwstatus.for_cur++;
1136
1137 990 addedwstatus.cond = addedwstatus.for_cur < addedwstatus.for_end;
1138 990 single_line_for_tracker = 2;
1139
2/2
✓ Branch 0 taken 738 times.
✓ Branch 1 taken 252 times.
990 if(addedwstatus.cond)
1140 {
1141
2/2
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 81 times.
738 numtrue++;
1142
4/4
✓ Branch 0 taken 657 times.
✓ Branch 1 taken 81 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 81 times.
738 if(defines.exists(addedwstatus.for_variable))
1143 {
1144 576 addedwstatus.for_has_var_backup = true;
1145
2/4
✓ Branch 0 taken 288 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 288 times.
✗ Branch 3 not taken.
576 addedwstatus.for_var_backup = defines.find(addedwstatus.for_variable);
1146 }
1147
3/6
✓ Branch 0 taken 738 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 369 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 369 times.
✗ Branch 5 not taken.
738 defines.create(addedwstatus.for_variable) = ftostr(addedwstatus.for_cur);
1148 }
1149 }
1150
6/6
✓ Branch 0 taken 6624 times.
✓ Branch 1 taken 1410 times.
✓ Branch 2 taken 3312 times.
✓ Branch 3 taken 3312 times.
✓ Branch 4 taken 3522 times.
✓ Branch 5 taken 495 times.
8034 else if (is("if") || is("while"))
1151 {
1152 if(0);
1153
2/2
✓ Branch 0 taken 5754 times.
✓ Branch 1 taken 1290 times.
7044 else if (cond)
1154 {
1155 5754 numtrue++;
1156
1/2
✓ Branch 0 taken 2877 times.
✗ Branch 1 not taken.
5754 elsestatus[numif]=true;
1157 }
1158
1/2
✓ Branch 0 taken 645 times.
✗ Branch 1 not taken.
645 else if (!cond)
1159 {
1160
1/2
✓ Branch 0 taken 645 times.
✗ Branch 1 not taken.
1290 elsestatus[numif]=false;
1161 }
1162 7044 addedwstatus.cond = cond;
1163 }
1164
2/2
✓ Branch 0 taken 846 times.
✓ Branch 1 taken 144 times.
990 else if (is("elseif"))
1165 {
1166
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 846 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
846 if (!numif) asar_throw_error(1, error_type_block, error_id_misplaced_elseif);
1167
3/6
✓ Branch 0 taken 423 times.
✓ Branch 1 taken 423 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 423 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
846 if (whilestatus[numif - 1].iswhile) asar_throw_error(1, error_type_block, error_id_elseif_in_while);
1168
2/2
✓ Branch 0 taken 324 times.
✓ Branch 1 taken 522 times.
846 if (numif==numtrue) numtrue--;
1169
8/8
✓ Branch 0 taken 324 times.
✓ Branch 1 taken 522 times.
✓ Branch 2 taken 279 times.
✓ Branch 3 taken 45 times.
✓ Branch 4 taken 117 times.
✓ Branch 5 taken 45 times.
✓ Branch 6 taken 117 times.
✓ Branch 7 taken 306 times.
1008 if (cond && !elsestatus[numif])
1170 {
1171 234 numtrue++;
1172
1/2
✓ Branch 0 taken 117 times.
✗ Branch 1 not taken.
234 elsestatus[numif]=true;
1173 }
1174 }
1175 // otherwise, must be assert command
1176
4/4
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 96 times.
✓ Branch 2 taken 30 times.
✓ Branch 3 taken 18 times.
144 else if (pass == 2 && !cond)
1177 {
1178
7/10
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 15 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 6 times.
54 if (errmsg) asar_throw_error(2, error_type_block, error_id_assertion_failed, (string(": ") + errmsg).data());
1179
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 else asar_throw_error(2, error_type_block, error_id_assertion_failed, ".");
1180 }
1181
4/4
✓ Branch 0 taken 4497 times.
✓ Branch 1 taken 243 times.
✓ Branch 2 taken 4497 times.
✓ Branch 3 taken 243 times.
9963 }
1182
14/14
✓ Branch 0 taken 18516 times.
✓ Branch 1 taken 82230 times.
✓ Branch 2 taken 16872 times.
✓ Branch 3 taken 1644 times.
✓ Branch 4 taken 16872 times.
✓ Branch 5 taken 82230 times.
✓ Branch 6 taken 11094 times.
✓ Branch 7 taken 5778 times.
✓ Branch 8 taken 11094 times.
✓ Branch 9 taken 82230 times.
✓ Branch 10 taken 1044 times.
✓ Branch 11 taken 10050 times.
✓ Branch 12 taken 4233 times.
✓ Branch 13 taken 43122 times.
100746 else if (is0("endif") || is0("endwhile") || is0("endfor"))
1183 {
1184
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8466 times.
8466 if (!numif)
1185 asar_throw_error(1, error_type_block, error_id_misplaced_endif);
1186
1/2
✓ Branch 0 taken 4233 times.
✗ Branch 1 not taken.
8466 whiletracker& thisws = whilestatus[numif - 1];
1187
1188
3/4
✓ Branch 0 taken 1644 times.
✓ Branch 1 taken 5778 times.
✓ Branch 2 taken 1644 times.
✗ Branch 3 not taken.
7422 if((!thisws.is_for && !thisws.iswhile && !is("endif")) ||
1189
7/8
✓ Branch 0 taken 7422 times.
✓ Branch 1 taken 1044 times.
✓ Branch 2 taken 5778 times.
✓ Branch 3 taken 2688 times.
✓ Branch 4 taken 5778 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 522 times.
✓ Branch 7 taken 7944 times.
20121 (thisws.iswhile && !is("endwhile")) ||
1190
3/4
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 4233 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 522 times.
4755 (thisws.is_for && !is("endfor")))
1191 asar_throw_error(1, error_type_block, error_id_misplaced_endif);
1192
1193
2/2
✓ Branch 0 taken 6258 times.
✓ Branch 1 taken 2208 times.
8466 if (numif==numtrue) numtrue--;
1194 8466 numif--;
1195
1196
2/2
✓ Branch 0 taken 1044 times.
✓ Branch 1 taken 7422 times.
8466 if(thisws.is_for)
1197 {
1198
2/2
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 864 times.
1044 if(single_line_for_tracker == 2) single_line_for_tracker = 3;
1199
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1044 times.
1044 if(moreonline)
1200 {
1201 // sabotage the whilestatus to prevent the loop running again
1202 // and spamming more of the same error
1203 thisws.for_cur = thisws.for_end;
1204 thisws.cond = false;
1205 asar_throw_error(0, error_type_block, error_id_bad_single_line_for);
1206 }
1207
1208
2/2
✓ Branch 0 taken 738 times.
✓ Branch 1 taken 306 times.
1044 if(thisws.cond)
1209 {
1210
2/2
✓ Branch 0 taken 576 times.
✓ Branch 1 taken 162 times.
738 if(thisws.for_has_var_backup)
1211
2/4
✓ Branch 0 taken 576 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 288 times.
✗ Branch 3 not taken.
576 defines.create(thisws.for_variable) = thisws.for_var_backup;
1212 else
1213
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 defines.remove(thisws.for_variable);
1214 }
1215 }
1216 }
1217
6/6
✓ Branch 0 taken 10050 times.
✓ Branch 1 taken 82230 times.
✓ Branch 2 taken 5010 times.
✓ Branch 3 taken 5040 times.
✓ Branch 4 taken 399 times.
✓ Branch 5 taken 42723 times.
92280 else if (is0("else"))
1218 {
1219
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 798 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
798 if (!numif) asar_throw_error(1, error_type_block, error_id_misplaced_else);
1220
5/12
✓ Branch 0 taken 798 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 798 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 399 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 399 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 399 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
798 if (whilestatus[numif - 1].iswhile || whilestatus[numif - 1].is_for) asar_throw_error(1, error_type_block, error_id_else_in_while_loop);
1221
2/2
✓ Branch 0 taken 318 times.
✓ Branch 1 taken 480 times.
798 else if (numif==numtrue) numtrue--;
1222
8/8
✓ Branch 0 taken 444 times.
✓ Branch 1 taken 36 times.
✓ Branch 2 taken 309 times.
✓ Branch 3 taken 135 times.
✓ Branch 4 taken 87 times.
✓ Branch 5 taken 135 times.
✓ Branch 6 taken 87 times.
✓ Branch 7 taken 153 times.
702 else if (numif==numtrue+1 && !elsestatus[numif])
1223 {
1224 174 numtrue++;
1225
1/2
✓ Branch 0 taken 87 times.
✗ Branch 1 not taken.
174 elsestatus[numif]=true;
1226 }
1227 }
1228
2/2
✓ Branch 0 taken 48759 times.
✓ Branch 1 taken 42723 times.
91482 else if (numif!=numtrue) return;
1229
4/4
✓ Branch 0 taken 86238 times.
✓ Branch 1 taken 48 times.
✓ Branch 2 taken 29607 times.
✓ Branch 3 taken 56631 times.
86286 else if (asblock_pick(word, numwords))
1230 {
1231
1/2
✓ Branch 0 taken 29607 times.
✗ Branch 1 not taken.
29607 add_addr_to_line(addrToLinePos);
1232 }
1233
12/12
✓ Branch 0 taken 53091 times.
✓ Branch 1 taken 3540 times.
✓ Branch 2 taken 41163 times.
✓ Branch 3 taken 11928 times.
✓ Branch 4 taken 41001 times.
✓ Branch 5 taken 162 times.
✓ Branch 6 taken 39195 times.
✓ Branch 7 taken 1806 times.
✓ Branch 8 taken 288 times.
✓ Branch 9 taken 38907 times.
✓ Branch 10 taken 7116 times.
✓ Branch 11 taken 18177 times.
56631 else if (numwords > 1 && (is("db") || is("dw") || is("dl") || is("dd")))
1234 {
1235 7116 string line;
1236
2/2
✓ Branch 0 taken 14184 times.
✓ Branch 1 taken 14184 times.
28368 for(int i = 1; i < numwords; i++){
1237
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 14184 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
14184 if(i > 1) line += " ";
1238
1/2
✓ Branch 0 taken 7116 times.
✗ Branch 1 not taken.
14184 line += word[i];
1239 }
1240
1/2
✓ Branch 0 taken 14184 times.
✗ Branch 1 not taken.
14184 autoptr<char**> pars=qpsplit(line.temp_raw(), ',');
1241
1/2
✓ Branch 0 taken 14184 times.
✗ Branch 1 not taken.
14184 verify_paren(pars);
1242
1243 void (*do_write)(unsigned int);
1244 14184 char first = to_lower(word[0][1]);
1245
2/2
✓ Branch 0 taken 7116 times.
✓ Branch 1 taken 7068 times.
14184 if (first == 'b') do_write = &write1;
1246
2/2
✓ Branch 0 taken 1128 times.
✓ Branch 1 taken 1128 times.
2256 else if (first == 'w') do_write = &write2;
1247
2/2
✓ Branch 0 taken 1047 times.
✓ Branch 1 taken 1047 times.
2094 else if (first == 'l') do_write = &write3;
1248 144 else do_write = &write4;
1249
1250
2/2
✓ Branch 0 taken 16674 times.
✓ Branch 1 taken 14118 times.
30792 for (int i=0;pars[i];i++)
1251 {
1252
2/2
✓ Branch 0 taken 669 times.
✓ Branch 1 taken 16005 times.
16674 if (pars[i][0]=='"')
1253 {
1254
1/2
✓ Branch 0 taken 669 times.
✗ Branch 1 not taken.
669 char * str=const_cast<char*>(safedequote(pars[i]));
1255 669 int codepoint = 0u;
1256
1/2
✓ Branch 0 taken 669 times.
✗ Branch 1 not taken.
669 str += utf8_val(&codepoint, str);
1257
3/4
✓ Branch 0 taken 2718 times.
✓ Branch 1 taken 669 times.
✓ Branch 2 taken 1368 times.
✗ Branch 3 not taken.
3387 while ( codepoint != 0 && codepoint != -1 )
1258 {
1259
2/4
✓ Branch 0 taken 2718 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2718 times.
✗ Branch 3 not taken.
2718 do_write(thetable.get_val(codepoint));
1260
1/2
✓ Branch 0 taken 2718 times.
✗ Branch 1 not taken.
2718 str += utf8_val(&codepoint, str);
1261 }
1262
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 669 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
669 if (codepoint == -1) asar_throw_error(0, error_type_block, error_id_invalid_utf8);
1263 }
1264 else
1265 {
1266
5/6
✓ Branch 0 taken 5329 times.
✓ Branch 1 taken 10676 times.
✓ Branch 2 taken 5263 times.
✓ Branch 3 taken 66 times.
✓ Branch 4 taken 15939 times.
✗ Branch 5 not taken.
16005 do_write((pass==2)?getnum(pars[i]):0);
1267 }
1268 }
1269
1/2
✓ Branch 0 taken 14118 times.
✗ Branch 1 not taken.
14118 add_addr_to_line(addrToLinePos);
1270 14250 }
1271
2/2
✓ Branch 0 taken 1566 times.
✓ Branch 1 taken 40881 times.
42447 else if(word[0][0]=='%')
1272 {
1273
2/2
✓ Branch 0 taken 1530 times.
✓ Branch 1 taken 36 times.
1566 callmacro(strchr(block, '%')+1);
1274 }
1275
6/6
✓ Branch 0 taken 36195 times.
✓ Branch 1 taken 4686 times.
✓ Branch 2 taken 21159 times.
✓ Branch 3 taken 15036 times.
✓ Branch 4 taken 180 times.
✓ Branch 5 taken 17214 times.
40881 else if (is1("undef"))
1276 {
1277
2/4
✓ Branch 0 taken 360 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 180 times.
✗ Branch 3 not taken.
360 string def = safedequote(par);
1278
1279
4/4
✓ Branch 0 taken 351 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 171 times.
✓ Branch 3 taken 9 times.
360 if (defines.exists(def))
1280 {
1281
1/2
✓ Branch 0 taken 342 times.
✗ Branch 1 not taken.
342 defines.remove(def);
1282 }
1283 else
1284 {
1285
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_define_not_found, def.data());
1286 }
1287 360 }
1288
6/6
✓ Branch 0 taken 1992 times.
✓ Branch 1 taken 38529 times.
✓ Branch 2 taken 981 times.
✓ Branch 3 taken 1011 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 17205 times.
40521 else if (is0("error"))
1289 {
1290
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_error_command, ".");
1291 }
1292
6/6
✓ Branch 0 taken 1974 times.
✓ Branch 1 taken 38529 times.
✓ Branch 2 taken 972 times.
✓ Branch 3 taken 1002 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 17196 times.
40503 else if (is0("warn"))
1293 {
1294
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 asar_throw_warning(2, warning_id_warn_command, ".");
1295 }
1296
6/6
✓ Branch 0 taken 35835 times.
✓ Branch 1 taken 4650 times.
✓ Branch 2 taken 20982 times.
✓ Branch 3 taken 14853 times.
✓ Branch 4 taken 21 times.
✓ Branch 5 taken 17175 times.
40485 else if (is1("error"))
1297 {
1298
1/2
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
39 string out = handle_print(par);
1299 // RPG Hacker: This used to be on pass 0, which had its merits (you don't want to miss a potentially critical
1300 // user-generated error, just because a bazillion other errors are thrown in passes before it). However, I
1301 // don't see how to support print functions with this without moving it to pass 2. Suggestions are welcome.
1302
4/6
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 21 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 21 times.
99 asar_throw_error(2, error_type_block, error_id_error_command, (string(": ") + out).data());
1303 39 }
1304
6/6
✓ Branch 0 taken 35796 times.
✓ Branch 1 taken 4650 times.
✓ Branch 2 taken 20964 times.
✓ Branch 3 taken 14832 times.
✓ Branch 4 taken 21 times.
✓ Branch 5 taken 17154 times.
40446 else if (is1("warn"))
1305 {
1306
1/2
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
39 string out = handle_print(par);
1307
3/6
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 21 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
39 asar_throw_warning(2, warning_id_warn_command, (string(": ") + out).data());
1308 39 }
1309
6/6
✓ Branch 0 taken 35757 times.
✓ Branch 1 taken 4650 times.
✓ Branch 2 taken 20943 times.
✓ Branch 3 taken 14814 times.
✓ Branch 4 taken 72 times.
✓ Branch 5 taken 17082 times.
40407 else if (is1("warnings"))
1310 {
1311
4/4
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 36 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 36 times.
144 if (stricmp(word[1], "push") == 0)
1312 {
1313
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 push_warnings();
1314 }
1315
2/4
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 else if (stricmp(word[1], "pull") == 0)
1316 {
1317
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 18 times.
72 pull_warnings();
1318 }
1319 else
1320 {
1321 asar_throw_error(0, error_type_block, error_id_broken_command, "warnings", "Unknown parameter");
1322 }
1323 }
1324
6/6
✓ Branch 0 taken 2496 times.
✓ Branch 1 taken 37767 times.
✓ Branch 2 taken 1248 times.
✓ Branch 3 taken 1248 times.
✓ Branch 4 taken 126 times.
✓ Branch 5 taken 16956 times.
40263 else if (is2("warnings"))
1325 {
1326
4/4
✓ Branch 0 taken 153 times.
✓ Branch 1 taken 99 times.
✓ Branch 2 taken 27 times.
✓ Branch 3 taken 99 times.
252 if (stricmp(word[1], "enable") == 0)
1327 {
1328
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 asar_warning_id warnid = parse_warning_id_from_string(word[2]);
1329
1330
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
54 if (warnid != warning_id_end)
1331 {
1332
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 set_warning_enabled(warnid, true);
1333 }
1334 else
1335 {
1336
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_invalid_warning_id, word[2], "warnings enable");
1337 }
1338 }
1339
2/4
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 99 times.
✗ Branch 3 not taken.
198 else if (stricmp(word[1], "disable") == 0)
1340 {
1341
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 asar_warning_id warnid = parse_warning_id_from_string(word[2]);
1342
1343
2/2
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 36 times.
198 if (warnid != warning_id_end)
1344 {
1345
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 set_warning_enabled(warnid, false);
1346 }
1347 else
1348 {
1349
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
36 asar_throw_error(0, error_type_block, error_id_invalid_warning_id, word[2], "warnings disable");
1350 }
1351 }
1352 else
1353 {
1354 asar_throw_error(0, error_type_block, error_id_broken_command, "warnings", "Unknown parameter");
1355 }
1356 }
1357
6/6
✓ Branch 0 taken 35613 times.
✓ Branch 1 taken 4398 times.
✓ Branch 2 taken 20871 times.
✓ Branch 3 taken 14742 times.
✓ Branch 4 taken 63 times.
✓ Branch 5 taken 16893 times.
40011 else if(is1("global"))
1358 {
1359
3/4
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 90 times.
126 if (!addlabel(word[1], -1, true))
1360 {
1361
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
36 asar_throw_error(1, error_type_block, error_id_invalid_global_label, word[1]);
1362 }
1363 }
1364
6/6
✓ Branch 0 taken 2244 times.
✓ Branch 1 taken 37641 times.
✓ Branch 2 taken 1122 times.
✓ Branch 3 taken 1122 times.
✓ Branch 4 taken 105 times.
✓ Branch 5 taken 16788 times.
39885 else if (is2("check"))
1365 {
1366
4/4
✓ Branch 0 taken 114 times.
✓ Branch 1 taken 96 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 96 times.
210 if (stricmp(word[1], "title") == 0)
1367 {
1368 // RPG Hacker: Removed trimming for now - I think requiring an exact match is probably
1369 // better here (not sure, though, it's worth discussing)
1370
2/4
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
18 string expected_title = safedequote(word[2]);
1371 // randomdude999: this also removes leading spaces because itrim gets stuck in an endless
1372 // loop when multi is true and one argument is empty
1373 // in hirom the rom needs to be an entire bank for it to have a title, other modes only need 0x8000 bytes
1374
3/6
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
18 if (romlen < ((mapper == hirom || mapper == exhirom) ? 0x10000 : 0x8000)) // too short
1375 {
1376 if (!ignoretitleerrors) // title errors shouldn't be ignored
1377 asar_throw_error(0, error_type_block, error_id_rom_too_short, expected_title.data());
1378 else // title errors should be ignored, throw a warning anyways
1379 asar_throw_warning(0, warning_id_rom_too_short, expected_title.data());
1380 }
1381 else {
1382 9 string actual_title;
1383 9 string actual_display_title;
1384
2/2
✓ Branch 0 taken 378 times.
✓ Branch 1 taken 18 times.
396 for (int i = 0;i < 21;i++)
1385 {
1386
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
378 unsigned char c = romdata[snestopc(0x00FFC0 + i)];
1387
1/2
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
378 actual_title += (char)c;
1388 // the replacements are from interface-cli.cpp
1389
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == 7) c = 14;
1390
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == 8) c = 27;
1391
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == 9) c = 26;
1392
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == '\r') c = 17;
1393
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == '\n') c = 25;
1394
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 378 times.
378 if (c == '\0') c = 155;
1395
1/2
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
378 actual_display_title += (char)c;
1396 }
1397
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (strncmp(expected_title, actual_title, 21) != 0)
1398 {
1399 if (!ignoretitleerrors) // title errors shouldn't be ignored
1400 asar_throw_error(0, error_type_block, error_id_rom_title_incorrect, expected_title.data(), actual_display_title.data());
1401 else // title errors should be ignored, throw a warning anyways
1402 asar_throw_warning(0, warning_id_rom_title_incorrect, expected_title.data(), actual_display_title.data());
1403 }
1404 18 }
1405 18 }
1406
2/4
✓ Branch 0 taken 192 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 96 times.
✗ Branch 3 not taken.
192 else if (stricmp(word[1], "bankcross") == 0)
1407 {
1408 if (0);
1409
4/4
✓ Branch 0 taken 141 times.
✓ Branch 1 taken 51 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 51 times.
192 else if (!stricmp(word[2], "off"))
1410 {
1411 90 disable_bank_cross_errors = true;
1412 }
1413
4/4
✓ Branch 0 taken 99 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 48 times.
✓ Branch 3 taken 3 times.
102 else if (!stricmp(word[2], "half"))
1414 {
1415 96 disable_bank_cross_errors = false;
1416 96 check_half_banks_crossed = true;
1417 }
1418
2/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
6 else if (!stricmp(word[2], "full"))
1419 {
1420 6 disable_bank_cross_errors = false;
1421 6 check_half_banks_crossed = false;
1422 }
1423 else asar_throw_error(0, error_type_block, error_id_invalid_check);
1424
1425 }
1426 else
1427 {
1428 asar_throw_error(0, error_type_block, error_id_invalid_check);
1429 }
1430 }
1431
9/10
✓ Branch 0 taken 1956 times.
✓ Branch 1 taken 37719 times.
✓ Branch 2 taken 1956 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 35487 times.
✓ Branch 5 taken 4188 times.
✓ Branch 6 taken 108 times.
✓ Branch 7 taken 35379 times.
✓ Branch 8 taken 54 times.
✓ Branch 9 taken 16734 times.
39675 else if (is0("asar") || is1("asar"))
1432 {
1433
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if (!asarverallowed) asar_throw_error(0, error_type_block, error_id_start_of_file);
1434
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 54 times.
198 if (!par) return;
1435 54 int dots=0;
1436 54 int dig=0;
1437
2/2
✓ Branch 0 taken 450 times.
✓ Branch 1 taken 108 times.
558 for (int i=0;par[i];i++)
1438 {
1439
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 324 times.
450 if (par[i]=='.')
1440 {
1441
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
126 if (!dig) asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1442 63 dig=0;
1443 126 dots++;
1444 }
1445
1/2
✓ Branch 0 taken 324 times.
✗ Branch 1 not taken.
324 else if (is_digit(par[i])) dig++;
1446 else asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1447 }
1448
4/8
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 54 times.
✓ Branch 3 taken 54 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 54 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
108 if (!dig || !dots || dots>2) asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1449
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 autoptr<char**> vers=split(par, '.');
1450 108 int vermaj=atoi(vers[0]);
1451
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if (vermaj > asarver_maj) asar_throw_error(pass, error_type_fatal, error_id_asar_too_old);
1452
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 18 times.
108 if (vermaj<asarver_maj) return;
1453
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (dots==1)
1454 {
1455 if (strlen(vers[1])!=2) asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1456 //if (asarver_min<10 && asarver_bug<10 && strlen(vers[1])>2) error(0, "This version of Asar is too old for this patch.");
1457 int verminbug=atoi(vers[1]);
1458 int tmpver=asarver_bug;
1459 if (tmpver>9) tmpver=9;
1460 if (asarver_min*10+tmpver<verminbug) asar_throw_error(pass, error_type_fatal, error_id_asar_too_old);
1461 }
1462 else
1463 {
1464 18 int vermin=atoi(vers[1]);
1465
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if (vermin>asarver_min) asar_throw_error(pass, error_type_fatal, error_id_asar_too_old);
1466 18 int verbug=atoi(vers[2]);
1467
2/6
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 if (vermin==asarver_min && verbug>asarver_bug) asar_throw_error(pass, error_type_fatal, error_id_asar_too_old);
1468 }
1469
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 45 times.
108 }
1470
10/10
✓ Branch 0 taken 1956 times.
✓ Branch 1 taken 37611 times.
✓ Branch 2 taken 1950 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 35379 times.
✓ Branch 5 taken 4182 times.
✓ Branch 6 taken 18 times.
✓ Branch 7 taken 35361 times.
✓ Branch 8 taken 12 times.
✓ Branch 9 taken 16722 times.
39567 else if (is0("include") || is1("includefrom"))
1471 {
1472
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
24 if (!asarverallowed) asar_throw_error(0, error_type_block, error_id_start_of_file);
1473
2/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
6 if (in_top_level_file())
1474 {
1475
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
6 if (par) asar_throw_error(pass, error_type_fatal, error_id_cant_be_main_file, (string(" The main file is '") + par + "'.").data());
1476
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 else asar_throw_error(pass, error_type_fatal, error_id_cant_be_main_file, "");
1477 }
1478 }
1479
6/6
✓ Branch 0 taken 1950 times.
✓ Branch 1 taken 37593 times.
✓ Branch 2 taken 960 times.
✓ Branch 3 taken 990 times.
✓ Branch 4 taken 45 times.
✓ Branch 5 taken 16677 times.
39543 else if (is0("includeonce"))
1480 {
1481
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 const char* current_file = get_current_file_name();
1482
2/4
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 90 times.
✗ Branch 3 not taken.
90 if (!file_included_once(current_file))
1483 {
1484
2/4
✓ Branch 0 taken 45 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 45 times.
✗ Branch 3 not taken.
90 includeonce.append(current_file);
1485 }
1486 }
1487
6/6
✓ Branch 0 taken 2034 times.
✓ Branch 1 taken 37419 times.
✓ Branch 2 taken 1773 times.
✓ Branch 3 taken 261 times.
✓ Branch 4 taken 261 times.
✓ Branch 5 taken 756 times.
39453 else if (numwords==3 && !stricmp(word[1], "="))
1488 {
1489
3/4
✓ Branch 0 taken 1206 times.
✓ Branch 1 taken 306 times.
✓ Branch 2 taken 1206 times.
✗ Branch 3 not taken.
1512 if(word[0][0] == '\'' && word[0][1])
1490 {
1491 int codepoint;
1492 1206 const char* char_start = word[0]+1;
1493
1/2
✓ Branch 0 taken 1206 times.
✗ Branch 1 not taken.
1206 const char* after = char_start + utf8_val(&codepoint, char_start);
1494
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1206 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1206 if (codepoint == -1) asar_throw_error(0, error_type_block, error_id_invalid_utf8);
1495
2/4
✓ Branch 0 taken 1206 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1206 times.
✗ Branch 3 not taken.
1206 if(after[0] == '\'' && after[1] == '\0') {
1496
3/4
✓ Branch 0 taken 1188 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 1188 times.
✗ Branch 3 not taken.
1206 thetable.set_val(codepoint, getnum(word[2]));
1497
3/6
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1170 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1188 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
1498 1188 return;
1499 } // todo: error checking here
1500 }
1501 // randomdude999: int cast b/c i'm too lazy to also mess with making setlabel()
1502 // unsigned, besides it wouldn't matter anyways.
1503
1/2
✓ Branch 0 taken 306 times.
✗ Branch 1 not taken.
306 int num=(int)getnum(word[2]);
1504
5/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 270 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
306 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_label_cross_assignment);
1505
1506 288 const char* newlabelname = word[0];
1507 144 bool ismacro = false;
1508
1509
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 270 times.
288 if (newlabelname[0] == '?')
1510 {
1511 9 ismacro = true;
1512 18 newlabelname++;
1513 }
1514
1515
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
153 if (ismacro && macrorecursion == 0)
1516 {
1517 asar_throw_error(0, error_type_block, error_id_macro_label_outside_of_macro);
1518 }
1519
1520
3/7
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 192 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 96 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
288 if (!confirmname(newlabelname)) asar_throw_error(0, error_type_block, error_id_invalid_label_name);
1521
1522 144 string completename;
1523
1524
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 270 times.
288 if (ismacro)
1525 {
1526
5/10
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
27 completename += STR":macro_" + dec(calledmacros) + "_";
1527 }
1528
1529
1/2
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
288 completename += newlabelname;
1530
1531
2/4
✓ Branch 0 taken 288 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 144 times.
✗ Branch 3 not taken.
288 setlabel(ns + completename, num, true);
1532 288 }
1533
3/4
✓ Branch 0 taken 37941 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 37233 times.
✓ Branch 3 taken 708 times.
37941 else if (assemblemapper(word, numwords)) {}
1534
6/6
✓ Branch 0 taken 35304 times.
✓ Branch 1 taken 1929 times.
✓ Branch 2 taken 20766 times.
✓ Branch 3 taken 14538 times.
✓ Branch 4 taken 1227 times.
✓ Branch 5 taken 14325 times.
37233 else if (is1("org"))
1535 {
1536
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2406 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2406 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
1537
1/2
✓ Branch 0 taken 1227 times.
✗ Branch 1 not taken.
2406 freespaceend();
1538
1/2
✓ Branch 0 taken 2406 times.
✗ Branch 1 not taken.
2406 unsigned int num=getnum(par);
1539
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2406 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2406 if (forwardlabel) asar_throw_error(0, error_type_block, error_id_org_label_forward);
1540
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2406 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2406 if (num&~0xFFFFFF) asar_throw_error(1, error_type_block, error_id_snes_address_out_of_bounds, hex(num, 6).data());
1541
5/10
✓ Branch 0 taken 819 times.
✓ Branch 1 taken 1587 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 801 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1605 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
2406 if ((mapper==lorom || mapper==exlorom) && (num&0x408000)==0x400000 && (num&0x700000)!=0x700000) asar_throw_warning(0, warning_id_set_middle_byte);
1542 2406 snespos=(int)num;
1543 2406 realsnespos=(int)num;
1544 2406 startpos=(int)num;
1545 2406 realstartpos=(int)num;
1546 2406 snespos_valid = true;
1547 }
1548 #define ret_error(errid) { asar_throw_error(0, error_type_block, errid); return; }
1549 #define ret_error_params(errid, ...) { asar_throw_error(0, error_type_block, errid, __VA_ARGS__); return; }
1550
2/2
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 34557 times.
34827 else if (is("struct"))
1551 {
1552 //verifysnespos();
1553
2/6
✓ Branch 0 taken 270 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 270 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
270 if (in_struct || in_sub_struct) ret_error(error_id_nested_struct);
1554
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 270 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
270 if (numwords < 2) ret_error(error_id_missing_struct_params);
1555
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 270 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
270 if (numwords > 4) ret_error(error_id_too_many_struct_params);
1556
3/7
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 180 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 90 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
270 if (!confirmname(word[1])) ret_error(error_id_invalid_struct_name);
1557
1558
6/10
✓ Branch 0 taken 201 times.
✓ Branch 1 taken 69 times.
✓ Branch 2 taken 132 times.
✓ Branch 3 taken 69 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 66 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 135 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
270 if (structs.exists(word[1]) && pass == 0) ret_error_params(error_id_struct_redefined, word[1]);
1559
1560 270 static_struct = false;
1561 270 old_snespos = snespos;
1562 270 old_startpos = startpos;
1563 270 old_optimizeforbank = optimizeforbank;
1564 270 old_snespos_valid = snespos_valid;
1565 135 unsigned int base = 0;
1566
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 180 times.
270 if (numwords == 3)
1567 {
1568 90 static_struct = true;
1569
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 base = getnum(word[2]);
1570
1571
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
90 if (foundlabel && !foundlabel_static) static_struct = false;
1572 }
1573
1574 270 bool old_in_struct = in_struct;
1575 270 bool old_in_sub_struct = in_sub_struct;
1576
4/4
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 54 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 36 times.
270 in_struct = numwords == 2 || numwords == 3;
1577 270 in_sub_struct = numwords == 4;
1578
1579 #define ret_error_cleanup(errid) { in_struct = old_in_struct; in_sub_struct = old_in_sub_struct; asar_throw_error(0, error_type_block, errid); return; }
1580 #define ret_error_params_cleanup(errid, ...) { in_struct = old_in_struct; in_sub_struct = old_in_sub_struct; asar_throw_error(0, error_type_block, errid, __VA_ARGS__); return; }
1581
1582
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 180 times.
270 if (numwords == 3)
1583 {
1584
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
90 if (base&~0xFFFFFF) ret_error_params_cleanup(error_id_snes_address_out_of_bounds, hex((unsigned int)base, 6).data());
1585 90 snespos = (int)base;
1586 90 startpos = (int)base;
1587 }
1588
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 108 times.
180 else if (numwords == 4)
1589 {
1590
3/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 36 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
72 if (strcasecmp(word[2], "extends")) ret_error_cleanup(error_id_missing_extends);
1591
3/7
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
72 if (!confirmname(word[3])) ret_error_cleanup(error_id_struct_invalid_parent_name);
1592
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 string tmp_struct_parent = word[3];
1593
1594
3/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 36 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
72 if (!structs.exists(tmp_struct_parent)) ret_error_params_cleanup(error_id_struct_not_found, tmp_struct_parent.data());
1595
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 snes_struct structure = structs.find(tmp_struct_parent);
1596
1597 72 static_struct = structure.is_static;
1598
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 struct_parent = tmp_struct_parent;
1599 72 snespos = structure.base_end;
1600 72 startpos = structure.base_end;
1601
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
72 }
1602
1603
1/2
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
270 push_pc();
1604
1605 270 optimizeforbank = -1;
1606
1607
1/2
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
270 struct_name = word[1];
1608 270 struct_base = snespos;
1609 270 realsnespos = 0;
1610 270 realstartpos = 0;
1611 270 snespos_valid = true;
1612
1613
2/4
✓ Branch 0 taken 270 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
405 setlabel(ns + struct_name, snespos, static_struct);
1614
1615 #undef ret_error_cleanup
1616 #undef ret_error_params_cleanup
1617 }
1618
2/2
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 34287 times.
34557 else if (is("endstruct"))
1619 {
1620
3/6
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 252 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
270 if (numwords != 1 && numwords != 3) ret_error(error_id_invalid_endstruct_count);
1621
5/8
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 252 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
270 if (numwords == 3 && strcasecmp(word[1], "align")) ret_error(error_id_expected_align);
1622
3/6
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 198 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 72 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
270 if (!in_struct && !in_sub_struct) ret_error(error_id_endstruct_without_struct);
1623
1624
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 252 times.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
270 int alignment = numwords == 3 ? (int)getnum(word[2]) : 1;
1625
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 144 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
144 if (alignment < 1) ret_error(error_id_alignment_too_small);
1626
1627 135 snes_struct structure;
1628 270 structure.base_end = snespos;
1629 270 structure.struct_size = alignment * ((snespos - struct_base + alignment - 1) / alignment);
1630 270 structure.object_size = structure.struct_size;
1631 270 structure.is_static = static_struct;
1632
1633
2/2
✓ Branch 0 taken 198 times.
✓ Branch 1 taken 72 times.
270 if (in_struct)
1634 {
1635
2/4
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 99 times.
✗ Branch 3 not taken.
198 structs.create(struct_name) = structure;
1636 }
1637
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 else if (in_sub_struct)
1638 {
1639 36 snes_struct parent;
1640
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 parent = structs.find(struct_parent);
1641
1642
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 if (parent.object_size < parent.struct_size + structure.struct_size) {
1643 72 parent.object_size = parent.struct_size + structure.struct_size;
1644 }
1645
1646
4/8
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 36 times.
✗ Branch 7 not taken.
72 structs.create(struct_parent + "." + struct_name) = structure;
1647
2/4
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 structs.create(struct_parent) = parent;
1648 36 }
1649
1650
1/2
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
270 pop_pc();
1651 270 in_struct = false;
1652 270 in_sub_struct = false;
1653 270 snespos = old_snespos;
1654 270 startpos = old_startpos;
1655 270 optimizeforbank = old_optimizeforbank;
1656 270 snespos_valid = old_snespos_valid;
1657 270 static_struct = false;
1658 135 }
1659 #undef ret_error
1660
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 34251 times.
34287 else if(is("spcblock"))
1661 {
1662 //banned features when active: org, freespace(and variants), arch, mapper,namespace,pushns
1663
2/6
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 36 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
36 if(in_struct || in_sub_struct) asar_throw_error(0, error_type_block, error_id_spcblock_inside_struct);
1664
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if(numwords < 2) asar_throw_error(0, error_type_block, error_id_spcblock_too_few_args);
1665
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if(numwords > 4) asar_throw_error(0, error_type_block, error_id_spcblock_too_many_args);
1666
1667
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 spcblock.destination = getnum(par);
1668 36 spcblock.type = spcblock_nspc;
1669
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 spcblock.macro_name = "";
1670
1671
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
36 if (spcblock.destination&~0xFFFF) asar_throw_error(0, error_type_block, error_id_snes_address_out_of_bounds, hex(spcblock.destination, 6).data());
1672
1673
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
36 if(numwords == 3)
1674 {
1675 if(!stricmp(word[2], "nspc")) spcblock.type = spcblock_nspc;
1676 else if(!stricmp(word[2], "custom")) asar_throw_error(0, error_type_block, error_id_custom_spcblock_missing_macro);
1677 else asar_throw_error(0, error_type_block, error_id_unknown_spcblock_type);
1678 }
1679
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
36 else if(numwords == 4)
1680 {
1681 if(!stricmp(word[2], "custom")) spcblock.type = spcblock_custom;
1682 else asar_throw_error(0, error_type_block, error_id_extra_spcblock_arg_for_type);
1683
1684 if(macros.exists(word[3]))
1685 {
1686 macrodata *macro = macros.find(word[3]);
1687 if(!macro->variadic) asar_throw_error(0, error_type_block, error_id_spcblock_macro_must_be_varadic);
1688 if(macro->numargs != 3) asar_throw_error(0, error_type_block, error_id_spcblock_macro_invalid_static_args);
1689 spcblock.macro_name = word[3];
1690 }
1691 else asar_throw_error(0, error_type_block, error_id_spcblock_macro_doesnt_exist);
1692 }
1693
1694
1/3
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
36 switch(spcblock.type)
1695 {
1696 36 case spcblock_nspc:
1697 36 spcblock.size_address=realsnespos;
1698
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 write2(0x0000);
1699
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 write2(spcblock.destination);
1700 36 snespos=(int)spcblock.destination;
1701 36 startpos=(int)spcblock.destination;
1702 36 spcblock.execute_address = -1u;
1703
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 add_addr_to_line(addrToLinePos);
1704 18 break;
1705 case spcblock_custom:
1706 //this is a todo that probably won't be ready for 1.9
1707 //mostly so we can leverage some cleanups we make in 2.0 for practicality
1708 asar_throw_error(0, error_type_block, error_id_spcblock_custom_types_incomplete);
1709 push_pc();
1710 spcblock.old_mapper = mapper;
1711 mapper = norom;
1712 break;
1713 default:
1714 asar_throw_error(0, error_type_fatal, error_id_internal_error, "invalid spcblock type");
1715 }
1716
1717
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 ns_backup = ns;
1718
3/6
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
36 ns = STR":SPCBLOCK:_" + ns_backup;
1719 36 in_spcblock = true;
1720 }
1721
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 34215 times.
34251 else if(is("endspcblock"))
1722 {
1723
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if(!in_spcblock) asar_throw_error(0, error_type_block, error_id_endspcblock_without_spcblock);
1724
1725
1/3
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
36 switch(spcblock.type)
1726 {
1727 36 case spcblock_nspc:
1728
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 24 times.
36 if (pass==2)
1729 {
1730
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
12 int pcpos=snestopc(spcblock.size_address&0xFFFFFF);
1731
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
12 if (pcpos<0) asar_throw_error(2, error_type_block, error_id_snes_address_doesnt_map_to_rom, hex((unsigned int)realsnespos, 6).data());
1732 12 int num=snespos-startpos;
1733
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
12 writeromdata_byte(pcpos, (unsigned char)num);
1734
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
12 writeromdata_byte(pcpos+1, (unsigned char)(num >> 8));
1735 }
1736
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 18 times.
36 if (numwords == 3)
1737 {
1738
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if (strcmp(par, "execute")) asar_throw_error(0, error_type_null, error_id_invalid_endspcblock_arg, par);
1739 else
1740 {
1741
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write2(0x0000);
1742
2/4
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
18 write2((unsigned int)getnum(word[2]));
1743 }
1744 }
1745
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 else if (numwords != 1)
1746 {
1747 asar_throw_error(0, error_type_null, error_id_unknown_endspcblock_format);
1748 }
1749
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 else if(spcblock.execute_address != -1u)
1750 {
1751 // Legacy case, will be removed with Asar 2.0.
1752 write2(0x0000);
1753 write2((unsigned int)spcblock.execute_address);
1754 }
1755 18 break;
1756 case spcblock_custom:
1757 mapper = spcblock.old_mapper;
1758 pop_pc();
1759 break;
1760 default:
1761 asar_throw_error(0, error_type_fatal, error_id_internal_error, "invalid spcblock type");
1762 }
1763
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 ns = ns_backup;
1764 36 in_spcblock = false;
1765 }
1766 // Remember to also remove execute_address entirely from spcblock once removing this deprecated command.
1767
5/6
✓ Branch 0 taken 32754 times.
✓ Branch 1 taken 1461 times.
✓ Branch 2 taken 19467 times.
✓ Branch 3 taken 13287 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 14019 times.
34215 else if (is1("startpos"))
1768 {
1769 if(!in_spcblock) asar_throw_error(0, error_type_block, error_id_startpos_without_spcblock);
1770 spcblock.execute_address=getnum(par);
1771 }
1772
6/6
✓ Branch 0 taken 32754 times.
✓ Branch 1 taken 1461 times.
✓ Branch 2 taken 19467 times.
✓ Branch 3 taken 13287 times.
✓ Branch 4 taken 135 times.
✓ Branch 5 taken 13884 times.
34215 else if (is1("base"))
1773 {
1774
4/4
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 90 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 90 times.
270 if (!stricmp(par, "off"))
1775 {
1776 90 snespos=realsnespos;
1777 90 startpos=realstartpos;
1778 90 snespos_valid = realsnespos >= 0;
1779 90 return;
1780 }
1781
1/2
✓ Branch 0 taken 180 times.
✗ Branch 1 not taken.
180 unsigned int num=getnum(par);
1782
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 180 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
180 if (forwardlabel) asar_throw_error(0, error_type_block, error_id_base_label_invalid);
1783
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 180 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
180 if (num&~0xFFFFFF) asar_throw_error(1, error_type_block, error_id_snes_address_out_of_bounds, hex((unsigned int)num).data());
1784 180 snespos=(int)num;
1785 180 startpos=(int)num;
1786 180 optimizeforbank=-1;
1787 180 snespos_valid = realsnespos >= 0;
1788 }
1789
6/6
✓ Branch 0 taken 32484 times.
✓ Branch 1 taken 1461 times.
✓ Branch 2 taken 19332 times.
✓ Branch 3 taken 13152 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 13866 times.
33945 else if (is1("dpbase"))
1790 {
1791
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 unsigned int num=(int)getnum(par);
1792
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if (forwardlabel) asar_throw_error(0, error_type_block, error_id_base_label_invalid);
1793
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
36 if (num&~0xFF00) asar_throw_error(1, error_type_block, error_id_bad_dp_base, hex((unsigned int)num, 6).data());
1794 36 dp_base = (int)num;
1795 }
1796
6/6
✓ Branch 0 taken 396 times.
✓ Branch 1 taken 33513 times.
✓ Branch 2 taken 198 times.
✓ Branch 3 taken 198 times.
✓ Branch 4 taken 117 times.
✓ Branch 5 taken 13749 times.
33909 else if (is2("optimize"))
1797 {
1798
4/4
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 72 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 72 times.
234 if (!stricmp(par, "dp"))
1799 {
1800
4/4
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 27 times.
90 if (!stricmp(word[2], "none"))
1801 {
1802 36 optimize_dp = optimize_dp_flag::NONE;
1803 36 return;
1804 }
1805
4/4
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 18 times.
54 if (!stricmp(word[2], "ram"))
1806 {
1807 18 optimize_dp = optimize_dp_flag::RAM;
1808 18 return;
1809 }
1810
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
36 if (!stricmp(word[2], "always"))
1811 {
1812 36 optimize_dp = optimize_dp_flag::ALWAYS;
1813 36 return;
1814 }
1815 asar_throw_error(1, error_type_block, error_id_bad_dp_optimize, word[2]);
1816 }
1817
2/4
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
144 if (!stricmp(par, "address"))
1818 {
1819
4/4
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 54 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 54 times.
144 if (!stricmp(word[2], "default"))
1820 {
1821 36 optimize_address = optimize_address_flag::DEFAULT;
1822 36 return;
1823 }
1824
4/4
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 27 times.
✓ Branch 3 taken 27 times.
108 if (!stricmp(word[2], "ram"))
1825 {
1826 54 optimize_address = optimize_address_flag::RAM;
1827 54 return;
1828 }
1829
2/4
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
54 if (!stricmp(word[2], "mirrors"))
1830 {
1831 54 optimize_address = optimize_address_flag::MIRRORS;
1832 54 return;
1833 }
1834 asar_throw_error(1, error_type_block, error_id_bad_address_optimize, word[2]);
1835 }
1836 asar_throw_error(1, error_type_block, error_id_bad_optimize, par);
1837 }
1838
6/6
✓ Branch 0 taken 32448 times.
✓ Branch 1 taken 1227 times.
✓ Branch 2 taken 19314 times.
✓ Branch 3 taken 13134 times.
✓ Branch 4 taken 27 times.
✓ Branch 5 taken 13722 times.
33675 else if (is1("bank"))
1839 {
1840
4/4
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 18 times.
54 if (!stricmp(par, "auto"))
1841 {
1842 18 optimizeforbank=-1;
1843 18 return;
1844 }
1845
4/4
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
36 if (!stricmp(par, "noassume"))
1846 {
1847 18 optimizeforbank=0x140;
1848 18 return;
1849 }
1850
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 unsigned int num=getnum(par);
1851 //if (forwardlabel) error(0, "bank Label is not valid");
1852 //if (foundlabel) num>>=16;
1853
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 if (num&~0x0000FF) asar_throw_error(1, error_type_block, error_id_snes_address_out_of_bounds, hex((unsigned int)num, 6).data());
1854 18 optimizeforbank=(int)num;
1855 }
1856
10/10
✓ Branch 0 taken 33603 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 30399 times.
✓ Branch 3 taken 3204 times.
✓ Branch 4 taken 29391 times.
✓ Branch 5 taken 1008 times.
✓ Branch 6 taken 17784 times.
✓ Branch 7 taken 11607 times.
✓ Branch 8 taken 2250 times.
✓ Branch 9 taken 11472 times.
33621 else if (is("freespace") || is("freecode") || is("freedata") || is("segment"))
1857 {
1858
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4500 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4500 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
1859 2250 string parstr;
1860
3/4
✓ Branch 0 taken 486 times.
✓ Branch 1 taken 4014 times.
✓ Branch 2 taken 243 times.
✗ Branch 3 not taken.
4500 if (numwords==1) parstr="\n";//crappy hack: impossible character to cut out extra commas
1861
2/4
✓ Branch 0 taken 4014 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2007 times.
✗ Branch 3 not taken.
4014 else if (numwords==2) parstr=word[1];
1862 else asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1863
5/8
✓ Branch 0 taken 3204 times.
✓ Branch 1 taken 1296 times.
✓ Branch 2 taken 1602 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1602 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1602 times.
✗ Branch 7 not taken.
6102 if (is("freecode")) parstr=STR"ram,"+parstr;
1864
5/8
✓ Branch 0 taken 1008 times.
✓ Branch 1 taken 3492 times.
✓ Branch 2 taken 504 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 504 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 504 times.
✗ Branch 7 not taken.
5004 if (is("freedata")) parstr=STR"noram,"+parstr;
1865
5/8
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 4230 times.
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 135 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 135 times.
✗ Branch 7 not taken.
4635 if (is("segment")) parstr = STR "norats," + parstr;
1866
1/2
✓ Branch 0 taken 4500 times.
✗ Branch 1 not taken.
4500 autoptr<char**> pars=split(parstr.temp_raw(), ',');
1867 4500 unsigned char fsbyte = default_freespacebyte;
1868 2250 bool fixedpos=false;
1869 2250 bool align=false;
1870 2250 bool leakwarn=true;
1871 2250 bool write_rats=true;
1872 2250 int target_bank = -3;
1873
1/2
✓ Branch 0 taken 2250 times.
✗ Branch 1 not taken.
2250 string pin_to_freespace = "";
1874 2250 int search_start_pos = -1;
1875
1876
2/2
✓ Branch 0 taken 9018 times.
✓ Branch 1 taken 4500 times.
13518 for (int i=0;pars[i];i++)
1877 {
1878
2/2
✓ Branch 0 taken 8532 times.
✓ Branch 1 taken 486 times.
9018 if (pars[i][0]=='\n') {}
1879
4/4
✓ Branch 0 taken 5868 times.
✓ Branch 1 taken 2664 times.
✓ Branch 2 taken 1602 times.
✓ Branch 3 taken 2664 times.
8532 else if (!stricmp(pars[i], "ram"))
1880 {
1881
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3204 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3204 if (target_bank!=-3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1882 1602 target_bank = -2;
1883 }
1884
4/4
✓ Branch 0 taken 3168 times.
✓ Branch 1 taken 2160 times.
✓ Branch 2 taken 504 times.
✓ Branch 3 taken 2160 times.
5328 else if (!stricmp(pars[i], "noram"))
1885 {
1886
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1008 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1008 if (target_bank!=-3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1887 504 target_bank = -1;
1888 }
1889
4/4
✓ Branch 0 taken 2178 times.
✓ Branch 1 taken 2142 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 2142 times.
4320 else if (!stricmp(pars[i], "static"))
1890 {
1891
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if (fixedpos) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1892 18 fixedpos=true;
1893 }
1894
4/4
✓ Branch 0 taken 2160 times.
✓ Branch 1 taken 2124 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 2124 times.
4284 else if (!stricmp(pars[i], "align"))
1895 {
1896
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if (align) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1897 18 align=true;
1898 }
1899
4/4
✓ Branch 0 taken 4014 times.
✓ Branch 1 taken 234 times.
✓ Branch 2 taken 1890 times.
✓ Branch 3 taken 234 times.
4248 else if (!stricmp(pars[i], "cleaned"))
1900 {
1901
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3780 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3780 if (!leakwarn) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1902 1890 leakwarn=false;
1903 }
1904
4/4
✓ Branch 0 taken 369 times.
✓ Branch 1 taken 99 times.
✓ Branch 2 taken 99 times.
✓ Branch 3 taken 135 times.
468 else if (!stricmp(pars[i], "norats"))
1905 {
1906 135 write_rats=false;
1907 }
1908
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 108 times.
198 else if (stribegin(pars[i], "bank="))
1909 {
1910
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
90 if(target_bank != -3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1911
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 target_bank = getnum(pars[i] + 5);
1912
2/6
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
90 if(foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
1913 }
1914
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 72 times.
108 else if (stribegin(pars[i], "start="))
1915 {
1916
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 search_start_pos = getnum(pars[i] + 6);
1917
2/6
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
36 if(foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
1918 }
1919
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 else if (stribegin(pars[i], "pin="))
1920 {
1921 // TODO: should we handle posneg labels here too?
1922
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
72 string pin_to = pars[i] + 4;
1923 72 const char* pin_to_c = pin_to.data();
1924
2/4
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 pin_to_freespace = labelname(&pin_to_c);
1925
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
72 if(*pin_to_c) asar_throw_error(0, error_type_block, error_id_invalid_label_name);
1926 // this is to throw an "undefined label" error with the proper callstack
1927
4/6
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
96 if(pass) labelval(pin_to);
1928 72 }
1929 else if (stribegin(pars[i], "cleanbyte="))
1930 {
1931 fsbyte = getnum(pars[i] + strlen("cleanbyte="));
1932 if(foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
1933 }
1934 else
1935 {
1936 // for backwards compat i guess
1937 fsbyte = (unsigned char)getnum(pars[i]);
1938 }
1939 }
1940
3/4
✓ Branch 0 taken 2250 times.
✓ Branch 1 taken 2250 times.
✓ Branch 2 taken 99 times.
✗ Branch 3 not taken.
4500 if(target_bank == -3 && !write_rats) target_bank = -1;
1941
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4401 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4401 if(target_bank == -3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1942 // no point specifying anything about cleaning when not writing a rats tag
1943
4/8
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 4230 times.
✓ Branch 2 taken 270 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 135 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
4500 if(!write_rats && (!leakwarn || fixedpos)) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1944
2/2
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 2115 times.
2250 if(!write_rats) leakwarn = false;
1945
1/2
✓ Branch 0 taken 2250 times.
✗ Branch 1 not taken.
4500 freespaceend();
1946
1/2
✓ Branch 0 taken 2250 times.
✗ Branch 1 not taken.
4500 freespaceid=getfreespaceid();
1947
1/2
✓ Branch 0 taken 2250 times.
✗ Branch 1 not taken.
2250 freespace_data& thisfs = freespaces[freespaceid];
1948 4500 thisfs.cleanbyte = fsbyte;
1949
1950
1/2
✓ Branch 0 taken 2250 times.
✗ Branch 1 not taken.
4500 thisfs.pin_target = pin_to_freespace;
1951
5/6
✓ Branch 0 taken 2286 times.
✓ Branch 1 taken 2214 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 2214 times.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
4500 if(pin_to_freespace) thisfs.pin_target_ns = ns;
1952 4500 thisfs.write_rats = write_rats;
1953 4500 thisfs.search_start = search_start_pos;
1954 4500 thisfs.bank = target_bank;
1955 4500 thisfs.flag_align = align;
1956
1957
2/2
✓ Branch 0 taken 1500 times.
✓ Branch 1 taken 3000 times.
4500 if (pass==0) snespos=0;
1958
2/2
✓ Branch 0 taken 1500 times.
✓ Branch 1 taken 3000 times.
4500 if (pass==1)
1959 {
1960
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1488 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
1500 if (fixedpos && thisfs.orgpos == -2)
1961 {
1962 thisfs.pos = 0;
1963 thisfs.leaked = false;//mute some other errors
1964 asar_throw_error(1, error_type_block, error_id_static_freespace_autoclean);
1965 }
1966 1500 snespos = 0;
1967 }
1968
2/2
✓ Branch 0 taken 1500 times.
✓ Branch 1 taken 3000 times.
4500 if (pass==2)
1969 {
1970
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1488 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
1500 if (fixedpos && thisfs.orgpos == -2) return;//to kill some errors (supposedly????)
1971 1500 snespos=thisfs.pos;
1972
3/6
✓ Branch 0 taken 1344 times.
✓ Branch 1 taken 156 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1344 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1500 if (thisfs.leaked && leakwarn) asar_throw_warning(2, warning_id_freespace_leaked);
1973
2/2
✓ Branch 0 taken 750 times.
✓ Branch 1 taken 750 times.
1500 freespaceuse += (write_rats ? 8 : 0) + thisfs.len;
1974
1975 // add a mapping for the start of the rats tag
1976
3/4
✓ Branch 0 taken 1410 times.
✓ Branch 1 taken 90 times.
✓ Branch 2 taken 1410 times.
✗ Branch 3 not taken.
1500 if (write_rats) add_addr_to_line(snespos-8);
1977 }
1978 4500 thisfs.is_static = fixedpos;
1979
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 4500 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
4500 if (snespos < 0 && mapper == sa1rom) asar_throw_error(pass, error_type_fatal, error_id_no_freespace_in_mapped_banks, dec(thisfs.len).data());
1980
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 4500 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4500 if (snespos < 0) asar_throw_error(pass, error_type_fatal, error_id_no_freespace, dec(thisfs.len).data());
1981
2/2
✓ Branch 0 taken 2250 times.
✓ Branch 1 taken 2250 times.
4500 bytes+=write_rats ? 8 : 0;
1982 4500 freespacestart=snespos;
1983 4500 startpos=snespos;
1984 4500 realstartpos=snespos;
1985 4500 realsnespos=snespos;
1986 4500 optimizeforbank=-1;
1987
2/2
✓ Branch 0 taken 2250 times.
✓ Branch 1 taken 2250 times.
4500 ratsmetastate=write_rats ? ratsmeta_allow : ratsmeta_ban;
1988 4500 snespos_valid = true;
1989 // check this at the very end so that snespos gets set properly, to
1990 // prevent spurious errors later
1991 //...i guess this can still cause bankcross errors if the old freespace
1992 //happened to be very close to the end of a bank or something, but
1993 //whatever
1994
7/8
✓ Branch 0 taken 1500 times.
✓ Branch 1 taken 3000 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 1488 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
4500 if (pass == 2 && fixedpos && thisfs.orgpos > 0 && thisfs.len > thisfs.orglen)
1995
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 asar_throw_error(2, error_type_block, error_id_static_freespace_growing);
1996
3/6
✓ Branch 0 taken 2247 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2247 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2247 times.
✗ Branch 5 not taken.
4512 }
1997
6/6
✓ Branch 0 taken 28380 times.
✓ Branch 1 taken 741 times.
✓ Branch 2 taken 17280 times.
✓ Branch 3 taken 11100 times.
✓ Branch 4 taken 63 times.
✓ Branch 5 taken 11409 times.
29121 else if (is1("prot"))
1998 {
1999
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
126 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2000
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
126 if (!ratsmetastate) asar_throw_error(2, error_type_block, error_id_prot_not_at_freespace_start);
2001
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 90 times.
126 if (ratsmetastate==ratsmeta_used) step(-5);
2002 int num;
2003
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 autoptr<char**> pars=qpsplit(par, ',', &num);
2004
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 verify_paren(pars);
2005
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('P');
2006
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('R');
2007
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('O');
2008
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('T');
2009
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
126 if (num * 3 > 255) asar_throw_error(0, error_type_block, error_id_prot_too_many_entries);
2010
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 write1((unsigned int)(num*3));
2011
2/2
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 126 times.
288 for (int i=0;i<num;i++)
2012 {
2013 //int num=getnum(pars[i]);
2014 162 const char * labeltest=pars[i];
2015
1/2
✓ Branch 0 taken 81 times.
✗ Branch 1 not taken.
81 string testlabel = labeltest;
2016
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 snes_label lblval = labelval(&labeltest);
2017
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 162 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
162 if (*labeltest) asar_throw_error(0, error_type_block, error_id_label_not_found, testlabel.data());
2018
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 write3(lblval.pos);
2019
3/4
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 108 times.
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
162 if (pass==1) freespaces[lblval.freespace_id].leaked = false;
2020 162 }
2021
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('S');
2022
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('T');
2023
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('O');
2024
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('P');
2025
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1(0);
2026 126 ratsmetastate=ratsmeta_used;
2027
2028
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 add_addr_to_line(addrToLinePos);
2029 126 }
2030
9/10
✓ Branch 0 taken 28254 times.
✓ Branch 1 taken 741 times.
✓ Branch 2 taken 28254 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 162 times.
✓ Branch 5 taken 28833 times.
✓ Branch 6 taken 54 times.
✓ Branch 7 taken 108 times.
✓ Branch 8 taken 27 times.
✓ Branch 9 taken 11382 times.
28995 else if (is1("autoclean") || is2("autoclean"))
2031 {
2032
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
54 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2033
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 if (numwords==3)
2034 {
2035 54 const char * labeltest = word[2];
2036
1/2
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
27 string testlabel = labeltest;
2037
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 if(!stricmpwithlower(word[1], "dl")) {
2038
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 handle_autoclean(testlabel, -1, snespos);
2039
4/6
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 36 times.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 54 times.
✗ Branch 5 not taken.
54 write3(pass==2 ? getnum(testlabel.data()) : 0);
2040
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 add_addr_to_line(addrToLinePos);
2041 } else {
2042 // other ones are handled in arch-65816
2043 asar_throw_error(0, error_type_block, error_id_broken_autoclean);
2044 }
2045 54 }
2046 else if (pass==0) removerats((int)getnum(word[1]), default_freespacebyte);
2047 }
2048
5/6
✓ Branch 0 taken 28254 times.
✓ Branch 1 taken 687 times.
✓ Branch 2 taken 17217 times.
✓ Branch 3 taken 11037 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 11382 times.
28941 else if (is1("freespacebyte"))
2049 {
2050 default_freespacebyte = getnum(word[1]);
2051 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2052 }
2053
6/6
✓ Branch 0 taken 453 times.
✓ Branch 1 taken 28488 times.
✓ Branch 2 taken 225 times.
✓ Branch 3 taken 228 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11373 times.
28941 else if (is0("pushpc"))
2054 {
2055
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 verifysnespos();
2056
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].arch=arch;
2057
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snespos=snespos;
2058
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snesstart=startpos;
2059
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snesposreal=realsnespos;
2060
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snesstartreal=realstartpos;
2061
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].freeid=freespaceid;
2062
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].freest=freespacestart;
2063 18 pushpcnum++;
2064 18 snespos=(int)0xFFFFFFFF;
2065 18 startpos= (int)0xFFFFFFFF;
2066 18 realsnespos= (int)0xFFFFFFFF;
2067 18 realstartpos= (int)0xFFFFFFFF;
2068 18 snespos_valid = false;
2069 }
2070
6/6
✓ Branch 0 taken 435 times.
✓ Branch 1 taken 28488 times.
✓ Branch 2 taken 216 times.
✓ Branch 3 taken 219 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11364 times.
28923 else if (is0("pullpc"))
2071 {
2072
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if (!pushpcnum) asar_throw_error(0, error_type_block, error_id_pullpc_without_pushpc);
2073 18 pushpcnum--;
2074
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 freespaceend();
2075
3/6
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 if (arch != pushpc[pushpcnum].arch) asar_throw_error(0, error_type_block, error_id_pullpc_different_arch);
2076
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 snespos=pushpc[pushpcnum].snespos;
2077
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 startpos=pushpc[pushpcnum].snesstart;
2078
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 realsnespos=pushpc[pushpcnum].snesposreal;
2079
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 realstartpos=pushpc[pushpcnum].snesstartreal;
2080
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 freespaceid=pushpc[pushpcnum].freeid;
2081
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 freespacestart=pushpc[pushpcnum].freest;
2082 18 snespos_valid = true;
2083 }
2084
6/6
✓ Branch 0 taken 417 times.
✓ Branch 1 taken 28488 times.
✓ Branch 2 taken 207 times.
✓ Branch 3 taken 210 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11355 times.
28905 else if (is0("pushbase"))
2085 {
2086
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 basestack[basestacknum] = snespos;
2087 18 basestacknum++;
2088 }
2089
6/6
✓ Branch 0 taken 399 times.
✓ Branch 1 taken 28488 times.
✓ Branch 2 taken 198 times.
✓ Branch 3 taken 201 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11346 times.
28887 else if (is0("pullbase"))
2090 {
2091
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if (!basestacknum) asar_throw_error(0, error_type_block, error_id_pullbase_without_pushbase);
2092 18 basestacknum--;
2093
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 snespos = basestack[basestacknum];
2094
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 startpos = basestack[basestacknum];
2095
2096
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if (snespos != realstartpos)
2097 {
2098 18 optimizeforbank = -1;
2099 }
2100 }
2101
6/6
✓ Branch 0 taken 381 times.
✓ Branch 1 taken 28488 times.
✓ Branch 2 taken 189 times.
✓ Branch 3 taken 192 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 11328 times.
28869 else if (is0("pushns"))
2102 {
2103
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2104
2/4
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
36 pushns[pushnsnum].ns = ns;
2105
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 36 times.
72 for(int i = 0; i < namespace_list.count; i++)
2106 {
2107
3/6
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
36 pushns[pushnsnum].namespace_list.append(namespace_list[i]);
2108 }
2109
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 pushns[pushnsnum].nested_namespaces = nested_namespaces;
2110 36 pushnsnum++;
2111
2112
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 namespace_list.reset();
2113
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 ns = "";
2114 36 nested_namespaces = false;
2115 }
2116
6/6
✓ Branch 0 taken 345 times.
✓ Branch 1 taken 28488 times.
✓ Branch 2 taken 171 times.
✓ Branch 3 taken 174 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 11310 times.
28833 else if (is0("pullns"))
2117 {
2118
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2119
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if (!pushnsnum) asar_throw_error(0, error_type_block, error_id_pullns_without_pushns);
2120 36 pushnsnum--;
2121
2/4
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
36 ns = pushns[pushnsnum].ns;
2122
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 nested_namespaces = pushns[pushnsnum].nested_namespaces;
2123
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 namespace_list.reset();
2124
4/4
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 18 times.
108 for(int i = 0; i < pushns[pushnsnum].namespace_list.count; i++)
2125 {
2126
3/6
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
72 namespace_list.append(pushns[pushnsnum].namespace_list[i]);
2127 }
2128 }
2129
9/10
✓ Branch 0 taken 28254 times.
✓ Branch 1 taken 543 times.
✓ Branch 2 taken 27873 times.
✓ Branch 3 taken 381 times.
✓ Branch 4 taken 108 times.
✓ Branch 5 taken 28308 times.
✓ Branch 6 taken 108 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 246 times.
✓ Branch 9 taken 11064 times.
28797 else if (is1("namespace") || is2("namespace"))
2130 {
2131
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
489 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2132 246 bool leave = false;
2133
1/2
✓ Branch 0 taken 489 times.
✗ Branch 1 not taken.
489 if (par)
2134 {
2135
4/4
✓ Branch 0 taken 315 times.
✓ Branch 1 taken 174 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 171 times.
489 if (!stricmp(par, "off"))
2136 {
2137
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 144 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
144 if (word[2]) asar_throw_error(0, error_type_block, error_id_invalid_namespace_use);
2138 72 leave = true;
2139 }
2140
4/4
✓ Branch 0 taken 225 times.
✓ Branch 1 taken 120 times.
✓ Branch 2 taken 54 times.
✓ Branch 3 taken 117 times.
345 else if (!stricmp(par, "nested"))
2141 {
2142
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if (!word[2]) asar_throw_error(0, error_type_block, error_id_invalid_namespace_use);
2143
4/4
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 27 times.
✓ Branch 3 taken 27 times.
108 else if (!stricmp(word[2], "on")) nested_namespaces = true;
2144
2/4
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
54 else if (!stricmp(word[2], "off")) nested_namespaces = false;
2145 }
2146 else
2147 {
2148
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 237 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
237 if (word[2]) asar_throw_error(0, error_type_block, error_id_invalid_namespace_use);
2149
1/2
✓ Branch 0 taken 237 times.
✗ Branch 1 not taken.
237 const char * tmpstr= safedequote(par);
2150
3/7
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 156 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 81 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
237 if (!confirmname(tmpstr)) asar_throw_error(0, error_type_block, error_id_invalid_namespace_name);
2151
2/2
✓ Branch 0 taken 93 times.
✓ Branch 1 taken 144 times.
237 if (!nested_namespaces)
2152 {
2153
1/2
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
93 namespace_list.reset();
2154 }
2155
2/4
✓ Branch 0 taken 120 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 120 times.
✗ Branch 3 not taken.
237 namespace_list.append(tmpstr);
2156 }
2157 }
2158 else
2159 {
2160 leave = true;
2161 }
2162
2163
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 174 times.
246 if (leave)
2164 {
2165
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 36 times.
144 if (nested_namespaces)
2166 {
2167
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 namespace_list.remove(namespace_list.count - 1);
2168 }
2169 else
2170 {
2171
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 namespace_list.reset();
2172 }
2173 }
2174
2175 // recompute ns
2176
1/2
✓ Branch 0 taken 246 times.
✗ Branch 1 not taken.
246 ns = "";
2177
2/2
✓ Branch 0 taken 579 times.
✓ Branch 1 taken 489 times.
1068 for (int i = 0; i < namespace_list.count; i++)
2178 {
2179
2/4
✓ Branch 0 taken 291 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 291 times.
✗ Branch 3 not taken.
579 ns += namespace_list[i];
2180
1/2
✓ Branch 0 taken 291 times.
✗ Branch 1 not taken.
579 ns += "_";
2181 }
2182 }
2183 #ifdef SANDBOX
2184 else if (is("incsrc") || is("incbin") || is("table"))
2185 {
2186 asar_throw_error(0, error_type_block, error_id_command_disabled);
2187 }
2188 #endif
2189
6/6
✓ Branch 0 taken 27873 times.
✓ Branch 1 taken 435 times.
✓ Branch 2 taken 10839 times.
✓ Branch 3 taken 17034 times.
✓ Branch 4 taken 9048 times.
✓ Branch 5 taken 2016 times.
28308 else if (is1("incsrc"))
2190 {
2191 9048 string name;
2192 // RPG Hacker: Should this also throw on absolute paths?
2193 // E.g., on something starting with C:/ or whatever.
2194
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 24267 times.
24285 if (strchr(par, '\\'))
2195 {
2196
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_platform_paths);
2197 }
2198
2/4
✓ Branch 0 taken 24267 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9039 times.
✗ Branch 3 not taken.
24267 name=safedequote(par);
2199
2/2
✓ Branch 0 taken 474 times.
✓ Branch 1 taken 23793 times.
24267 assemblefile(name);
2200 24285 }
2201
6/6
✓ Branch 0 taken 3588 times.
✓ Branch 1 taken 435 times.
✓ Branch 2 taken 1791 times.
✓ Branch 3 taken 1797 times.
✓ Branch 4 taken 108 times.
✓ Branch 5 taken 1908 times.
4023 else if (is1("incbin"))
2202 {
2203 int len;
2204 108 int start=0;
2205 108 int end=0;
2206
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 90 times.
216 if (strqchr(par, ':'))
2207 {
2208 63 char * lengths=strqchr(par, ':');
2209 126 *lengths=0;
2210 126 lengths++;
2211
2212
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 char* split = strqpstr(lengths, "..");
2213
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
126 if(!split) asar_throw_error(0, error_type_block, error_id_broken_incbin);
2214
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 string start_str(lengths, split-lengths);
2215
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if(start_str == "") asar_throw_error(0, error_type_block, error_id_broken_incbin);
2216
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 start = getnum(start_str);
2217
5/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 72 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
108 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2218
1/2
✓ Branch 0 taken 45 times.
✗ Branch 1 not taken.
90 string end_str(split+2);
2219
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
90 if(end_str == "") asar_throw_error(0, error_type_block, error_id_broken_incbin);
2220
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 end = getnum(end_str);
2221
5/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 54 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
90 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2222 126 }
2223
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 const char* current_file = get_current_file_name();
2224 81 string name;
2225 // RPG Hacker: Should this also throw on absolute paths?
2226 // E.g., on something starting with C:/ or whatever.
2227
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 144 times.
162 if (strchr(par, '\\'))
2228 {
2229
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_platform_paths);
2230 }
2231
2/4
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
144 name = safedequote(par);
2232 char * data;//I couldn't find a way to get this into an autoptr
2233
6/10
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 108 times.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 36 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 36 times.
144 if (!readfile(name, current_file, &data, &len)) asar_throw_error(0, error_type_block, vfile_error_to_error_id(asar_get_last_io_error()), name.data());
2234
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 36 times.
108 autoptr<char*> datacopy=data;
2235
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 72 times.
108 if (!end) end=len;
2236
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
108 if(start < 0) asar_throw_error(0, error_type_block, error_id_file_offset_out_of_bounds, dec(start).data(), name.data());
2237
3/10
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 108 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 108 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
108 if (end < start || end > len || end < 0) asar_throw_error(0, error_type_block, error_id_file_offset_out_of_bounds, dec(end).data(), name.data());
2238
2239
3/4
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 198 times.
✓ Branch 3 taken 108 times.
306 for (int i=start;i<end;i++) write1((unsigned int)data[i]);
2240
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 add_addr_to_line(addrToLinePos);
2241 162 }
2242
6/6
✓ Branch 0 taken 2043 times.
✓ Branch 1 taken 1764 times.
✓ Branch 2 taken 1017 times.
✓ Branch 3 taken 1026 times.
✓ Branch 4 taken 990 times.
✓ Branch 5 taken 918 times.
3807 else if (is("skip") || is("fill"))
2243 {
2244
5/8
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1962 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
1980 if(numwords != 2 && numwords != 3 && numwords != 5) asar_throw_error(0, error_type_block, error_id_unknown_command);
2245
5/8
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1962 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
1980 if(numwords > 2 && stricmp(word[1], "align")) asar_throw_error(0, error_type_block, error_id_unknown_command);
2246
5/8
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1962 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
1980 if(numwords == 5 && stricmp(word[3], "offset")) asar_throw_error(0, error_type_block, error_id_unknown_command);
2247 int amount;
2248
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1962 times.
1980 if(numwords > 2)
2249 {
2250
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 int alignment = getnum(word[2]);
2251
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 if(foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2252 9 int offset = 0;
2253
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if(numwords==5)
2254 {
2255
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 offset = getnum(word[4]);
2256
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 if(foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2257 }
2258
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if(alignment > 0x800000) asar_throw_error(0, error_type_block, error_id_alignment_too_big);
2259
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if(alignment < 1) asar_throw_error(0, error_type_block, error_id_alignment_too_small);
2260
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if(alignment & (alignment-1)) asar_throw_error(0, error_type_block, error_id_invalid_alignment);
2261 // i just guessed this formula but it seems to work
2262 18 amount = (alignment - ((snespos - offset) & (alignment-1))) & (alignment-1);
2263 }
2264 else
2265 {
2266
1/2
✓ Branch 0 taken 1962 times.
✗ Branch 1 not taken.
1962 amount = (int)getnum(par);
2267
5/6
✓ Branch 0 taken 981 times.
✓ Branch 1 taken 981 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
1962 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2268 }
2269
2/2
✓ Branch 0 taken 1764 times.
✓ Branch 1 taken 198 times.
1962 if(is("skip")) step(amount);
2270 else
2271 {
2272
3/4
✓ Branch 0 taken 1221210 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1221210 times.
✓ Branch 3 taken 198 times.
1221408 for(int i=0; i < amount; i++) write1(fillbyte[i%12]);
2273
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 add_addr_to_line(addrToLinePos);
2274 }
2275
2276 }
2277
6/6
✓ Branch 0 taken 309 times.
✓ Branch 1 taken 1518 times.
✓ Branch 2 taken 153 times.
✓ Branch 3 taken 156 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 909 times.
1827 else if (is0("cleartable"))
2278 {
2279
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 cleartable();
2280 }
2281
6/6
✓ Branch 0 taken 291 times.
✓ Branch 1 taken 1518 times.
✓ Branch 2 taken 144 times.
✓ Branch 3 taken 147 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 900 times.
1809 else if (is0("pushtable"))
2282 {
2283
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 tablestack.append(thetable);
2284 }
2285
6/6
✓ Branch 0 taken 273 times.
✓ Branch 1 taken 1518 times.
✓ Branch 2 taken 135 times.
✓ Branch 3 taken 138 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 891 times.
1791 else if (is0("pulltable"))
2286 {
2287
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if (tablestack.count <= 0) asar_throw_error(0, error_type_block, error_id_pulltable_without_table);
2288
2/4
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
18 thetable=tablestack[tablestack.count-1];
2289
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 tablestack.remove(tablestack.count-1);
2290 }
2291
6/6
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 1665 times.
✓ Branch 2 taken 54 times.
✓ Branch 3 taken 54 times.
✓ Branch 4 taken 54 times.
✓ Branch 5 taken 837 times.
1773 else if (is("function") && numwords >= 3)
2292 {
2293
3/6
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 54 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
108 if (stricmp(word[2], "=")) asar_throw_error(0, error_type_block, error_id_broken_function_declaration);
2294
2/6
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 108 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
108 if (!confirmqpar(word[1])) asar_throw_error(0, error_type_block, error_id_broken_function_declaration);
2295
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 string line=word[1];
2296
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 line.qnormalize();
2297 108 char * startpar=strqchr(line.data(), '(');
2298
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if (!startpar) asar_throw_error(0, error_type_block, error_id_broken_function_declaration);
2299 108 *startpar=0;
2300
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
108 startpar++;
2301
3/7
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 36 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
108 if (!confirmname(line)) asar_throw_error(0, error_type_block, error_id_invalid_function_name);
2302 108 char * endpar=strqchr(startpar, ')');
2303 //confirmqpar requires that all parentheses are matched, and a starting one exists, therefore it is harmless to not check for nulls
2304
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if (endpar[1]) asar_throw_error(0, error_type_block, error_id_broken_function_declaration);
2305 108 *endpar=0;
2306
2307 54 string pars;
2308
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 108 times.
216 for(int i = 3; i < numwords; i++){
2309
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if(i > 3) pars += " ";
2310
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 pars += word[i];
2311 }
2312
2313
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 createuserfunc(line, startpar, pars.data());
2314 108 }
2315
6/6
✓ Branch 0 taken 1410 times.
✓ Branch 1 taken 255 times.
✓ Branch 2 taken 708 times.
✓ Branch 3 taken 702 times.
✓ Branch 4 taken 438 times.
✓ Branch 5 taken 399 times.
1665 else if (is1("print"))
2316 {
2317
2/2
✓ Branch 0 taken 852 times.
✓ Branch 1 taken 18 times.
870 string out = handle_print(par);
2318
3/4
✓ Branch 0 taken 284 times.
✓ Branch 1 taken 568 times.
✓ Branch 2 taken 284 times.
✗ Branch 3 not taken.
852 if (pass==2) print(out);
2319 852 }
2320
6/6
✓ Branch 0 taken 540 times.
✓ Branch 1 taken 255 times.
✓ Branch 2 taken 270 times.
✓ Branch 3 taken 270 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 390 times.
795 else if (is1("reset"))
2321 {
2322 if(0);
2323
2/4
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
18 else if (!stricmp(par, "bytes")) bytes=0;
2324 else if (!stricmp(par, "freespaceuse")) freespaceuse=0;
2325 else asar_throw_error(2, error_type_block, error_id_unknown_variable);
2326 }
2327
15/18
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 255 times.
✓ Branch 2 taken 468 times.
✓ Branch 3 taken 54 times.
✓ Branch 4 taken 468 times.
✓ Branch 5 taken 255 times.
✓ Branch 6 taken 468 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 468 times.
✓ Branch 9 taken 255 times.
✓ Branch 10 taken 468 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 468 times.
✓ Branch 13 taken 255 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 468 times.
✓ Branch 16 taken 27 times.
✓ Branch 17 taken 363 times.
777 else if (is1("padbyte") || is1("padword") || is1("padlong") || is1("paddword"))
2328 {
2329 27 int len = 0;
2330
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 if (is("padbyte")) len=1;
2331
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
54 if (is("padword")) len=2;
2332
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
54 if (is("padlong")) len=3;
2333
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
54 if (is("paddword")) len=4;
2334
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 unsigned int val=getnum(par);
2335
5/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
54 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2336
2/2
✓ Branch 0 taken 432 times.
✓ Branch 1 taken 36 times.
468 for (int i=0;i<12;i+=len)
2337 {
2338 216 unsigned int tmpval=val;
2339
2/2
✓ Branch 0 taken 432 times.
✓ Branch 1 taken 432 times.
864 for (int j=0;j<len;j++)
2340 {
2341 432 padbyte[i+j]=(unsigned char)tmpval;
2342 432 tmpval>>=8;
2343 }
2344 }
2345 }
2346
6/6
✓ Branch 0 taken 468 times.
✓ Branch 1 taken 255 times.
✓ Branch 2 taken 234 times.
✓ Branch 3 taken 234 times.
✓ Branch 4 taken 27 times.
✓ Branch 5 taken 336 times.
723 else if (is1("pad"))
2347 {
2348
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
54 if (freespaceid > 0) asar_throw_error(0, error_type_block, error_id_pad_in_freespace);
2349
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 int num=(int)getnum(par);
2350
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
54 if ((unsigned int)num & 0xFF000000) asar_throw_error(0, error_type_block, error_id_snes_address_doesnt_map_to_rom, hex((unsigned int)num, 6).data());
2351
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
54 if (num>realsnespos)
2352 {
2353
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
18 int end=snestopc(num);
2354
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
18 int start=snestopc(realsnespos);
2355 36 int len=end-start;
2356
3/4
✓ Branch 0 taken 180 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 180 times.
✓ Branch 3 taken 36 times.
216 for (int i=0;i<len;i++) write1(padbyte[i%12]);
2357
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 add_addr_to_line(addrToLinePos);
2358 }
2359 }
2360
18/18
✓ Branch 0 taken 414 times.
✓ Branch 1 taken 255 times.
✓ Branch 2 taken 324 times.
✓ Branch 3 taken 90 times.
✓ Branch 4 taken 324 times.
✓ Branch 5 taken 255 times.
✓ Branch 6 taken 306 times.
✓ Branch 7 taken 18 times.
✓ Branch 8 taken 306 times.
✓ Branch 9 taken 255 times.
✓ Branch 10 taken 288 times.
✓ Branch 11 taken 18 times.
✓ Branch 12 taken 288 times.
✓ Branch 13 taken 255 times.
✓ Branch 14 taken 18 times.
✓ Branch 15 taken 270 times.
✓ Branch 16 taken 72 times.
✓ Branch 17 taken 264 times.
669 else if (is1("fillbyte") || is1("fillword") || is1("filllong") || is1("filldword"))
2361 {
2362 72 int len = 0;
2363
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 54 times.
144 if (is("fillbyte")) len=1;
2364
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 126 times.
144 if (is("fillword")) len=2;
2365
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 126 times.
144 if (is("filllong")) len=3;
2366
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 126 times.
144 if (is("filldword")) len=4;
2367
1/2
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
144 unsigned int val= getnum(par);
2368
5/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 108 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
144 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2369
2/2
✓ Branch 0 taken 1098 times.
✓ Branch 1 taken 126 times.
1224 for (int i=0;i<12;i+=len)
2370 {
2371 549 unsigned int tmpval=val;
2372
2/2
✓ Branch 0 taken 1512 times.
✓ Branch 1 taken 1098 times.
2610 for (int j=0;j<len;j++)
2373 {
2374 1512 fillbyte[i+j]=(unsigned char)tmpval;
2375 1512 tmpval>>=8;
2376 }
2377 }
2378 }
2379
6/6
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 255 times.
✓ Branch 2 taken 135 times.
✓ Branch 3 taken 135 times.
✓ Branch 4 taken 135 times.
✓ Branch 5 taken 129 times.
525 else if (is1("arch"))
2380 {
2381
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 270 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
270 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2382
4/4
✓ Branch 0 taken 171 times.
✓ Branch 1 taken 99 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 99 times.
270 if (!stricmp(par, "65816")) { arch=arch_65816; return; }
2383
4/4
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 36 times.
✓ Branch 2 taken 63 times.
✓ Branch 3 taken 36 times.
198 if (!stricmp(par, "spc700")) { arch=arch_spc700; return; }
2384
2/4
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 if (!stricmp(par, "superfx")) { arch=arch_superfx; return; }
2385 asar_throw_error(0, error_type_block, error_id_broken_command, "arch", "Invalid architecture, expected one of 65816, spc700, superfx");
2386 }
2387
8/10
✓ Branch 0 taken 255 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 147 times.
✓ Branch 3 taken 108 times.
✓ Branch 4 taken 147 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 72 times.
✓ Branch 7 taken 75 times.
✓ Branch 8 taken 21 times.
✓ Branch 9 taken 108 times.
255 else if (is0("{") || is0("}")) {}
2388 else
2389 {
2390
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 39 times.
39 asar_throw_error(1, error_type_block, error_id_unknown_command);
2391 }
2392
2393
6/6
✓ Branch 0 taken 39186 times.
✓ Branch 1 taken 28386 times.
✓ Branch 2 taken 39186 times.
✓ Branch 3 taken 28386 times.
✓ Branch 4 taken 39186 times.
✓ Branch 5 taken 28386 times.
265704 }
2394
2395 48903 bool assemblemapper(char** word, int numwords)
2396 {
2397 48903 auto previous_mapper = mapper;
2398 if(0);
2399
6/6
✓ Branch 0 taken 2490 times.
✓ Branch 1 taken 46413 times.
✓ Branch 2 taken 291 times.
✓ Branch 3 taken 2199 times.
✓ Branch 4 taken 147 times.
✓ Branch 5 taken 21255 times.
48903 else if (is0("lorom"))
2400 {
2401 //this also makes xkas set snespos to $008000 for some reason
2402 291 mapper=lorom;
2403 }
2404
6/6
✓ Branch 0 taken 2199 times.
✓ Branch 1 taken 46413 times.
✓ Branch 2 taken 1092 times.
✓ Branch 3 taken 1107 times.
✓ Branch 4 taken 66 times.
✓ Branch 5 taken 21189 times.
48612 else if (is0("hirom"))
2405 {
2406 //xkas makes this point to $C00000
2407 126 mapper=hirom;
2408 }
2409
6/6
✓ Branch 0 taken 2073 times.
✓ Branch 1 taken 46413 times.
✓ Branch 2 taken 1029 times.
✓ Branch 3 taken 1044 times.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 21177 times.
48486 else if (is0("exlorom"))
2410 {
2411 21 mapper = exlorom;
2412 }
2413
6/6
✓ Branch 0 taken 2052 times.
✓ Branch 1 taken 46413 times.
✓ Branch 2 taken 1020 times.
✓ Branch 3 taken 1032 times.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 21165 times.
48465 else if (is0("exhirom"))
2414 {
2415 21 mapper=exhirom;
2416 }
2417
6/6
✓ Branch 0 taken 2031 times.
✓ Branch 1 taken 46413 times.
✓ Branch 2 taken 1011 times.
✓ Branch 3 taken 1020 times.
✓ Branch 4 taken 21 times.
✓ Branch 5 taken 21144 times.
48444 else if (is0("sfxrom"))
2418 {
2419 39 mapper=sfxrom;
2420 }
2421
6/6
✓ Branch 0 taken 1992 times.
✓ Branch 1 taken 46413 times.
✓ Branch 2 taken 996 times.
✓ Branch 3 taken 996 times.
✓ Branch 4 taken 60 times.
✓ Branch 5 taken 21084 times.
48405 else if (is0("norom"))
2422 {
2423 //$000000 would be the best snespos for this, but I don't care
2424 114 mapper=norom;
2425
2/2
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 36 times.
114 if(!force_checksum_fix)
2426 78 checksum_fix_enabled = false;//we don't know where the header is, so don't set the checksum
2427 }
2428
6/6
✓ Branch 0 taken 1878 times.
✓ Branch 1 taken 46413 times.
✓ Branch 2 taken 939 times.
✓ Branch 3 taken 939 times.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 21072 times.
48291 else if (is0("fullsa1rom"))
2429 {
2430 21 mapper=bigsa1rom;
2431 }
2432
2/2
✓ Branch 0 taken 75 times.
✓ Branch 1 taken 48195 times.
48270 else if (is("sa1rom"))
2433 {
2434
2/2
✓ Branch 0 taken 57 times.
✓ Branch 1 taken 18 times.
75 if (par)
2435 {
2436
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 57 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
57 if (word[2]) asar_throw_error(0, error_type_block, error_id_invalid_mapper);
2437
1/2
✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
87 if (!is_digit(par[0]) || par[1]!=',' ||
2438
2/4
✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 57 times.
✗ Branch 3 not taken.
57 !is_digit(par[2]) || par[3]!=',' ||
2439
2/4
✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 57 times.
✗ Branch 3 not taken.
57 !is_digit(par[4]) || par[5]!=',' ||
2440
4/10
✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 57 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 57 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 30 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
114 !is_digit(par[6]) || par[7]) asar_throw_error(0, error_type_block, error_id_invalid_mapper);
2441 int len;
2442
1/2
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
57 autoptr<char**> pars=qpsplit(par, ',', &len);
2443
1/2
✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
57 verify_paren(pars);
2444
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 57 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
57 if (len!=4) asar_throw_error(0, error_type_block, error_id_invalid_mapper);
2445 57 sa1banks[0]=(par[0]-'0')<<20;
2446 57 sa1banks[1]=(par[2]-'0')<<20;
2447 57 sa1banks[4]=(par[4]-'0')<<20;
2448 57 sa1banks[5]=(par[6]-'0')<<20;
2449 57 }
2450 else
2451 {
2452 18 sa1banks[0]=0<<20;
2453 18 sa1banks[1]=1<<20;
2454 18 sa1banks[4]=2<<20;
2455 18 sa1banks[5]=3<<20;
2456 }
2457 75 mapper=sa1rom;
2458 }
2459 21033 else return false;
2460
2461
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 708 times.
708 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2462
2/2
✓ Branch 0 taken 438 times.
✓ Branch 1 taken 270 times.
708 if(!mapper_set){
2463 438 mapper_set = true;
2464
2/2
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 135 times.
270 }else if(previous_mapper != mapper){
2465 234 asar_throw_warning(1, warning_id_mapper_already_set);
2466 }
2467 369 return true;
2468 }
2469