asar coverage - build #175


src/asar/
File: src/asar/assembleblock.cpp
Date: 2024-01-28 00:44:31
Lines:
1336/1446
92.4%
Functions:
42/42
100.0%
Branches:
2000/3194
62.6%

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