asar coverage - build #124


src/asar/
File: src/asar/assembleblock.cpp
Date: 2024-01-21 08:34:12
Lines:
1348/1460
92.3%
Functions:
41/41
100.0%
Branches:
2041/3239
63.0%

Line Branch Exec Source
1 #include "addr2line.h"
2 #include "asar.h"
3 #include "assembleblock.h"
4 #include "asar_math.h"
5 #include "macro.h"
6 #include "platform/file-helpers.h"
7 #include "table.h"
8 #include "unicode.h"
9 #include <cinttypes>
10
11 #include "interface-shared.h"
12 #include "arch-shared.h"
13
14 int arch=arch_65816;
15
16 bool snespos_valid = false;
17 int snespos;
18 int realsnespos;
19 int startpos;
20 int realstartpos;
21
22 bool mapper_set = false;
23 bool warn_endwhile = true;
24 int label_counter = 0;
25
26 static int old_snespos;
27 static int old_startpos;
28 static int old_optimizeforbank;
29 static bool old_snespos_valid;
30 static int struct_base;
31 static string struct_name;
32 static string struct_parent;
33 static bool in_struct = false;
34 static bool in_sub_struct = false;
35 static bool static_struct = false;
36 static bool in_spcblock = false;
37
38 assocarr<snes_struct> structs;
39
40 static bool movinglabelspossible = false;
41
42 static bool disable_bank_cross_errors = false;
43 static bool check_half_banks_crossed = false;
44
45 int bytes;
46 static int freespaceuse=0;
47
48 static enum {
49 ratsmeta_ban,
50 ratsmeta_allow,
51 ratsmeta_used,
52 } ratsmetastate=ratsmeta_ban;
53
54 enum spcblock_type{
55 spcblock_nspc,
56 spcblock_custom
57 };
58
59 struct spcblock_data{
60 unsigned int destination;
61 spcblock_type type;
62 string macro_name;
63
64 unsigned int execute_address;
65 unsigned int size_address;
66 mapper_t old_mapper;
67 }spcblock;
68
69 600 int snestopc_pick(int addr)
70 {
71 1044 return snestopc(addr);
72 }
73
74 1308894 inline void verifysnespos()
75 {
76
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1308894 times.
1308894 if (!snespos_valid)
77 {
78 asar_throw_error(0, error_type_block, error_id_missing_org);
79 snespos=0x008000;
80 realsnespos=0x008000;
81 startpos=0x008000;
82 realstartpos=0x008000;
83 snespos_valid = true;
84 }
85 1308894 }
86
87 1656 static int fixsnespos(int inaddr, int step)
88 {
89 // randomdude999: turns out it wasn't very reliable at all.
90 /* // RPG Hacker: No idea how reliable this is.
91 // Might not work with some of the more exotic mappers.
92 return pctosnes(snestopc(inaddr) + step); */
93
2/2
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 1368 times.
1656 if (mapper == lorom) {
94
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 252 times.
288 if ((inaddr&0xFFFF)+step > 0xFFFF) {
95 // bank crossed
96 36 return inaddr+step+0x8000;
97 }
98 252 return inaddr+step;
99
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == hirom) {
100 if ((inaddr&0x400000) == 0) {
101 // system pages, need to account for low pages and stuff
102 if ((inaddr&0xFFFF)+step > 0xFFFF) {
103 return inaddr+step+0x8000;
104 }
105 }
106 return inaddr+step;
107
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == exlorom) {
108 // exlorom has no mirroring so this should work fine
109 return pctosnes(snestopc(inaddr)+step);
110
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == exhirom) {
111 // apparently exhirom is pretty similar to hirom after all
112 if ((inaddr&0x400000) == 0) {
113 // system pages, need to account for low pages and stuff
114 if ((inaddr&0xFFFF)+step > 0xFFFF) {
115 return inaddr+step+0x8000;
116 }
117 }
118 return inaddr+step;
119
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == sa1rom) {
120 if((inaddr&0x400000) == 0) {
121 // lorom area
122 if ((inaddr&0xFFFF)+step > 0xFFFF) {
123 return inaddr+step+0x8000;
124 }
125 return inaddr+step;
126 } else {
127 // hirom area
128 return inaddr+step;
129 }
130
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == sfxrom) {
131 if ((inaddr&0x400000) == 0) {
132 // lorom area
133 if ((inaddr&0xFFFF)+step > 0xFFFF) {
134 return inaddr+step+0x8000;
135 }
136 } else {
137 // hirom area
138 return inaddr+step;
139 }
140
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == bigsa1rom) {
141 // no mirrors here, so this should work
142 return pctosnes(snestopc(inaddr)+step);
143
1/2
✓ Branch 0 taken 684 times.
✗ Branch 1 not taken.
684 } else if (mapper == norom) {
144 1368 return inaddr+step;
145 }
146 return -1;
147 }
148
149 1307883 inline void step(int num)
150 {
151
2/2
✓ Branch 0 taken 828 times.
✓ Branch 1 taken 1307055 times.
1307883 if (disable_bank_cross_errors)
152 {
153 828 snespos = fixsnespos(snespos, num);
154 828 realsnespos = fixsnespos(realsnespos, num);
155
156 // RPG Hacker: Not adjusting startpos here will eventually throw
157 // an error in checkbankcross() if we set warn bankcross on again.
158 // As far as I can tell, those are pretty much just used for
159 // checking bank crossing, anyways, so it's hopefully save to just
160 // adjust them here.
161 828 startpos = snespos;
162 828 realstartpos = realsnespos;
163 }
164 else
165 {
166 1307055 snespos += num;
167 1307055 realsnespos += num;
168 }
169 1307883 bytes+=num;
170 1307883 }
171
172 1306083 inline void write1_65816(unsigned int num)
173 {
174 1306083 verifysnespos();
175
2/2
✓ Branch 0 taken 435269 times.
✓ Branch 1 taken 870814 times.
1306083 if (pass==2)
176 {
177 435269 int pcpos=snestopc(realsnespos&0xFFFFFF);
178
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 435269 times.
435269 if (pcpos<0)
179 {
180 movinglabelspossible=true;
181 asar_throw_error(2, error_type_block, error_id_snes_address_doesnt_map_to_rom, hex((unsigned int)realsnespos, 6).data());
182 }
183 435269 writeromdata_byte(pcpos, (unsigned char)num);
184
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 435269 times.
435269 if (pcpos>=romlen) romlen=pcpos+1;
185 }
186
4/4
✓ Branch 0 taken 435389 times.
✓ Branch 1 taken 870694 times.
✓ Branch 2 taken 26561 times.
✓ Branch 3 taken 408828 times.
1306083 if(pass == 1 && freespaceid == 0) {
187 26561 int pcpos = snestopc(realsnespos & 0xFFFFFF);
188
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 26561 times.
26561 if(pcpos < 0) asar_throw_error(pass, error_type_fatal, error_id_internal_error, "invalid pos in pass 1");
189 26561 addromwrite(pcpos, 1);
190
2/2
✓ Branch 0 taken 25964 times.
✓ Branch 1 taken 597 times.
26561 if (pcpos>=romlen) romlen=pcpos+1;
191 }
192 1306083 step(1);
193 1306083 ratsmetastate=ratsmeta_ban;
194 1306083 }
195
196 int recent_opcode_num = 0;
197
198 684027 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.
684594 write1_65816(num);
201 1264611 }
202
203 84846 static bool asblock_pick(char** word, int numwords)
204 {
205 84846 recent_opcode_num = 1;
206
207
4/4
✓ Branch 0 taken 77808 times.
✓ Branch 1 taken 7038 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 77736 times.
84846 if (arch==arch_spc700 || in_spcblock) return asblock_spc700(word, numwords);
208
2/2
✓ Branch 0 taken 66774 times.
✓ Branch 1 taken 10962 times.
77736 if (arch==arch_65816) return asblock_65816(word, numwords);
209
1/2
✓ Branch 0 taken 10962 times.
✗ Branch 1 not taken.
10962 if (arch==arch_superfx) return asblock_superfx(word, numwords);
210 return true;
211 }
212
213 #define write1 write1_pick
214 #define snestopc snestopc_pick
215
216 29250 const char * safedequote(char * str)
217 {
218 29250 const char * tmp=dequote(str);
219
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 29250 times.
29250 if (!tmp) asar_throw_error(0, error_type_block, error_id_garbage_near_quoted_string);
220 29250 return tmp;
221 }
222
223 extern char romtitle[30];
224 extern bool stdlib;
225
226 5202 void write2(unsigned int num)
227 {
228 2604 write1(num);
229 5202 write1(num/256);
230 5202 }
231
232 3108 void write3(unsigned int num)
233 {
234 1554 write1(num);
235 3108 write1(num/256);
236 3108 write1(num/65536);
237 3108 }
238
239 342 void write4(unsigned int num)
240 {
241 171 write1(num);
242 342 write1(num/256);
243 342 write1(num/65536);
244 342 write1(num/16777216);
245 342 }
246
247 //these are NOT used by the math parser - see math.cpp for that
248 90 int read2(int insnespos)
249 {
250 45 int addr=snestopc(insnespos);
251
4/4
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 36 times.
90 if (addr<0 || addr+2>romlen_r) return -1;
252 return
253 72 romdata_r[addr ] |
254 72 (romdata_r[addr+1]<< 8);
255 }
256
257 198 int read3(int insnespos)
258 {
259 99 int addr=snestopc(insnespos);
260
3/4
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 99 times.
✓ Branch 3 taken 99 times.
198 if (addr<0 || addr+3>romlen_r) return -1;
261 return
262 198 romdata_r[addr ] |
263 198 (romdata_r[addr+1]<< 8)|
264 198 (romdata_r[addr+2]<<16);
265 }
266
267 4266 int getlenfromchar(char c)
268 {
269 4266 c=(char)to_lower(c);
270
2/2
✓ Branch 0 taken 2133 times.
✓ Branch 1 taken 2133 times.
4266 if (c=='b') return 1;
271
2/2
✓ Branch 0 taken 1143 times.
✓ Branch 1 taken 1143 times.
2286 if (c=='w') return 2;
272
2/2
✓ Branch 0 taken 153 times.
✓ Branch 1 taken 153 times.
306 if (c=='l') return 3;
273 18 asar_throw_error(0, error_type_block, error_id_invalid_opcode_length);
274 return -1;
275 }
276
277 assocarr<snes_label> labels;
278 static autoarray<int> poslabels;
279 static autoarray<int> neglabels;
280
281 autoarray<int>* macroposlabels;
282 autoarray<int>* macroneglabels;
283
284 autoarray<string> sublabels;
285 autoarray<string>* macrosublabels;
286
287 // randomdude999: ns is still the string to prefix to all labels, it's calculated whenever namespace_list is changed
288 string ns;
289 string ns_backup;
290 autoarray<string> namespace_list;
291
292 //bool fastrom=false;
293
294 autoarray<string> includeonce;
295
296 // data necessary for one freespace block
297 1527 struct freespace_data {
298 // snespos of the start of the freespace block. set to the found freespace
299 // block during the `freespace` command in pass 1.
300 int pos;
301 // length of the freespace block
302 int len;
303 // whether this freespace is leaked (no autocleans pointing at it)
304 bool leaked;
305 // position of the previous version of this freespace
306 int orgpos;
307 // length of previous version
308 int orglen;
309 // whether this freespace is static, i.e. can't be relocated when reinserting
310 bool is_static;
311 // what byte to use when searching for freespace, and clearing out previous rats tags
312 unsigned char cleanbyte;
313
314 // options only used for finding freespace:
315
316 // if this freespace is pinned to another one, this holds the name of the label of the target.
317 // we can't resolve this into a freespace number earlier since it could be a forward reference.
318 // we also need to keep the current namespace around since this is necessary for resolving label references.
319 string pin_target;
320 string pin_target_ns;
321 // computed at the end of pass 0. this is the freespace id of the final pin
322 // target, in case of multiple "nested" pins or whatnot.
323 int pin_target_id;
324 // what address to start searching for freespace at
325 int search_start;
326 // what bank to search for freespace in: -1 for any bank, -2 for banks with
327 // code mirrors, positive for specific bank
328 int bank;
329 bool write_rats;
330 // should rework this...
331 bool flag_align;
332 // pinned freespaces: how much space is actually needed for this freespace
333 int total_len;
334 // pinned freespaces: how much of this block we've already used
335 int used_len;
336 };
337 static autoarray<freespace_data> freespaces;
338
339 // id of the next unused freespace.
340 static int freespaceidnext;
341 // id of the current freespace, or 0 if not in freespace.
342 int freespaceid;
343 // start address of the current freespace, used for computing the length of the
344 // current freespace.
345 static int freespacestart;
346
347
348 7323 bool confirmname(const char * name)
349 {
350
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7323 times.
7323 if (!name[0]) return false;
351
2/2
✓ Branch 0 taken 1836 times.
✓ Branch 1 taken 5487 times.
7323 if (is_digit(name[0])) return false;
352
2/2
✓ Branch 0 taken 45885 times.
✓ Branch 1 taken 5469 times.
51354 for (int i=0;name[i];i++)
353 {
354
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 45867 times.
45885 if (!is_ualnum(name[i])) return false;
355 }
356 2736 return true;
357 }
358
359 162378 string posneglabelname(const char ** input, bool define)
360 {
361 162378 const char* label = *input;
362
363 78089 string output;
364
365 78089 int depth = 0;
366 78089 bool ismacro = false;
367
368
2/2
✓ Branch 0 taken 138 times.
✓ Branch 1 taken 162240 times.
162378 if (label[0] == '?')
369 {
370 69 ismacro = true;
371 138 label++;
372 }
373
4/4
✓ Branch 0 taken 78082 times.
✓ Branch 1 taken 84296 times.
✓ Branch 2 taken 583 times.
✓ Branch 3 taken 161632 times.
162378 if (label[0] == '-' || label[0] == '+')
374 {
375 380 char first = label[0];
376
4/4
✓ Branch 0 taken 926 times.
✓ Branch 1 taken 566 times.
✓ Branch 2 taken 746 times.
✓ Branch 3 taken 180 times.
1492 for (depth = 0; label[0] && label[0] == first; depth++) label++;
377
378
2/2
✓ Branch 0 taken 698 times.
✓ Branch 1 taken 48 times.
746 if (!ismacro)
379 {
380
2/2
✓ Branch 0 taken 559 times.
✓ Branch 1 taken 139 times.
698 if (first == '+')
381 {
382 559 *input = label;
383
8/16
✓ Branch 0 taken 283 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 283 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 283 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 283 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 283 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 283 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 283 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 283 times.
✗ Branch 15 not taken.
835 output = STR":pos_" + dec(depth) + "_" + dec(poslabels[depth]);
384
3/4
✓ Branch 0 taken 309 times.
✓ Branch 1 taken 250 times.
✓ Branch 2 taken 156 times.
✗ Branch 3 not taken.
712 if (define) poslabels[depth]++;
385 }
386 else
387 {
388 139 *input = label;
389
3/4
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 118 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
148 if (define) neglabels[depth]++;
390
8/16
✓ Branch 0 taken 73 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 73 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 73 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 73 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 73 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 73 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 73 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 73 times.
✗ Branch 15 not taken.
205 output = STR":neg_" + dec(depth) + "_" + dec(neglabels[depth]);
391 }
392 }
393 else
394 {
395
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)
396 {
397 if (!macrorecursion) asar_throw_error(0, error_type_block, error_id_macro_label_outside_of_macro);
398 }
399 else
400 {
401
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 24 times.
48 if (first == '+')
402 {
403 24 *input = label;
404
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]);
405
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]++;
406 }
407 else
408 {
409 24 *input = label;
410
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]++;
411
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]);
412 }
413 }
414 }
415 }
416
417 162378 return output;
418 }
419
420 6223 static string labelname(const char ** rawname, bool define=false)
421 {
422 #define deref_rawname (*rawname)
423 3120 autoarray<string>* sublabellist = &sublabels;
424
425 6223 bool ismacro = (deref_rawname[0] == '?');
426 3120 bool issublabel = false;
427
428
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 6151 times.
6223 if (ismacro)
429 {
430 72 deref_rawname++;
431 72 sublabellist = macrosublabels;
432 }
433
434 3120 string name;
435 3120 int i=-1;
436
437
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6223 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6223 if (is_digit(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
438
2/2
✓ Branch 0 taken 210 times.
✓ Branch 1 taken 6013 times.
6223 if (*deref_rawname ==':')
439 {
440 210 deref_rawname++;
441
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 name=":";
442 }
443
4/4
✓ Branch 0 taken 3012 times.
✓ Branch 1 taken 3001 times.
✓ Branch 2 taken 2715 times.
✓ Branch 3 taken 2704 times.
6013 else if (!in_struct && !in_sub_struct)
444 {
445
2/2
✓ Branch 0 taken 285 times.
✓ Branch 1 taken 5347 times.
5632 for (i=0;(*deref_rawname =='.');i++) deref_rawname++;
446
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5347 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5347 if (!is_ualnum(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
447
2/2
✓ Branch 0 taken 267 times.
✓ Branch 1 taken 5080 times.
5347 if (i)
448 {
449
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);
450
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]+"_";
451 135 issublabel = true;
452 }
453 }
454
455
4/4
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 6163 times.
✓ Branch 2 taken 24 times.
✓ Branch 3 taken 12 times.
6223 if (ismacro && !issublabel)
456 {
457 // RPG Hacker: Don't add the prefix for sublabels, because they already inherit it from
458 // their parents' names.
459
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);
460
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;
461 }
462
463
464
4/4
✓ Branch 0 taken 5611 times.
✓ Branch 1 taken 594 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 5539 times.
6205 if (in_struct || in_sub_struct)
465 {
466
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 594 times.
666 if(in_sub_struct)
467 {
468
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 name += struct_parent + ".";
469 }
470
1/2
✓ Branch 0 taken 333 times.
✗ Branch 1 not taken.
666 name += struct_name;
471
1/2
✓ Branch 0 taken 333 times.
✗ Branch 1 not taken.
666 name += '.';
472
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!!!
473 648 deref_rawname++;
474 }
475
476
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6187 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6187 if (!is_ualnum(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
477
478
6/6
✓ Branch 0 taken 25258 times.
✓ Branch 1 taken 25329 times.
✓ Branch 2 taken 486 times.
✓ Branch 3 taken 6187 times.
✓ Branch 4 taken 22244 times.
✓ Branch 5 taken 3102 times.
50587 while (is_ualnum(*deref_rawname) || *deref_rawname == '.')
479 {
480
1/2
✓ Branch 0 taken 22244 times.
✗ Branch 1 not taken.
44400 name+=*(deref_rawname++);
481 }
482
483
4/4
✓ Branch 0 taken 3742 times.
✓ Branch 1 taken 2445 times.
✓ Branch 2 taken 174 times.
✓ Branch 3 taken 3568 times.
6187 if(!define && *deref_rawname == '[')
484 {
485
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++;
486
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);
487 174 deref_rawname++;
488 }
489
490
6/6
✓ Branch 0 taken 3522 times.
✓ Branch 1 taken 3505 times.
✓ Branch 2 taken 168 times.
✓ Branch 3 taken 6187 times.
✓ Branch 4 taken 420 times.
✓ Branch 5 taken 3102 times.
7027 while (is_ualnum(*deref_rawname) || *deref_rawname == '.')
491 {
492
1/2
✓ Branch 0 taken 420 times.
✗ Branch 1 not taken.
840 name+=*(deref_rawname++);
493 }
494
495
3/4
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 6115 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 72 times.
6187 if(*deref_rawname == '[') asar_throw_error(2, error_type_block, error_id_invalid_subscript);
496
497
4/4
✓ Branch 0 taken 2058 times.
✓ Branch 1 taken 4057 times.
✓ Branch 2 taken 876 times.
✓ Branch 3 taken 315 times.
6115 if (define && i>=0)
498 {
499
1/2
✓ Branch 0 taken 876 times.
✗ Branch 1 not taken.
1743 (*sublabellist).reset(i);
500
2/4
✓ Branch 0 taken 876 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 876 times.
✗ Branch 3 not taken.
876 (*sublabellist)[i]=name;
501 }
502 6115 return name;
503 #undef deref_rawname
504 108 }
505
506 3598 inline bool labelvalcore(const char ** rawname, snes_label * rval, bool define, bool shouldthrow)
507 {
508
1/2
✓ Branch 0 taken 1803 times.
✗ Branch 1 not taken.
3598 string name=labelname(rawname, define);
509
14/20
✓ Branch 0 taken 1893 times.
✓ Branch 1 taken 1705 times.
✓ Branch 2 taken 140 times.
✓ Branch 3 taken 3458 times.
✓ Branch 4 taken 92 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 92 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 48 times.
✓ Branch 9 taken 44 times.
✓ Branch 10 taken 92 times.
✓ Branch 11 taken 1711 times.
✓ Branch 12 taken 48 times.
✓ Branch 13 taken 1755 times.
✓ Branch 14 taken 48 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 48 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
3736 if (ns && labels.exists(ns+name)) {*rval = labels.find(ns+name);}
510
5/6
✓ Branch 0 taken 3292 times.
✓ Branch 1 taken 210 times.
✓ Branch 2 taken 1544 times.
✓ Branch 3 taken 211 times.
✓ Branch 4 taken 1544 times.
✗ Branch 5 not taken.
3502 else if (labels.exists(name)) {*rval = labels.find(name);}
511 else
512 {
513
4/4
✓ Branch 0 taken 127 times.
✓ Branch 1 taken 294 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 120 times.
421 if (shouldthrow && pass)
514 {
515
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());
516 }
517 414 rval->pos = (unsigned int)-1;
518 414 rval->freespace_id = 0;
519 414 rval->is_static = false;
520 414 return false;
521 }
522 1592 return true;
523 3598 }
524
525 1756 snes_label labelval(const char ** rawname, bool define)
526 {
527 879 snes_label rval;
528
2/2
✓ Branch 0 taken 875 times.
✓ Branch 1 taken 4 times.
1756 labelvalcore(rawname, &rval, define, true);
529 1749 return rval;
530 }
531
532 134 snes_label labelval(string name, bool define)
533 {
534 134 const char * rawname=name;
535 68 snes_label rval;
536
1/2
✓ Branch 0 taken 68 times.
✗ Branch 1 not taken.
134 labelvalcore(&rawname, &rval, define, true);
537 134 return rval;
538 }
539
540 1536 bool labelval(const char ** rawname, snes_label * rval, bool define)
541 {
542 1536 return labelvalcore(rawname, rval, define, false);
543 }
544
545 172 bool labelval(string name, snes_label * rval, bool define)
546 {
547 172 const char * str=name;
548
1/2
✓ Branch 0 taken 88 times.
✗ Branch 1 not taken.
260 return labelvalcore(&str, rval, define, false);
549 }
550
551 3279 static void setlabel(string name, int loc=-1, bool is_static=false, int freespace_id = -1)
552 {
553
2/2
✓ Branch 0 taken 2793 times.
✓ Branch 1 taken 486 times.
3279 if (loc==-1)
554 {
555
1/2
✓ Branch 0 taken 1404 times.
✗ Branch 1 not taken.
2793 verifysnespos();
556 2793 loc=snespos;
557 }
558
559 1647 snes_label label_data;
560 3279 label_data.pos = (unsigned int)loc;
561 3279 label_data.is_static = is_static;
562
1/2
✓ Branch 0 taken 3279 times.
✗ Branch 1 not taken.
3279 label_data.freespace_id = freespace_id == -1 ? freespaceid : freespace_id;
563
564 unsigned int labelpos;
565
2/2
✓ Branch 0 taken 1093 times.
✓ Branch 1 taken 2186 times.
3279 if (pass==0)
566 {
567
4/4
✓ Branch 0 taken 552 times.
✓ Branch 1 taken 541 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 546 times.
1093 if (labels.exists(name))
568 {
569 6 movinglabelspossible=true;
570
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());
571 }
572
1/2
✓ Branch 0 taken 546 times.
✗ Branch 1 not taken.
1087 labels.create(name) = label_data;
573 }
574
2/2
✓ Branch 0 taken 1093 times.
✓ Branch 1 taken 1093 times.
2186 else if (pass==1)
575 {
576
1/2
✓ Branch 0 taken 549 times.
✗ Branch 1 not taken.
1093 labels.create(name) = label_data;
577 }
578
1/2
✓ Branch 0 taken 1093 times.
✗ Branch 1 not taken.
1093 else if (pass==2)
579 {
580 //all label locations are known at this point, add a sanity check
581
3/6
✓ Branch 0 taken 549 times.
✓ Branch 1 taken 544 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 549 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1093 if (!labels.exists(name)) asar_throw_error(2, error_type_block, error_id_label_on_third_pass);
582
1/2
✓ Branch 0 taken 549 times.
✗ Branch 1 not taken.
1093 labelpos = labels.find(name).pos;
583
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1081 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
1093 if ((int)labelpos != loc && !movinglabelspossible)
584 {
585
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());
586
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());
587
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 else if(errored) return;
588 else asar_throw_error(2, error_type_block, error_id_label_moving);
589 }
590 }
591 }
592
593 table thetable;
594 static autoarray<table> tablestack;
595
596 2124 static void cleartable()
597 {
598
2/4
✓ Branch 0 taken 2124 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1092 times.
✗ Branch 3 not taken.
2124 thetable = table();
599 2124 }
600
601 struct pushable {
602 int arch;
603 int snespos;
604 int snesstart;
605 int snesposreal;
606 int snesstartreal;
607 int freeid;
608 int freest;
609 int arch1;
610 int arch2;
611 int arch3;
612 int arch4;
613 };
614 static autoarray<pushable> pushpc;
615 static int pushpcnum;
616
617 static autoarray<int> basestack;
618 static int basestacknum;
619
620 129 struct ns_pushable {
621 string ns;
622 autoarray<string> namespace_list;
623 bool nested_namespaces;
624 };
625
626 static autoarray<ns_pushable> pushns;
627 static int pushnsnum;
628
629
630 static unsigned char fillbyte[12];
631 static unsigned char padbyte[12];
632
633 static bool nested_namespaces = false;
634
635 4374 static int getfreespaceid()
636 {
637 /*static const int max_num_freespaces = 125;
638 if (freespaceidnext > max_num_freespaces) asar_throw_error(pass, error_type_fatal, error_id_freespace_limit_reached, max_num_freespaces);*/
639 4374 int newid = freespaceidnext++;
640
2/2
✓ Branch 0 taken 1458 times.
✓ Branch 1 taken 2916 times.
4374 if(newid >= freespaces.count) {
641 1458 freespaces[newid].leaked = true;
642 1458 freespaces[newid].orgpos = -2;
643 1458 freespaces[newid].orglen = -1;
644 1458 freespaces[newid].cleanbyte = 0x00;
645 }
646 4374 return newid;
647 }
648
649 132732 void checkbankcross()
650 {
651
2/2
✓ Branch 0 taken 66318 times.
✓ Branch 1 taken 66414 times.
132732 if (!snespos_valid) return;
652
2/2
✓ Branch 0 taken 53412 times.
✓ Branch 1 taken 53559 times.
106971 if (disable_bank_cross_errors) return;
653
2/2
✓ Branch 0 taken 52845 times.
✓ Branch 1 taken 52992 times.
105837 unsigned int mask = 0x7FFF0000 | (check_half_banks_crossed ? 0x8000 : 0);
654
4/4
✓ Branch 0 taken 1713 times.
✓ Branch 1 taken 104124 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 1701 times.
105837 if (((snespos^startpos) & mask) && (((snespos - 1) ^ startpos) & mask))
655 {
656 12 asar_throw_error(pass, error_type_fatal, error_id_bank_border_crossed, snespos);
657 }
658 // don't verify realsnespos when using norom. this allows making custom mappers where the file layout doesn't follow bank borders
659
5/6
✓ Branch 0 taken 104949 times.
✓ Branch 1 taken 876 times.
✓ Branch 2 taken 1701 times.
✓ Branch 3 taken 103248 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1701 times.
105825 else if (mapper != norom && ((realsnespos^realstartpos) & mask) && (((realsnespos - 1) ^ realstartpos) & mask))
660 {
661 asar_throw_error(pass, error_type_fatal, error_id_bank_border_crossed, realsnespos);
662 }
663 }
664
665 8832 static void freespaceend()
666 {
667
2/2
✓ Branch 0 taken 4392 times.
✓ Branch 1 taken 4440 times.
8832 if (freespaceid > 0)
668 {
669 4392 freespaces[freespaceid].len = snespos-freespacestart;
670 4392 snespos=(int)0xFFFFFFFF;
671 4392 snespos_valid = false;
672 }
673 8832 freespaceid = 0;
674 8832 }
675
676 int numopcodes;
677
678
1/2
✓ Branch 0 taken 9605 times.
✗ Branch 1 not taken.
19408 static void adddefine(const string & key, string & value)
679 {
680
1/2
✓ Branch 0 taken 19408 times.
✗ Branch 1 not taken.
19408 if (!defines.exists(key)) defines.create(key) = value;
681 19408 }
682
683 2106 void initstuff()
684 {
685
2/2
✓ Branch 0 taken 722 times.
✓ Branch 1 taken 1384 times.
2106 if (pass==0)
686 {
687 722 freespaces.reset();
688 722 movinglabelspossible = false;
689 722 found_rats_tags_initialized = false;
690 722 found_rats_tags.clear();
691 }
692 2106 arch=arch_65816;
693 2106 mapper=lorom;
694 2106 mapper_set = false;
695 2106 calledmacros = 0;
696 2106 reallycalledmacros = 0;
697 2106 macrorecursion = 0;
698 2106 defines.reset();
699 2106 builtindefines.each(adddefine);
700 2106 clidefines.each(adddefine);
701 1083 ns="";
702 2106 namespace_list.reset();
703 2106 sublabels.reset();
704 2106 poslabels.reset();
705 2106 neglabels.reset();
706 2106 macroposlabels = nullptr;
707 2106 macroneglabels = nullptr;
708 2106 macrosublabels = nullptr;
709 2106 cleartable();
710 2106 pushpc.reset();
711 2106 pushpcnum=0;
712 2106 pushns.reset();
713 2106 pushnsnum = 0;
714 2106 bytes=0;
715 2106 freespaceuse=0;
716 2106 memset(fillbyte, 0, sizeof(fillbyte));
717 2106 memset(padbyte, 0, sizeof(padbyte));
718 2106 snespos_valid = false;
719 2106 snespos=(int)0xFFFFFFFF;
720 2106 realsnespos= (int)0xFFFFFFFF;
721 2106 startpos= (int)0xFFFFFFFF;
722 2106 realstartpos= (int)0xFFFFFFFF;
723 //fastrom=false;
724 2106 freespaceidnext=1;
725 2106 freespaceid=0;
726 2106 numopcodes=0;
727 2106 incsrcdepth = 0;
728
729 2106 optimizeforbank = -1;
730 2106 optimize_dp = optimize_dp_flag::NONE;
731 2106 dp_base = 0;
732 2106 optimize_address = optimize_address_flag::DEFAULT;
733
734 2106 in_struct = false;
735 2106 in_sub_struct = false;
736 2106 in_spcblock = false;
737
738
1/2
✓ Branch 0 taken 2106 times.
✗ Branch 1 not taken.
2106 if (arch==arch_65816) asinit_65816();
739
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2106 times.
2106 if (arch==arch_spc700) asinit_spc700();
740
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2106 times.
2106 if (arch==arch_superfx) asinit_superfx();
741
742 2106 disable_bank_cross_errors = false;
743 2106 check_half_banks_crossed = false;
744 2106 nested_namespaces = false;
745
746 2106 includeonce.reset();
747
748 extern AddressToLineMapping addressToLineMapping;
749 2106 addressToLineMapping.reset();
750
751 2106 push_warnings(false);
752
753 2106 initmathcore();
754
755 2106 callstack.reset();
756 #if defined(_WIN32) || !defined(NO_USE_THREADS)
757 2106 init_stack_use_check();
758 #endif
759 2106 }
760
761 1482 int get_freespace_pin_target(int target_id) {
762 // union-find algorithm
763
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1482 times.
2235 while(freespaces[target_id].pin_target_id != target_id) {
764 // i love programming
765 18 freespaces[target_id].pin_target_id =
766 12 freespaces[freespaces[target_id].pin_target_id].pin_target_id;
767 12 target_id = freespaces[target_id].pin_target_id;
768 }
769 1482 return target_id;
770 }
771
772 692 void resolve_pinned_freespaces() {
773
2/2
✓ Branch 0 taken 1458 times.
✓ Branch 1 taken 692 times.
2150 for(int i = 1; i < freespaces.count; i++)
774 // default to everyone being in a separate component
775 1458 freespaces[i].pin_target_id = i;
776
2/2
✓ Branch 0 taken 1458 times.
✓ Branch 1 taken 692 times.
2150 for(int i = 1; i < freespaces.count; i++) {
777
1/2
✓ Branch 0 taken 729 times.
✗ Branch 1 not taken.
729 freespace_data& fs = freespaces[i];
778
2/2
✓ Branch 0 taken 1434 times.
✓ Branch 1 taken 24 times.
1458 if(fs.pin_target == "") continue;
779 12 snes_label value;
780
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))
781 value = labels.find(fs.pin_target_ns + fs.pin_target);
782
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))
783
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
24 value = labels.find(fs.pin_target);
784 else continue; // the error for this is thrown in the freespace command during pass 2
785
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
24 fs.pin_target_id = get_freespace_pin_target(value.freespace_id);
786 24 fs.len = 0;
787 }
788 692 }
789
790 692 void allocate_freespaces() {
791 // compute real size of all pinned freespace blocks
792
2/2
✓ Branch 0 taken 1458 times.
✓ Branch 1 taken 692 times.
2150 for(int i = 1; i < freespaces.count; i++) {
793 729 freespace_data& fs = freespaces[i];
794 // just in case the pin target changed again or something
795 1458 fs.pin_target_id = get_freespace_pin_target(fs.pin_target_id);
796 729 freespace_data& target = freespaces[fs.pin_target_id];
797 1458 target.total_len += fs.len;
798
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 729 times.
1458 target.search_start = std::max(fs.search_start, target.search_start);
799 }
800
801
2/2
✓ Branch 0 taken 1458 times.
✓ Branch 1 taken 692 times.
2150 for(int i = 1; i < freespaces.count; i++) {
802 729 freespace_data& fs = freespaces[i];
803
4/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1446 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 6 times.
1458 if(fs.is_static && fs.orgpos > 0) {
804 6 fs.pos = fs.orgpos;
805 6 continue;
806 }
807 // if this freespace is pinned to another one, set it later
808
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1434 times.
1452 if(fs.pin_target_id != i) continue;
809 // TODO: possibly fancier align
810 1434 fs.pos = getsnesfreespace(fs.total_len, fs.bank, true, true, fs.flag_align, fs.cleanbyte, fs.write_rats, fs.search_start);
811 1434 fs.used_len = fs.len;
812 }
813 // set pos for all pinned freespaces
814
2/2
✓ Branch 0 taken 1458 times.
✓ Branch 1 taken 692 times.
2150 for(int i = 1; i < freespaces.count; i++) {
815 729 freespace_data& fs = freespaces[i];
816
2/2
✓ Branch 0 taken 1440 times.
✓ Branch 1 taken 18 times.
1458 if(fs.pin_target_id == i) continue;
817 9 freespace_data& tgt = freespaces[fs.pin_target_id];
818 18 fs.pos = tgt.pos + tgt.used_len;
819 18 tgt.used_len += fs.len;
820 }
821
822 // relocate all labels that were in freespace to point them to their real location
823 692 labels.each([](const char * key, snes_label & val) {
824
2/2
✓ Branch 0 taken 168 times.
✓ Branch 1 taken 919 times.
1087 if(val.freespace_id != 0) {
825 168 val.pos += freespaces[val.freespace_id].pos;
826 }
827 1087 });
828 692 }
829
830 //void nerf(const string& left, string& right){puts(S left+" = "+right);}
831
832 2076 void finishpass()
833 {
834 2076 verify_warnings();
835 2076 pull_warnings(false);
836
837 //defines.traverse(nerf);
838
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2076 times.
2076 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_missing_endspcblock);
839
2/4
✓ Branch 0 taken 2076 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2076 times.
2076 if (in_struct || in_sub_struct) asar_throw_error(pass, error_type_null, error_id_struct_without_endstruct);
840
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2076 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2076 else if (pushpcnum && pass == 0) asar_throw_error(pass, error_type_null, error_id_pushpc_without_pullpc);
841
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2076 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2076 else if (pushnsnum && pass == 0) asar_throw_error(pass, error_type_null, error_id_pushns_without_pullns);
842 2076 freespaceend();
843
2/2
✓ Branch 0 taken 1968 times.
✓ Branch 1 taken 108 times.
2076 if (arch==arch_65816) asend_65816();
844
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 2004 times.
2076 if (arch==arch_spc700) asend_spc700();
845
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 2040 times.
2076 if (arch==arch_superfx) asend_superfx();
846
847 2076 deinitmathcore();
848
2/2
✓ Branch 0 taken 692 times.
✓ Branch 1 taken 1384 times.
2076 if(pass == 0) {
849 692 resolve_pinned_freespaces();
850
2/2
✓ Branch 0 taken 692 times.
✓ Branch 1 taken 692 times.
1384 } else if(pass == 1) {
851 692 allocate_freespaces();
852 692 handle_cleared_rats_tags();
853 }
854 #if defined(_WIN32) || !defined(NO_USE_THREADS)
855 2076 deinit_stack_use_check();
856 #endif
857 2076 }
858
859 146700 static bool addlabel(const char * label, int pos=-1, bool global_label = false)
860 {
861
4/4
✓ Branch 0 taken 101457 times.
✓ Branch 1 taken 45243 times.
✓ Branch 2 taken 53901 times.
✓ Branch 3 taken 47556 times.
146700 if (!label[0] || label[0]==':') return false;//colons are reserved for special labels
862
863 101457 const char* posneglabel = label;
864
1/2
✓ Branch 0 taken 47556 times.
✗ Branch 1 not taken.
101457 string posnegname = posneglabelname(&posneglabel, true);
865
866
4/4
✓ Branch 0 taken 47736 times.
✓ Branch 1 taken 53721 times.
✓ Branch 2 taken 186 times.
✓ Branch 3 taken 47370 times.
101457 if (posnegname.length() > 0)
867 {
868
2/2
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 186 times.
366 if (global_label) return false;
869
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);
870
2/4
✓ Branch 0 taken 366 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 186 times.
✗ Branch 3 not taken.
366 setlabel(posnegname, pos);
871 366 return true;
872 }
873
7/8
✓ Branch 0 taken 98685 times.
✓ Branch 1 taken 2406 times.
✓ Branch 2 taken 98502 times.
✓ Branch 3 taken 183 times.
✓ Branch 4 taken 98484 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 98484 times.
101091 if (label[strlen(label)-1]==':' || label[0]=='.' || label[0]=='?' || label[0] == '#')
874 {
875
2/2
✓ Branch 0 taken 1299 times.
✓ Branch 1 taken 1308 times.
2607 if (!label[1]) return false;
876
6/8
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 2445 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.
2571 if(global_label && (in_struct || in_sub_struct || label[0]=='?')) return false;
877
878 1281 bool define = true;
879
880
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 2481 times.
2553 if (label[0] == '#')
881 {
882 36 define = false;
883 72 label++;
884 }
885
886 // RPG Hacker: Also checking label[1] now, since it might be a macro sublabel.
887 // Also, apparently this here doesn't account for main labels. I guess because
888 // we don't even get here in the first place if they don't include a colon?
889
7/8
✓ Branch 0 taken 1668 times.
✓ Branch 1 taken 885 times.
✓ Branch 2 taken 1650 times.
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 1632 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 819 times.
2553 bool requirecolon = (label[0] != '.' && label[1] != '.') && (in_struct || in_sub_struct);
890
2/2
✓ Branch 0 taken 2445 times.
✓ Branch 1 taken 108 times.
2553 string name=labelname(&label, define);
891
2/2
✓ Branch 0 taken 2316 times.
✓ Branch 1 taken 129 times.
2445 if (label[0]==':') label++;
892
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);
893
2/2
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 66 times.
129 else if (global_label) return false;
894
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2427 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2427 if (label[0]) asar_throw_error(0, error_type_block, error_id_broken_label_definition);
895
10/12
✓ Branch 0 taken 1380 times.
✓ Branch 1 taken 1047 times.
✓ Branch 2 taken 309 times.
✓ Branch 3 taken 1071 times.
✓ Branch 4 taken 147 times.
✓ Branch 5 taken 18 times.
✓ Branch 6 taken 147 times.
✓ Branch 7 taken 1071 times.
✓ Branch 8 taken 147 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 147 times.
✗ Branch 11 not taken.
2571 if (ns && !global_label) name=ns+name;
896
9/10
✓ Branch 0 taken 1869 times.
✓ Branch 1 taken 558 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 1797 times.
✓ Branch 4 taken 1428 times.
✓ Branch 5 taken 96 times.
✓ Branch 6 taken 1218 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1212 times.
✓ Branch 9 taken 6 times.
2433 setlabel(name, pos, ((in_struct || in_sub_struct) && static_struct));
897 2415 return true;
898 2445 }
899 46062 return false;
900 101457 }
901
902 44715 static void add_addr_to_line(int pos)
903 {
904
2/2
✓ Branch 0 taken 15799 times.
✓ Branch 1 taken 28916 times.
44715 if (pass == 2)
905 15799 addressToLineMapping.includeMapping(get_current_file_name(), get_current_line() + 1, pos);
906 44715 }
907
908 static autoarray<bool> elsestatus;
909 int numtrue=0;//if 1 -> increase both
910 int numif = 0; //if 0 or inside if 0 -> increase only numif
911
912 autoarray<whiletracker> whilestatus;
913 int single_line_for_tracker;
914
915
916 270 static void push_pc()
917 {
918 270 pushpc[pushpcnum].arch=arch;
919 270 pushpc[pushpcnum].snespos=snespos;
920 270 pushpc[pushpcnum].snesstart=startpos;
921 270 pushpc[pushpcnum].snesposreal=realsnespos;
922 270 pushpc[pushpcnum].snesstartreal=realstartpos;
923 270 pushpc[pushpcnum].freeid=freespaceid;
924 270 pushpc[pushpcnum].freest=freespacestart;
925 270 pushpcnum++;
926 270 }
927
928 270 static void pop_pc()
929 {
930 270 pushpcnum--;
931 270 snespos=pushpc[pushpcnum].snespos;
932 270 startpos=pushpc[pushpcnum].snesstart;
933 270 realsnespos=pushpc[pushpcnum].snesposreal;
934 270 realstartpos=pushpc[pushpcnum].snesstartreal;
935 270 freespaceid=pushpc[pushpcnum].freeid;
936 270 freespacestart=pushpc[pushpcnum].freest;
937 270 }
938
939
940 984 string handle_print(char* input)
941 {
942 498 string out;
943
1/2
✓ Branch 0 taken 984 times.
✗ Branch 1 not taken.
984 autoptr<char**> pars = qpsplit(input, ',');
944
1/2
✓ Branch 0 taken 984 times.
✗ Branch 1 not taken.
984 verify_paren(pars);
945
2/2
✓ Branch 0 taken 1659 times.
✓ Branch 1 taken 966 times.
2625 for (int i = 0; pars[i]; i++)
946 {
947 if (0);
948
4/6
✓ Branch 0 taken 1218 times.
✓ Branch 1 taken 441 times.
✓ Branch 2 taken 1218 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 615 times.
✗ Branch 5 not taken.
1659 else if (pars[i][0] == '"') out += safedequote(pars[i]);
949
5/6
✓ Branch 0 taken 234 times.
✓ Branch 1 taken 207 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 198 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
441 else if (!stricmp(pars[i], "bytes")) out += dec(bytes);
950
5/6
✓ Branch 0 taken 207 times.
✓ Branch 1 taken 198 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 189 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
405 else if (!stricmp(pars[i], "freespaceuse")) out += dec(freespaceuse);
951
3/6
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 198 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 189 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
387 else if (!stricmp(pars[i], "pc")) out += hex((unsigned int)(snespos & 0xFFFFFF), 6);
952
3/4
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 108 times.
✓ Branch 3 taken 36 times.
531 else if (!strncasecmp(pars[i], "bin(", strlen("bin(")) ||
953
4/4
✓ Branch 0 taken 258 times.
✓ Branch 1 taken 39 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 36 times.
405 !strncasecmp(pars[i], "dec(", strlen("dec(")) ||
954
6/6
✓ Branch 0 taken 297 times.
✓ Branch 1 taken 90 times.
✓ Branch 2 taken 180 times.
✓ Branch 3 taken 42 times.
✓ Branch 4 taken 252 times.
✓ Branch 5 taken 18 times.
792 !strncasecmp(pars[i], "hex(", strlen("hex(")) ||
955
2/2
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 9 times.
144 !strncasecmp(pars[i], "double(", strlen("double(")))
956 {
957 369 char * arg1pos = strchr(pars[i], '(') + 1;
958 369 char * endpos = strchr(arg1pos, '\0');
959
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 738 times.
✓ Branch 2 taken 369 times.
✓ Branch 3 taken 369 times.
738 while (*endpos == ' ' || *endpos == '\0') endpos--;
960
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 369 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
369 if (*endpos != ')') asar_throw_error(0, error_type_block, error_id_invalid_print_function_syntax);
961
1/2
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
369 string paramstr = string(arg1pos, (int)(endpos - arg1pos));
962
963 int numargs;
964
1/2
✓ Branch 0 taken 369 times.
✗ Branch 1 not taken.
369 autoptr<char**> params = qpsplit(paramstr.temp_raw(), ',', &numargs);
965
1/2
✓ Branch 0 taken 369 times.
✗ Branch 1 not taken.
369 verify_paren(params);
966
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 369 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
369 if (numargs > 2) asar_throw_error(0, error_type_block, error_id_wrong_num_parameters);
967 189 int precision = 0;
968 369 bool hasprec = numargs == 2;
969
2/2
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 189 times.
369 if (hasprec)
970 {
971
1/2
✓ Branch 0 taken 234 times.
✗ Branch 1 not taken.
234 precision = getnum(params[1]);
972
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 234 times.
234 if (precision < 0) precision = 0;
973
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 117 times.
234 if (precision > 64) precision = 64;
974 }
975 369 *(arg1pos - 1) = '\0'; // allows more convenient comparsion functions
976
4/4
✓ Branch 0 taken 225 times.
✓ Branch 1 taken 144 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 135 times.
369 if (!stricmp(pars[i], "bin"))
977 {
978 // sadly printf doesn't have binary, so let's roll our own
979
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 int64_t value = getnum(params[0]);
980 char buffer[65];
981
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 72 times.
90 if (value < 0) {
982
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 out += '-';
983 18 value = -value;
984 // decrement precision because we've output one char already
985 18 precision -= 1;
986
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if (precision<0) precision = 0;
987 }
988
2/2
✓ Branch 0 taken 5760 times.
✓ Branch 1 taken 90 times.
5850 for (int j = 0; j < 64; j++) {
989 5760 buffer[63 - j] = '0' + ((value & (1ull << j)) >> j);
990 }
991 90 buffer[64] = 0;
992 45 int startidx = 0;
993
4/4
✓ Branch 0 taken 5184 times.
✓ Branch 1 taken 72 times.
✓ Branch 2 taken 5166 times.
✓ Branch 3 taken 18 times.
5256 while (startidx < 64 - precision && buffer[startidx] == '0') startidx++;
994
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
90 if (startidx == 64) startidx--; // always want to print at least one digit
995
1/2
✓ Branch 0 taken 45 times.
✗ Branch 1 not taken.
90 out += buffer + startidx;
996 }
997
4/4
✓ Branch 0 taken 174 times.
✓ Branch 1 taken 105 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 99 times.
279 else if (!stricmp(pars[i], "dec"))
998 {
999
1/2
✓ Branch 0 taken 75 times.
✗ Branch 1 not taken.
75 int64_t value = getnum(params[0]);
1000 char buffer[65];
1001
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
75 snprintf(buffer, 65, "%0*" PRId64, precision, value);
1002
1/2
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
75 out += buffer;
1003 }
1004
4/4
✓ Branch 0 taken 141 times.
✓ Branch 1 taken 63 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 63 times.
204 else if (!stricmp(pars[i], "hex"))
1005 {
1006
1/2
✓ Branch 0 taken 78 times.
✗ Branch 1 not taken.
78 int64_t value = getnum(params[0]);
1007 char buffer[65];
1008
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
78 snprintf(buffer, 65, "%0*" PRIX64, precision, value);
1009
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
78 out += buffer;
1010 }
1011
2/4
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 63 times.
✗ Branch 3 not taken.
126 else if (!stricmp(pars[i], "double"))
1012 {
1013
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 18 times.
126 if (!hasprec) precision = 5;
1014
3/6
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 63 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 63 times.
✗ Branch 5 not taken.
126 out += ftostrvar(getnumdouble(params[0]), precision);
1015 }
1016 369 }
1017
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 else asar_throw_error(2, error_type_block, error_id_unknown_variable);
1018 }
1019 1455 return out;
1020 1002 }
1021
1022 // single_line_for_tracker is:
1023 // 0 if not in first block of line, not in (single-line) for loop
1024 // 1 if first block of line
1025 // 2 if in single-line for loop
1026 // 3 if after endfor (of a single-line loop)
1027 157122 void assembleblock(const char * block, int& single_line_for_tracker)
1028 {
1029 #define is(test) (!stricmpwithlower(word[0], test))
1030 #define is0(test) (numwords==1 && !stricmpwithlower(word[0], test))
1031 #define is1(test) (numwords==2 && !stricmpwithlower(word[0], test))
1032 #define is2(test) (numwords==3 && !stricmpwithlower(word[0], test))
1033 #define is3(test) (numwords==4 && !stricmpwithlower(word[0], test))
1034 #define par word[1]
1035
1036
1/2
✓ Branch 0 taken 75405 times.
✗ Branch 1 not taken.
75405 callstack_push cs_push(callstack_entry_type::BLOCK, block);
1037
1038 int numwords;
1039
1/2
✓ Branch 0 taken 75405 times.
✗ Branch 1 not taken.
75405 string splitblock = block;
1040
1/2
✓ Branch 0 taken 157122 times.
✗ Branch 1 not taken.
157122 char ** word = qsplit(splitblock.temp_raw(), ' ', &numwords);
1041 75405 autoptr<char **> scope_word = word;
1042 // when writing out the data for the addrToLine mapping,
1043 // we want to write out the snespos we had before writing opcodes
1044 157122 int addrToLinePos = realsnespos & 0xFFFFFF;
1045
1046
14/14
✓ Branch 0 taken 150129 times.
✓ Branch 1 taken 9684 times.
✓ Branch 2 taken 148014 times.
✓ Branch 3 taken 2115 times.
✓ Branch 4 taken 85959 times.
✓ Branch 5 taken 62055 times.
✓ Branch 6 taken 84519 times.
✓ Branch 7 taken 1440 times.
✓ Branch 8 taken 146454 times.
✓ Branch 9 taken 120 times.
✓ Branch 10 taken 2691 times.
✓ Branch 11 taken 143763 times.
✓ Branch 12 taken 1353 times.
✓ Branch 13 taken 75345 times.
159813 while (numif==numtrue && word[0] && (!word[1] || strcmp(word[1], "=")) && addlabel(word[0]))
1047 {
1048 2691 word++;
1049 2691 numwords--;
1050 }
1051
4/4
✓ Branch 0 taken 154887 times.
✓ Branch 1 taken 2115 times.
✓ Branch 2 taken 80640 times.
✓ Branch 3 taken 74247 times.
157002 if (!word[0] || !word[0][0]) return;
1052
12/12
✓ Branch 0 taken 107208 times.
✓ Branch 1 taken 1644 times.
✓ Branch 2 taken 106218 times.
✓ Branch 3 taken 990 times.
✓ Branch 4 taken 106128 times.
✓ Branch 5 taken 90 times.
✓ Branch 6 taken 100350 times.
✓ Branch 7 taken 5778 times.
✓ Branch 8 taken 53355 times.
✓ Branch 9 taken 46995 times.
✓ Branch 10 taken 4773 times.
✓ Branch 11 taken 46473 times.
108852 if (is("if") || is("elseif") || is("assert") || is("while") || is("for"))
1053 {
1054 4773 string errmsg;
1055 4773 whiletracker wstatus;
1056
1/2
✓ Branch 0 taken 9546 times.
✗ Branch 1 not taken.
9546 wstatus.startline = get_current_line();
1057 9546 wstatus.iswhile = is("while");
1058 9546 wstatus.cond = false;
1059 9546 wstatus.is_for = false;
1060 9546 wstatus.for_start = wstatus.for_end = wstatus.for_cur = 0;
1061 9546 wstatus.for_has_var_backup = false;
1062
2/2
✓ Branch 0 taken 1044 times.
✓ Branch 1 taken 8502 times.
9546 if(is("for")) wstatus.is_for = true;
1063
1064 4773 bool is_for_cont = false;
1065 // if this is a for loop and a whilestatus entry already exists at this level,
1066 // and the for loop isn't finished, this is a continuation of the for loop
1067
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.
6338 if (is("for") && whilestatus.count > numif && whilestatus[numif].is_for
1068
9/10
✓ Branch 0 taken 1044 times.
✓ Branch 1 taken 8502 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 4404 times.
10566 && whilestatus[numif].for_cur < whilestatus[numif].for_end)
1069 369 is_for_cont = true;
1070
5/8
✓ Branch 0 taken 369 times.
✓ Branch 1 taken 4404 times.
✓ Branch 2 taken 369 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4404 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4404 times.
✗ Branch 7 not taken.
9546 whiletracker& addedwstatus = is_for_cont ? whilestatus[numif] : (whilestatus[numif] = wstatus);
1071
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 9456 times.
9546 if (is("assert"))
1072 {
1073
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 autoptr<char**> tokens = qpsplit(word[numwords - 1], ',');
1074
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 verify_paren(tokens);
1075
5/6
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 54 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 27 times.
90 if (tokens[0] != NULL && tokens[1] != NULL)
1076 {
1077 18 string rawerrmsg;
1078 18 size_t pos = 1;
1079
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 36 times.
162 while (tokens[pos])
1080 {
1081
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
126 rawerrmsg += tokens[pos];
1082
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 36 times.
126 if (tokens[pos + 1] != NULL)
1083 {
1084
1/2
✓ Branch 0 taken 45 times.
✗ Branch 1 not taken.
90 rawerrmsg += ",";
1085 }
1086 63 pos++;
1087 }
1088
1089
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());
1090 36 }
1091 90 }
1092
1093 //handle nested if statements
1094
8/8
✓ Branch 0 taken 1008 times.
✓ Branch 1 taken 8538 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 4530 times.
9546 if (numtrue!=numif && !(is("elseif") && numtrue+1==numif))
1095 {
1096
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++;
1097 243 return;
1098 }
1099
8/8
✓ Branch 0 taken 7560 times.
✓ Branch 1 taken 1500 times.
✓ Branch 2 taken 1926 times.
✓ Branch 3 taken 5634 times.
✓ Branch 4 taken 990 times.
✓ Branch 5 taken 936 times.
✓ Branch 6 taken 4062 times.
✓ Branch 7 taken 468 times.
9060 if ((is("if") || is("while") || is("for"))) numif++;
1100
1101
2/2
✓ Branch 0 taken 15912 times.
✓ Branch 1 taken 9060 times.
24972 for(int i = 1; i < numwords - 1; i++)
1102 {
1103 15912 word[i][strlen(word[i])] = ' ';
1104 }
1105 9060 numwords = 2;
1106
1107 bool cond;
1108
2/2
✓ Branch 0 taken 8070 times.
✓ Branch 1 taken 990 times.
9060 if(!is("for"))
1109 {
1110
1/2
✓ Branch 0 taken 8070 times.
✗ Branch 1 not taken.
8070 cond = getnum(word[1]);
1111
8/10
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 7890 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 4035 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 45 times.
8070 if (foundlabel && !foundlabel_static && !is("assert")) asar_throw_error(1, error_type_block, error_id_label_in_conditional, word[0]);
1112 }
1113
1114
2/2
✓ Branch 0 taken 990 times.
✓ Branch 1 taken 7980 times.
8970 if (is("for"))
1115 {
1116
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 990 times.
990 if(single_line_for_tracker != 1)
1117 {
1118 numif--;
1119 asar_throw_error(0, error_type_line, error_id_bad_single_line_for);
1120 }
1121
1122
2/2
✓ Branch 0 taken 252 times.
✓ Branch 1 taken 738 times.
990 if(!is_for_cont)
1123 {
1124 252 char* past_eq = strchr(word[1], '=');
1125
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
252 if(!past_eq)
1126 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "missing loop range");
1127
1128
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 string varname(word[1], past_eq - word[1]);
1129 252 past_eq += 1;
1130
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 strip_whitespace(varname);
1131
2/4
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 252 times.
252 if(!validatedefinename(varname))
1132 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "invalid define name");
1133
1134
1/2
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
252 char* range_sep = strqpstr(past_eq, "..");
1135
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
252 if(!range_sep)
1136 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "invalid loop range");
1137
1138
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 string for_start(past_eq, range_sep - past_eq);
1139
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 strip_whitespace(for_start);
1140
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 string for_end(range_sep+2);
1141
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 strip_whitespace(for_end);
1142
1143
1/2
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
252 addedwstatus.for_start = getnum(for_start);
1144
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 if(foundlabel && !foundlabel_static)
1145 asar_throw_error(0, error_type_block, error_id_label_in_conditional, "for");
1146
1/2
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
252 addedwstatus.for_end = getnum(for_end);
1147
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 if(foundlabel && !foundlabel_static)
1148 asar_throw_error(0, error_type_block, error_id_label_in_conditional, "for");
1149
1150
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 addedwstatus.for_variable = varname;
1151 252 addedwstatus.for_cur = addedwstatus.for_start;
1152 252 }
1153 738 else addedwstatus.for_cur++;
1154
1155 990 addedwstatus.cond = addedwstatus.for_cur < addedwstatus.for_end;
1156 990 single_line_for_tracker = 2;
1157
2/2
✓ Branch 0 taken 738 times.
✓ Branch 1 taken 252 times.
990 if(addedwstatus.cond)
1158 {
1159
2/2
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 81 times.
738 numtrue++;
1160
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))
1161 {
1162 576 addedwstatus.for_has_var_backup = true;
1163
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);
1164 }
1165
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);
1166 }
1167 }
1168
6/6
✓ Branch 0 taken 6570 times.
✓ Branch 1 taken 1410 times.
✓ Branch 2 taken 3285 times.
✓ Branch 3 taken 3285 times.
✓ Branch 4 taken 3522 times.
✓ Branch 5 taken 468 times.
7980 else if (is("if") || is("while"))
1169 {
1170 if(0);
1171
2/2
✓ Branch 0 taken 5754 times.
✓ Branch 1 taken 1290 times.
7044 else if (cond)
1172 {
1173 5754 numtrue++;
1174
1/2
✓ Branch 0 taken 2877 times.
✗ Branch 1 not taken.
5754 elsestatus[numif]=true;
1175 }
1176
1/2
✓ Branch 0 taken 645 times.
✗ Branch 1 not taken.
645 else if (!cond)
1177 {
1178
1/2
✓ Branch 0 taken 645 times.
✗ Branch 1 not taken.
1290 elsestatus[numif]=false;
1179 }
1180 7044 addedwstatus.cond = cond;
1181 }
1182
2/2
✓ Branch 0 taken 846 times.
✓ Branch 1 taken 90 times.
936 else if (is("elseif"))
1183 {
1184
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);
1185
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);
1186
2/2
✓ Branch 0 taken 324 times.
✓ Branch 1 taken 522 times.
846 if (numif==numtrue) numtrue--;
1187
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])
1188 {
1189 234 numtrue++;
1190
1/2
✓ Branch 0 taken 117 times.
✗ Branch 1 not taken.
234 elsestatus[numif]=true;
1191 }
1192 }
1193 // otherwise, must be assert command
1194
4/4
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 60 times.
✓ Branch 2 taken 24 times.
✓ Branch 3 taken 6 times.
90 else if (pass == 2 && !cond)
1195 {
1196
7/10
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 12 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.
48 if (errmsg) asar_throw_error(2, error_type_block, error_id_assertion_failed, (string(": ") + errmsg).data());
1197
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 else asar_throw_error(2, error_type_block, error_id_assertion_failed, ".");
1198 }
1199
4/4
✓ Branch 0 taken 4473 times.
✓ Branch 1 taken 243 times.
✓ Branch 2 taken 4473 times.
✓ Branch 3 taken 243 times.
9903 }
1200
14/14
✓ Branch 0 taken 18405 times.
✓ Branch 1 taken 80901 times.
✓ Branch 2 taken 16761 times.
✓ Branch 3 taken 1644 times.
✓ Branch 4 taken 16761 times.
✓ Branch 5 taken 80901 times.
✓ Branch 6 taken 10983 times.
✓ Branch 7 taken 5778 times.
✓ Branch 8 taken 10983 times.
✓ Branch 9 taken 80901 times.
✓ Branch 10 taken 1044 times.
✓ Branch 11 taken 9939 times.
✓ Branch 12 taken 4233 times.
✓ Branch 13 taken 42240 times.
99306 else if (is0("endif") || is0("endwhile") || is0("endfor"))
1201 {
1202
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8466 times.
8466 if (!numif)
1203 asar_throw_error(1, error_type_block, error_id_misplaced_endif);
1204
1/2
✓ Branch 0 taken 4233 times.
✗ Branch 1 not taken.
8466 whiletracker& thisws = whilestatus[numif - 1];
1205
1206
3/4
✓ Branch 0 taken 1644 times.
✓ Branch 1 taken 5778 times.
✓ Branch 2 taken 1644 times.
✗ Branch 3 not taken.
7422 if((!thisws.is_for && !thisws.iswhile && !is("endif")) ||
1207
7/8
✓ Branch 0 taken 7422 times.
✓ Branch 1 taken 1044 times.
✓ Branch 2 taken 5778 times.
✓ Branch 3 taken 2688 times.
✓ Branch 4 taken 5778 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 522 times.
✓ Branch 7 taken 7944 times.
20121 (thisws.iswhile && !is("endwhile")) ||
1208
3/4
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 4233 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 522 times.
4755 (thisws.is_for && !is("endfor")))
1209 asar_throw_error(1, error_type_block, error_id_misplaced_endif);
1210
1211
2/2
✓ Branch 0 taken 6258 times.
✓ Branch 1 taken 2208 times.
8466 if (numif==numtrue) numtrue--;
1212 8466 numif--;
1213
1214
2/2
✓ Branch 0 taken 1044 times.
✓ Branch 1 taken 7422 times.
8466 if(thisws.is_for)
1215 {
1216
2/2
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 864 times.
1044 if(single_line_for_tracker == 2) single_line_for_tracker = 3;
1217
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1044 times.
1044 if(moreonline)
1218 {
1219 // sabotage the whilestatus to prevent the loop running again
1220 // and spamming more of the same error
1221 thisws.for_cur = thisws.for_end;
1222 thisws.cond = false;
1223 asar_throw_error(0, error_type_block, error_id_bad_single_line_for);
1224 }
1225
1226
2/2
✓ Branch 0 taken 738 times.
✓ Branch 1 taken 306 times.
1044 if(thisws.cond)
1227 {
1228
2/2
✓ Branch 0 taken 576 times.
✓ Branch 1 taken 162 times.
738 if(thisws.for_has_var_backup)
1229
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;
1230 else
1231
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 defines.remove(thisws.for_variable);
1232 }
1233 }
1234 }
1235
6/6
✓ Branch 0 taken 9939 times.
✓ Branch 1 taken 80901 times.
✓ Branch 2 taken 4956 times.
✓ Branch 3 taken 4983 times.
✓ Branch 4 taken 399 times.
✓ Branch 5 taken 41841 times.
90840 else if (is0("else"))
1236 {
1237
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 798 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
798 if (!numif) asar_throw_error(1, error_type_block, error_id_misplaced_else);
1238
5/12
✓ Branch 0 taken 798 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 798 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 399 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 399 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 399 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
798 if (whilestatus[numif - 1].iswhile || whilestatus[numif - 1].is_for) asar_throw_error(1, error_type_block, error_id_else_in_while_loop);
1239
2/2
✓ Branch 0 taken 318 times.
✓ Branch 1 taken 480 times.
798 else if (numif==numtrue) numtrue--;
1240
8/8
✓ Branch 0 taken 444 times.
✓ Branch 1 taken 36 times.
✓ Branch 2 taken 309 times.
✓ Branch 3 taken 135 times.
✓ Branch 4 taken 87 times.
✓ Branch 5 taken 135 times.
✓ Branch 6 taken 87 times.
✓ Branch 7 taken 153 times.
702 else if (numif==numtrue+1 && !elsestatus[numif])
1241 {
1242 174 numtrue++;
1243
1/2
✓ Branch 0 taken 87 times.
✗ Branch 1 not taken.
174 elsestatus[numif]=true;
1244 }
1245 }
1246
2/2
✓ Branch 0 taken 48201 times.
✓ Branch 1 taken 41841 times.
90042 else if (numif!=numtrue) return;
1247
4/4
✓ Branch 0 taken 84816 times.
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 29013 times.
✓ Branch 3 taken 55803 times.
84846 else if (asblock_pick(word, numwords))
1248 {
1249
1/2
✓ Branch 0 taken 29013 times.
✗ Branch 1 not taken.
29013 add_addr_to_line(addrToLinePos);
1250 29013 numopcodes += recent_opcode_num;
1251 }
1252
12/12
✓ Branch 0 taken 52374 times.
✓ Branch 1 taken 3429 times.
✓ Branch 2 taken 40776 times.
✓ Branch 3 taken 11598 times.
✓ Branch 4 taken 40614 times.
✓ Branch 5 taken 162 times.
✓ Branch 6 taken 38826 times.
✓ Branch 7 taken 1788 times.
✓ Branch 8 taken 288 times.
✓ Branch 9 taken 38538 times.
✓ Branch 10 taken 6939 times.
✓ Branch 11 taken 17778 times.
55803 else if (numwords > 1 && (is("db") || is("dw") || is("dl") || is("dd")))
1253 {
1254 6939 string line;
1255
2/2
✓ Branch 0 taken 13836 times.
✓ Branch 1 taken 13836 times.
27672 for(int i = 1; i < numwords; i++){
1256
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13836 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
13836 if(i > 1) line += " ";
1257
1/2
✓ Branch 0 taken 6939 times.
✗ Branch 1 not taken.
13836 line += word[i];
1258 }
1259
1/2
✓ Branch 0 taken 13836 times.
✗ Branch 1 not taken.
13836 autoptr<char**> pars=qpsplit(line.temp_raw(), ',');
1260
1/2
✓ Branch 0 taken 13836 times.
✗ Branch 1 not taken.
13836 verify_paren(pars);
1261
1262 void (*do_write)(unsigned int);
1263 13836 char first = to_lower(word[0][1]);
1264
2/2
✓ Branch 0 taken 6939 times.
✓ Branch 1 taken 6897 times.
13836 if (first == 'b') do_write = &write1;
1265
2/2
✓ Branch 0 taken 1119 times.
✓ Branch 1 taken 1119 times.
2238 else if (first == 'w') do_write = &write2;
1266
2/2
✓ Branch 0 taken 1038 times.
✓ Branch 1 taken 1038 times.
2076 else if (first == 'l') do_write = &write3;
1267 144 else do_write = &write4;
1268
1269
2/2
✓ Branch 0 taken 16326 times.
✓ Branch 1 taken 13770 times.
30096 for (int i=0;pars[i];i++)
1270 {
1271
2/2
✓ Branch 0 taken 669 times.
✓ Branch 1 taken 15657 times.
16326 if (pars[i][0]=='"')
1272 {
1273
1/2
✓ Branch 0 taken 669 times.
✗ Branch 1 not taken.
669 char * str=const_cast<char*>(safedequote(pars[i]));
1274 669 int codepoint = 0u;
1275
1/2
✓ Branch 0 taken 669 times.
✗ Branch 1 not taken.
669 str += utf8_val(&codepoint, str);
1276
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 )
1277 {
1278
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));
1279
1/2
✓ Branch 0 taken 2718 times.
✗ Branch 1 not taken.
2718 str += utf8_val(&codepoint, str);
1280 }
1281
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);
1282 }
1283 else
1284 {
1285
5/6
✓ Branch 0 taken 5213 times.
✓ Branch 1 taken 10444 times.
✓ Branch 2 taken 5147 times.
✓ Branch 3 taken 66 times.
✓ Branch 4 taken 15591 times.
✗ Branch 5 not taken.
15657 do_write((pass==2)?getnum(pars[i]):0);
1286 }
1287 }
1288
1/2
✓ Branch 0 taken 13770 times.
✗ Branch 1 not taken.
13770 add_addr_to_line(addrToLinePos);
1289 13902 }
1290
2/2
✓ Branch 0 taken 1566 times.
✓ Branch 1 taken 40401 times.
41967 else if(word[0][0]=='%')
1291 {
1292
2/2
✓ Branch 0 taken 1530 times.
✓ Branch 1 taken 36 times.
1566 callmacro(strchr(block, '%')+1);
1293 }
1294
6/6
✓ Branch 0 taken 35898 times.
✓ Branch 1 taken 4503 times.
✓ Branch 2 taken 21168 times.
✓ Branch 3 taken 14730 times.
✓ Branch 4 taken 180 times.
✓ Branch 5 taken 16815 times.
40401 else if (is1("undef"))
1295 {
1296
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);
1297
1298
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))
1299 {
1300
1/2
✓ Branch 0 taken 342 times.
✗ Branch 1 not taken.
342 defines.remove(def);
1301 }
1302 else
1303 {
1304
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());
1305 }
1306 360 }
1307
6/6
✓ Branch 0 taken 1881 times.
✓ Branch 1 taken 38160 times.
✓ Branch 2 taken 927 times.
✓ Branch 3 taken 954 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 16806 times.
40041 else if (is0("error"))
1308 {
1309
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_error_command, ".");
1310 }
1311
6/6
✓ Branch 0 taken 1863 times.
✓ Branch 1 taken 38160 times.
✓ Branch 2 taken 918 times.
✓ Branch 3 taken 945 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 16797 times.
40023 else if (is0("warn"))
1312 {
1313
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 asar_throw_warning(2, warning_id_warn_command, ".");
1314 }
1315
6/6
✓ Branch 0 taken 35538 times.
✓ Branch 1 taken 4467 times.
✓ Branch 2 taken 20991 times.
✓ Branch 3 taken 14547 times.
✓ Branch 4 taken 21 times.
✓ Branch 5 taken 16776 times.
40005 else if (is1("error"))
1316 {
1317
1/2
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
39 string out = handle_print(par);
1318 // RPG Hacker: This used to be on pass 0, which had its merits (you don't want to miss a potentially critical
1319 // user-generated error, just because a bazillion other errors are thrown in passes before it). However, I
1320 // don't see how to support print functions with this without moving it to pass 2. Suggestions are welcome.
1321
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());
1322 39 }
1323
6/6
✓ Branch 0 taken 35499 times.
✓ Branch 1 taken 4467 times.
✓ Branch 2 taken 20973 times.
✓ Branch 3 taken 14526 times.
✓ Branch 4 taken 21 times.
✓ Branch 5 taken 16755 times.
39966 else if (is1("warn"))
1324 {
1325
1/2
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
39 string out = handle_print(par);
1326
3/6
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 21 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
39 asar_throw_warning(2, warning_id_warn_command, (string(": ") + out).data());
1327 39 }
1328
6/6
✓ Branch 0 taken 35460 times.
✓ Branch 1 taken 4467 times.
✓ Branch 2 taken 20952 times.
✓ Branch 3 taken 14508 times.
✓ Branch 4 taken 72 times.
✓ Branch 5 taken 16683 times.
39927 else if (is1("warnings"))
1329 {
1330
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)
1331 {
1332
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 push_warnings();
1333 }
1334
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)
1335 {
1336
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 18 times.
72 pull_warnings();
1337 }
1338 else
1339 {
1340 asar_throw_error(0, error_type_block, error_id_broken_command, "warnings", "Unknown parameter");
1341 }
1342 }
1343
6/6
✓ Branch 0 taken 2424 times.
✓ Branch 1 taken 37359 times.
✓ Branch 2 taken 1212 times.
✓ Branch 3 taken 1212 times.
✓ Branch 4 taken 126 times.
✓ Branch 5 taken 16557 times.
39783 else if (is2("warnings"))
1344 {
1345
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)
1346 {
1347
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 asar_warning_id warnid = parse_warning_id_from_string(word[2]);
1348
1349
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
54 if (warnid != warning_id_end)
1350 {
1351
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 set_warning_enabled(warnid, true);
1352 }
1353 else
1354 {
1355
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_invalid_warning_id, word[2], "warnings enable");
1356 }
1357 }
1358
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)
1359 {
1360
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 asar_warning_id warnid = parse_warning_id_from_string(word[2]);
1361
1362
2/2
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 36 times.
198 if (warnid != warning_id_end)
1363 {
1364
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 set_warning_enabled(warnid, false);
1365 }
1366 else
1367 {
1368
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
36 asar_throw_error(0, error_type_block, error_id_invalid_warning_id, word[2], "warnings disable");
1369 }
1370 }
1371 else
1372 {
1373 asar_throw_error(0, error_type_block, error_id_broken_command, "warnings", "Unknown parameter");
1374 }
1375 }
1376
6/6
✓ Branch 0 taken 35316 times.
✓ Branch 1 taken 4215 times.
✓ Branch 2 taken 20880 times.
✓ Branch 3 taken 14436 times.
✓ Branch 4 taken 63 times.
✓ Branch 5 taken 16494 times.
39531 else if(is1("global"))
1377 {
1378
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))
1379 {
1380
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]);
1381 }
1382 }
1383
6/6
✓ Branch 0 taken 2172 times.
✓ Branch 1 taken 37233 times.
✓ Branch 2 taken 1086 times.
✓ Branch 3 taken 1086 times.
✓ Branch 4 taken 105 times.
✓ Branch 5 taken 16389 times.
39405 else if (is2("check"))
1384 {
1385
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)
1386 {
1387 // RPG Hacker: Removed trimming for now - I think requiring an exact match is probably
1388 // better here (not sure, though, it's worth discussing)
1389
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]);
1390 // randomdude999: this also removes leading spaces because itrim gets stuck in an endless
1391 // loop when multi is true and one argument is empty
1392 // in hirom the rom needs to be an entire bank for it to have a title, other modes only need 0x8000 bytes
1393
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
1394 {
1395 if (!ignoretitleerrors) // title errors shouldn't be ignored
1396 asar_throw_error(0, error_type_block, error_id_rom_too_short, expected_title.data());
1397 else // title errors should be ignored, throw a warning anyways
1398 asar_throw_warning(0, warning_id_rom_too_short, expected_title.data());
1399 }
1400 else {
1401 9 string actual_title;
1402 9 string actual_display_title;
1403
2/2
✓ Branch 0 taken 378 times.
✓ Branch 1 taken 18 times.
396 for (int i = 0;i < 21;i++)
1404 {
1405
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
378 unsigned char c = romdata[snestopc(0x00FFC0 + i)];
1406
1/2
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
378 actual_title += (char)c;
1407 // the replacements are from interface-cli.cpp
1408
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == 7) c = 14;
1409
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == 8) c = 27;
1410
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == 9) c = 26;
1411
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == '\r') c = 17;
1412
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == '\n') c = 25;
1413
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 378 times.
378 if (c == '\0') c = 155;
1414
1/2
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
378 actual_display_title += (char)c;
1415 }
1416
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (strncmp(expected_title, actual_title, 21) != 0)
1417 {
1418 if (!ignoretitleerrors) // title errors shouldn't be ignored
1419 asar_throw_error(0, error_type_block, error_id_rom_title_incorrect, expected_title.data(), actual_display_title.data());
1420 else // title errors should be ignored, throw a warning anyways
1421 asar_throw_warning(0, warning_id_rom_title_incorrect, expected_title.data(), actual_display_title.data());
1422 }
1423 18 }
1424 18 }
1425
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)
1426 {
1427 if (0);
1428
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"))
1429 {
1430 90 disable_bank_cross_errors = true;
1431 }
1432
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"))
1433 {
1434 96 disable_bank_cross_errors = false;
1435 96 check_half_banks_crossed = true;
1436 }
1437
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"))
1438 {
1439 6 disable_bank_cross_errors = false;
1440 6 check_half_banks_crossed = false;
1441 }
1442 else asar_throw_error(0, error_type_block, error_id_invalid_check);
1443
1444 }
1445 else
1446 {
1447 asar_throw_error(0, error_type_block, error_id_invalid_check);
1448 }
1449 }
1450
9/10
✓ Branch 0 taken 1845 times.
✓ Branch 1 taken 37350 times.
✓ Branch 2 taken 1845 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 35190 times.
✓ Branch 5 taken 4005 times.
✓ Branch 6 taken 108 times.
✓ Branch 7 taken 35082 times.
✓ Branch 8 taken 54 times.
✓ Branch 9 taken 16335 times.
39195 else if (is0("asar") || is1("asar"))
1451 {
1452
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);
1453
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 54 times.
198 if (!par) return;
1454 54 int dots=0;
1455 54 int dig=0;
1456
2/2
✓ Branch 0 taken 450 times.
✓ Branch 1 taken 108 times.
558 for (int i=0;par[i];i++)
1457 {
1458
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 324 times.
450 if (par[i]=='.')
1459 {
1460
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);
1461 63 dig=0;
1462 126 dots++;
1463 }
1464
1/2
✓ Branch 0 taken 324 times.
✗ Branch 1 not taken.
324 else if (is_digit(par[i])) dig++;
1465 else asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1466 }
1467
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);
1468
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 autoptr<char**> vers=split(par, '.');
1469 108 int vermaj=atoi(vers[0]);
1470
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);
1471
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 18 times.
108 if (vermaj<asarver_maj) return;
1472
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (dots==1)
1473 {
1474 if (strlen(vers[1])!=2) asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1475 //if (asarver_min<10 && asarver_bug<10 && strlen(vers[1])>2) error(0, "This version of Asar is too old for this patch.");
1476 int verminbug=atoi(vers[1]);
1477 int tmpver=asarver_bug;
1478 if (tmpver>9) tmpver=9;
1479 if (asarver_min*10+tmpver<verminbug) asar_throw_error(pass, error_type_fatal, error_id_asar_too_old);
1480 }
1481 else
1482 {
1483 18 int vermin=atoi(vers[1]);
1484
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);
1485 18 int verbug=atoi(vers[2]);
1486
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);
1487 }
1488
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 45 times.
108 }
1489
10/10
✓ Branch 0 taken 1845 times.
✓ Branch 1 taken 37242 times.
✓ Branch 2 taken 1839 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 35082 times.
✓ Branch 5 taken 3999 times.
✓ Branch 6 taken 18 times.
✓ Branch 7 taken 35064 times.
✓ Branch 8 taken 12 times.
✓ Branch 9 taken 16323 times.
39087 else if (is0("include") || is1("includefrom"))
1490 {
1491
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);
1492
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())
1493 {
1494
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());
1495
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, "");
1496 }
1497 }
1498
6/6
✓ Branch 0 taken 1839 times.
✓ Branch 1 taken 37224 times.
✓ Branch 2 taken 906 times.
✓ Branch 3 taken 933 times.
✓ Branch 4 taken 45 times.
✓ Branch 5 taken 16278 times.
39063 else if (is0("includeonce"))
1499 {
1500
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 const char* current_file = get_current_file_name();
1501
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))
1502 {
1503
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);
1504 }
1505 }
1506
6/6
✓ Branch 0 taken 1962 times.
✓ Branch 1 taken 37011 times.
✓ Branch 2 taken 1701 times.
✓ Branch 3 taken 261 times.
✓ Branch 4 taken 261 times.
✓ Branch 5 taken 720 times.
38973 else if (numwords==3 && !stricmp(word[1], "="))
1507 {
1508
3/4
✓ Branch 0 taken 1206 times.
✓ Branch 1 taken 234 times.
✓ Branch 2 taken 1206 times.
✗ Branch 3 not taken.
1440 if(word[0][0] == '\'' && word[0][1])
1509 {
1510 int codepoint;
1511 1206 const char* char_start = word[0]+1;
1512
1/2
✓ Branch 0 taken 1206 times.
✗ Branch 1 not taken.
1206 const char* after = char_start + utf8_val(&codepoint, char_start);
1513
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);
1514
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') {
1515
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]));
1516
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);
1517 1188 return;
1518 } // todo: error checking here
1519 }
1520 // randomdude999: int cast b/c i'm too lazy to also mess with making setlabel()
1521 // unsigned, besides it wouldn't matter anyways.
1522
1/2
✓ Branch 0 taken 234 times.
✗ Branch 1 not taken.
234 int num=(int)getnum(word[2]);
1523
5/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 198 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
234 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_label_cross_assignment);
1524
1525 216 const char* newlabelname = word[0];
1526 108 bool ismacro = false;
1527
1528
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 198 times.
216 if (newlabelname[0] == '?')
1529 {
1530 9 ismacro = true;
1531 18 newlabelname++;
1532 }
1533
1534
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 99 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
117 if (ismacro && macrorecursion == 0)
1535 {
1536 asar_throw_error(0, error_type_block, error_id_macro_label_outside_of_macro);
1537 }
1538
1539
3/7
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 144 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 72 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
216 if (!confirmname(newlabelname)) asar_throw_error(0, error_type_block, error_id_invalid_label_name);
1540
1541 108 string completename;
1542
1543
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 198 times.
216 if (ismacro)
1544 {
1545
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) + "_";
1546 }
1547
1548
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
216 completename += newlabelname;
1549
1550
2/4
✓ Branch 0 taken 216 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 108 times.
✗ Branch 3 not taken.
216 setlabel(ns + completename, num, true);
1551 216 }
1552
3/4
✓ Branch 0 taken 37533 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36828 times.
✓ Branch 3 taken 705 times.
37533 else if (assemblemapper(word, numwords)) {}
1553
6/6
✓ Branch 0 taken 35007 times.
✓ Branch 1 taken 1821 times.
✓ Branch 2 taken 20769 times.
✓ Branch 3 taken 14238 times.
✓ Branch 4 taken 1203 times.
✓ Branch 5 taken 13989 times.
36828 else if (is1("org"))
1554 {
1555
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2364 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2364 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
1556
1/2
✓ Branch 0 taken 1203 times.
✗ Branch 1 not taken.
2364 freespaceend();
1557
1/2
✓ Branch 0 taken 2364 times.
✗ Branch 1 not taken.
2364 unsigned int num=getnum(par);
1558
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2364 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2364 if (forwardlabel) asar_throw_error(0, error_type_block, error_id_org_label_forward);
1559
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2364 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2364 if (num&~0xFFFFFF) asar_throw_error(1, error_type_block, error_id_snes_address_out_of_bounds, hex(num, 6).data());
1560
5/10
✓ Branch 0 taken 813 times.
✓ Branch 1 taken 1551 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 795 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1569 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
2364 if ((mapper==lorom || mapper==exlorom) && (num&0x408000)==0x400000 && (num&0x700000)!=0x700000) asar_throw_warning(0, warning_id_set_middle_byte);
1561 //if (fastrom) num|=0x800000;
1562 2364 snespos=(int)num;
1563 2364 realsnespos=(int)num;
1564 2364 startpos=(int)num;
1565 2364 realstartpos=(int)num;
1566 2364 snespos_valid = true;
1567 }
1568 #define ret_error(errid) { asar_throw_error(0, error_type_block, errid); return; }
1569 #define ret_error_params(errid, ...) { asar_throw_error(0, error_type_block, errid, __VA_ARGS__); return; }
1570
2/2
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 34194 times.
34464 else if (is("struct"))
1571 {
1572 //verifysnespos();
1573
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);
1574
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);
1575
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);
1576
3/7
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 180 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 90 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
270 if (!confirmname(word[1])) ret_error(error_id_invalid_struct_name);
1577
1578
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]);
1579
1580 270 static_struct = false;
1581 270 old_snespos = snespos;
1582 270 old_startpos = startpos;
1583 270 old_optimizeforbank = optimizeforbank;
1584 270 old_snespos_valid = snespos_valid;
1585 135 unsigned int base = 0;
1586
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 180 times.
270 if (numwords == 3)
1587 {
1588 90 static_struct = true;
1589
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 base = getnum(word[2]);
1590
1591
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;
1592 }
1593
1594 270 bool old_in_struct = in_struct;
1595 270 bool old_in_sub_struct = in_sub_struct;
1596
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;
1597 270 in_sub_struct = numwords == 4;
1598
1599 #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; }
1600 #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; }
1601
1602
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 180 times.
270 if (numwords == 3)
1603 {
1604
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());
1605 90 snespos = (int)base;
1606 90 startpos = (int)base;
1607 }
1608
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 108 times.
180 else if (numwords == 4)
1609 {
1610
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);
1611
3/7
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
72 if (!confirmname(word[3])) ret_error_cleanup(error_id_struct_invalid_parent_name);
1612
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 string tmp_struct_parent = word[3];
1613
1614
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());
1615
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);
1616
1617 72 static_struct = structure.is_static;
1618
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 struct_parent = tmp_struct_parent;
1619 72 snespos = structure.base_end;
1620 72 startpos = structure.base_end;
1621
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
72 }
1622
1623
1/2
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
270 push_pc();
1624
1625 270 optimizeforbank = -1;
1626
1627
1/2
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
270 struct_name = word[1];
1628 270 struct_base = snespos;
1629 270 realsnespos = 0;
1630 270 realstartpos = 0;
1631 270 snespos_valid = true;
1632
1633
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);
1634
1635 #undef ret_error_cleanup
1636 #undef ret_error_params_cleanup
1637 }
1638
2/2
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 33924 times.
34194 else if (is("endstruct"))
1639 {
1640
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);
1641
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);
1642
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);
1643
1644
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;
1645
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);
1646
1647 135 snes_struct structure;
1648 270 structure.base_end = snespos;
1649 270 structure.struct_size = alignment * ((snespos - struct_base + alignment - 1) / alignment);
1650 270 structure.object_size = structure.struct_size;
1651 270 structure.is_static = static_struct;
1652
1653
2/2
✓ Branch 0 taken 198 times.
✓ Branch 1 taken 72 times.
270 if (in_struct)
1654 {
1655
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;
1656 }
1657
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 else if (in_sub_struct)
1658 {
1659 36 snes_struct parent;
1660
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);
1661
1662
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 if (parent.object_size < parent.struct_size + structure.struct_size) {
1663 72 parent.object_size = parent.struct_size + structure.struct_size;
1664 }
1665
1666
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;
1667
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;
1668 36 }
1669
1670
1/2
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
270 pop_pc();
1671 270 in_struct = false;
1672 270 in_sub_struct = false;
1673 270 snespos = old_snespos;
1674 270 startpos = old_startpos;
1675 270 optimizeforbank = old_optimizeforbank;
1676 270 snespos_valid = old_snespos_valid;
1677 270 static_struct = false;
1678 135 }
1679 #undef ret_error
1680
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 33906 times.
33924 else if(is("spcblock"))
1681 {
1682 //banned features when active: org, freespace(and variants), arch, mapper,namespace,pushns
1683
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(in_struct || in_sub_struct) asar_throw_error(0, error_type_block, error_id_spcblock_inside_struct);
1684
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if(numwords < 2) asar_throw_error(0, error_type_block, error_id_spcblock_too_few_args);
1685
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if(numwords > 4) asar_throw_error(0, error_type_block, error_id_spcblock_too_many_args);
1686
1687
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 spcblock.destination = getnum(par);
1688 18 spcblock.type = spcblock_nspc;
1689
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
9 spcblock.macro_name = "";
1690
1691
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 (spcblock.destination&~0xFFFF) asar_throw_error(0, error_type_block, error_id_snes_address_out_of_bounds, hex(spcblock.destination, 6).data());
1692
1693
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if(numwords == 3)
1694 {
1695 if(!stricmp(word[2], "nspc")) spcblock.type = spcblock_nspc;
1696 else if(!stricmp(word[2], "custom")) asar_throw_error(0, error_type_block, error_id_custom_spcblock_missing_macro);
1697 else asar_throw_error(0, error_type_block, error_id_unknown_spcblock_type);
1698 }
1699
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 else if(numwords == 4)
1700 {
1701 if(!stricmp(word[2], "custom")) spcblock.type = spcblock_custom;
1702 else asar_throw_error(0, error_type_block, error_id_extra_spcblock_arg_for_type);
1703
1704 if(macros.exists(word[3]))
1705 {
1706 macrodata *macro = macros.find(word[3]);
1707 if(!macro->variadic) asar_throw_error(0, error_type_block, error_id_spcblock_macro_must_be_varadic);
1708 if(macro->numargs != 3) asar_throw_error(0, error_type_block, error_id_spcblock_macro_invalid_static_args);
1709 spcblock.macro_name = word[3];
1710 }
1711 else asar_throw_error(0, error_type_block, error_id_spcblock_macro_doesnt_exist);
1712 }
1713
1714
1/3
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
18 switch(spcblock.type)
1715 {
1716 18 case spcblock_nspc:
1717 18 spcblock.size_address=realsnespos;
1718
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write2(0x0000);
1719
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write2(spcblock.destination);
1720 18 snespos=(int)spcblock.destination;
1721 18 startpos=(int)spcblock.destination;
1722 18 spcblock.execute_address = -1u;
1723
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 add_addr_to_line(addrToLinePos);
1724 9 break;
1725 case spcblock_custom:
1726 //this is a todo that probably won't be ready for 1.9
1727 //mostly so we can leverage some cleanups we make in 2.0 for practicality
1728 asar_throw_error(0, error_type_block, error_id_spcblock_custom_types_incomplete);
1729 push_pc();
1730 spcblock.old_mapper = mapper;
1731 mapper = norom;
1732 break;
1733 default:
1734 asar_throw_error(0, error_type_fatal, error_id_internal_error, "invalid spcblock type");
1735 }
1736
1737
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
9 ns_backup = ns;
1738
3/6
✓ 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.
18 ns = STR":SPCBLOCK:_" + ns_backup;
1739 18 in_spcblock = true;
1740 }
1741
6/6
✓ Branch 0 taken 849 times.
✓ Branch 1 taken 33057 times.
✓ Branch 2 taken 423 times.
✓ Branch 3 taken 426 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 13701 times.
33906 else if(is0("endspcblock"))
1742 {
1743
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if(!in_spcblock) asar_throw_error(0, error_type_block, error_id_endspcblock_without_spcblock);
1744
1745
1/3
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
18 switch(spcblock.type)
1746 {
1747 18 case spcblock_nspc:
1748
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 12 times.
18 if (pass==2)
1749 {
1750
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6 int pcpos=snestopc(spcblock.size_address&0xFFFFFF);
1751
1/6
✗ 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.
6 if (pcpos<0) asar_throw_error(2, error_type_block, error_id_snes_address_doesnt_map_to_rom, hex((unsigned int)realsnespos, 6).data());
1752 6 int num=snespos-startpos;
1753
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 writeromdata_byte(pcpos, (unsigned char)num);
1754
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 writeromdata_byte(pcpos+1, (unsigned char)(num >> 8));
1755 }
1756
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if(spcblock.execute_address != -1u)
1757 {
1758
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write2(0x0000);
1759
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write2((unsigned int)spcblock.execute_address);
1760 }
1761 9 break;
1762 case spcblock_custom:
1763 mapper = spcblock.old_mapper;
1764 pop_pc();
1765 break;
1766 default:
1767 asar_throw_error(0, error_type_fatal, error_id_internal_error, "invalid spcblock type");
1768 }
1769
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
9 ns = ns_backup;
1770 18 in_spcblock = false;
1771 }
1772
6/6
✓ Branch 0 taken 32517 times.
✓ Branch 1 taken 1371 times.
✓ Branch 2 taken 19503 times.
✓ Branch 3 taken 13014 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 13692 times.
33888 else if (is1("startpos"))
1773 {
1774
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if(!in_spcblock) asar_throw_error(0, error_type_block, error_id_startpos_without_spcblock);
1775
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 spcblock.execute_address=getnum(par);
1776 }
1777
6/6
✓ Branch 0 taken 32499 times.
✓ Branch 1 taken 1371 times.
✓ Branch 2 taken 19494 times.
✓ Branch 3 taken 13005 times.
✓ Branch 4 taken 135 times.
✓ Branch 5 taken 13557 times.
33870 else if (is1("base"))
1778 {
1779
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"))
1780 {
1781 90 snespos=realsnespos;
1782 90 startpos=realstartpos;
1783 90 snespos_valid = realsnespos >= 0;
1784 90 return;
1785 }
1786
1/2
✓ Branch 0 taken 180 times.
✗ Branch 1 not taken.
180 unsigned int num=getnum(par);
1787
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);
1788
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());
1789 180 snespos=(int)num;
1790 180 startpos=(int)num;
1791 180 optimizeforbank=-1;
1792 180 snespos_valid = realsnespos >= 0;
1793 }
1794
6/6
✓ Branch 0 taken 32229 times.
✓ Branch 1 taken 1371 times.
✓ Branch 2 taken 19359 times.
✓ Branch 3 taken 12870 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 13539 times.
33600 else if (is1("dpbase"))
1795 {
1796
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 unsigned int num=(int)getnum(par);
1797
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);
1798
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());
1799 36 dp_base = (int)num;
1800 }
1801
6/6
✓ Branch 0 taken 414 times.
✓ Branch 1 taken 33150 times.
✓ Branch 2 taken 207 times.
✓ Branch 3 taken 207 times.
✓ Branch 4 taken 54 times.
✓ Branch 5 taken 13485 times.
33564 else if (is2("optimize"))
1802 {
1803
4/4
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 18 times.
108 if (!stricmp(par, "dp"))
1804 {
1805
4/4
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 27 times.
72 if (!stricmp(word[2], "none"))
1806 {
1807 18 optimize_dp = optimize_dp_flag::NONE;
1808 18 return;
1809 }
1810
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"))
1811 {
1812 18 optimize_dp = optimize_dp_flag::RAM;
1813 18 return;
1814 }
1815
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"))
1816 {
1817 36 optimize_dp = optimize_dp_flag::ALWAYS;
1818 36 return;
1819 }
1820 asar_throw_error(1, error_type_block, error_id_bad_dp_optimize, word[2]);
1821 }
1822
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
36 if (!stricmp(par, "address"))
1823 {
1824
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
36 if (!stricmp(word[2], "default"))
1825 {
1826 optimize_address = optimize_address_flag::DEFAULT;
1827 return;
1828 }
1829
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(word[2], "ram"))
1830 {
1831 18 optimize_address = optimize_address_flag::RAM;
1832 18 return;
1833 }
1834
2/4
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
18 if (!stricmp(word[2], "mirrors"))
1835 {
1836 18 optimize_address = optimize_address_flag::MIRRORS;
1837 18 return;
1838 }
1839 asar_throw_error(1, error_type_block, error_id_bad_address_optimize, word[2]);
1840 }
1841 asar_throw_error(1, error_type_block, error_id_bad_optimize, par);
1842 }
1843
6/6
✓ Branch 0 taken 32193 times.
✓ Branch 1 taken 1263 times.
✓ Branch 2 taken 19341 times.
✓ Branch 3 taken 12852 times.
✓ Branch 4 taken 27 times.
✓ Branch 5 taken 13458 times.
33456 else if (is1("bank"))
1844 {
1845
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"))
1846 {
1847 18 optimizeforbank=-1;
1848 18 return;
1849 }
1850
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"))
1851 {
1852 18 optimizeforbank=0x100;
1853 18 return;
1854 }
1855
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 unsigned int num=getnum(par);
1856 //if (forwardlabel) error(0, "bank Label is not valid");
1857 //if (foundlabel) num>>=16;
1858
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());
1859 18 optimizeforbank=(int)num;
1860 }
1861
10/10
✓ Branch 0 taken 33384 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 30180 times.
✓ Branch 3 taken 3204 times.
✓ Branch 4 taken 29298 times.
✓ Branch 5 taken 882 times.
✓ Branch 6 taken 17892 times.
✓ Branch 7 taken 11406 times.
✓ Branch 8 taken 2187 times.
✓ Branch 9 taken 11271 times.
33402 else if (is("freespace") || is("freecode") || is("freedata") || is("segment"))
1862 {
1863
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4374 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4374 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
1864 2187 string parstr;
1865
3/4
✓ Branch 0 taken 378 times.
✓ Branch 1 taken 3996 times.
✓ Branch 2 taken 189 times.
✗ Branch 3 not taken.
4374 if (numwords==1) parstr="\n";//crappy hack: impossible character to cut out extra commas
1866
2/4
✓ Branch 0 taken 3996 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1998 times.
✗ Branch 3 not taken.
3996 else if (numwords==2) parstr=word[1];
1867 else asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1868
5/8
✓ Branch 0 taken 3204 times.
✓ Branch 1 taken 1170 times.
✓ Branch 2 taken 1602 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1602 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1602 times.
✗ Branch 7 not taken.
5976 if (is("freecode")) parstr=STR"ram,"+parstr;
1869
5/8
✓ Branch 0 taken 882 times.
✓ Branch 1 taken 3492 times.
✓ Branch 2 taken 441 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 441 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 441 times.
✗ Branch 7 not taken.
4815 if (is("freedata")) parstr=STR"noram,"+parstr;
1870
5/8
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 4104 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.
4509 if (is("segment")) parstr = STR "norats," + parstr;
1871
1/2
✓ Branch 0 taken 4374 times.
✗ Branch 1 not taken.
4374 autoptr<char**> pars=split(parstr.temp_raw(), ',');
1872 2187 unsigned char fsbyte = 0x00;
1873 2187 bool fixedpos=false;
1874 2187 bool align=false;
1875 2187 bool leakwarn=true;
1876 2187 bool write_rats=true;
1877 2187 int target_bank = -3;
1878
1/2
✓ Branch 0 taken 2187 times.
✗ Branch 1 not taken.
2187 string pin_to_freespace = "";
1879 2187 int search_start_pos = -1;
1880
1881
2/2
✓ Branch 0 taken 8766 times.
✓ Branch 1 taken 4374 times.
13140 for (int i=0;pars[i];i++)
1882 {
1883
2/2
✓ Branch 0 taken 8388 times.
✓ Branch 1 taken 378 times.
8766 if (pars[i][0]=='\n') {}
1884
4/4
✓ Branch 0 taken 5796 times.
✓ Branch 1 taken 2592 times.
✓ Branch 2 taken 1602 times.
✓ Branch 3 taken 2592 times.
8388 else if (!stricmp(pars[i], "ram"))
1885 {
1886
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3204 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3204 if (target_bank!=-3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1887 1602 target_bank = -2;
1888 }
1889
4/4
✓ Branch 0 taken 3033 times.
✓ Branch 1 taken 2151 times.
✓ Branch 2 taken 441 times.
✓ Branch 3 taken 2151 times.
5184 else if (!stricmp(pars[i], "noram"))
1890 {
1891
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 882 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
882 if (target_bank!=-3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1892 441 target_bank = -1;
1893 }
1894
4/4
✓ Branch 0 taken 2169 times.
✓ Branch 1 taken 2133 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 2133 times.
4302 else if (!stricmp(pars[i], "static"))
1895 {
1896
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);
1897 18 fixedpos=true;
1898 }
1899
4/4
✓ Branch 0 taken 2151 times.
✓ Branch 1 taken 2115 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 2115 times.
4266 else if (!stricmp(pars[i], "align"))
1900 {
1901
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);
1902 18 align=true;
1903 }
1904
4/4
✓ Branch 0 taken 3996 times.
✓ Branch 1 taken 234 times.
✓ Branch 2 taken 1881 times.
✓ Branch 3 taken 234 times.
4230 else if (!stricmp(pars[i], "cleaned"))
1905 {
1906
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3762 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3762 if (!leakwarn) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1907 1881 leakwarn=false;
1908 }
1909
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"))
1910 {
1911 135 write_rats=false;
1912 }
1913
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 108 times.
198 else if (stribegin(pars[i], "bank="))
1914 {
1915
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);
1916
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 target_bank = getnum(pars[i] + 5);
1917
2/6
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
90 if(foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
1918 }
1919
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 72 times.
108 else if (stribegin(pars[i], "start="))
1920 {
1921
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 search_start_pos = getnum(pars[i] + 6);
1922
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);
1923 }
1924
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 else if (stribegin(pars[i], "pin="))
1925 {
1926 // TODO: should we handle posneg labels here too?
1927
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
72 string pin_to = pars[i] + 4;
1928 72 const char* pin_to_c = pin_to.data();
1929
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);
1930
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);
1931 // this is to throw an "undefined label" error with the proper callstack
1932
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);
1933 72 }
1934 else if (stribegin(pars[i], "cleanbyte="))
1935 {
1936 fsbyte = getnum(pars[i] + strlen("cleanbyte="));
1937 if(foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
1938 }
1939 else
1940 {
1941 // for backwards compat i guess
1942 fsbyte = (unsigned char)getnum(pars[i]);
1943 }
1944 }
1945
3/4
✓ Branch 0 taken 2187 times.
✓ Branch 1 taken 2187 times.
✓ Branch 2 taken 99 times.
✗ Branch 3 not taken.
4374 if(target_bank == -3 && !write_rats) target_bank = -1;
1946
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4275 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4275 if(target_bank == -3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1947 // no point specifying anything about cleaning when not writing a rats tag
1948
4/8
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 4104 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.
4374 if(!write_rats && (!leakwarn || fixedpos)) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1949
2/2
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 2052 times.
2187 if(!write_rats) leakwarn = false;
1950
1/2
✓ Branch 0 taken 2187 times.
✗ Branch 1 not taken.
4374 freespaceend();
1951
1/2
✓ Branch 0 taken 2187 times.
✗ Branch 1 not taken.
4374 freespaceid=getfreespaceid();
1952
1/2
✓ Branch 0 taken 2187 times.
✗ Branch 1 not taken.
2187 freespace_data& thisfs = freespaces[freespaceid];
1953 4374 thisfs.cleanbyte = fsbyte;
1954
1955
1/2
✓ Branch 0 taken 2187 times.
✗ Branch 1 not taken.
4374 thisfs.pin_target = pin_to_freespace;
1956
5/6
✓ Branch 0 taken 2223 times.
✓ Branch 1 taken 2151 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 2151 times.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
4374 if(pin_to_freespace) thisfs.pin_target_ns = ns;
1957 4374 thisfs.write_rats = write_rats;
1958 4374 thisfs.search_start = search_start_pos;
1959 4374 thisfs.bank = target_bank;
1960 4374 thisfs.flag_align = align;
1961
1962
2/2
✓ Branch 0 taken 1458 times.
✓ Branch 1 taken 2916 times.
4374 if (pass==0) snespos=0;
1963
2/2
✓ Branch 0 taken 1458 times.
✓ Branch 1 taken 2916 times.
4374 if (pass==1)
1964 {
1965
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1446 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
1458 if (fixedpos && thisfs.orgpos<0)
1966 {
1967 thisfs.pos = 0;
1968 thisfs.leaked = false;//mute some other errors
1969 asar_throw_error(1, error_type_block, error_id_static_freespace_autoclean);
1970 }
1971 1458 snespos = 0;
1972 }
1973
2/2
✓ Branch 0 taken 1458 times.
✓ Branch 1 taken 2916 times.
4374 if (pass==2)
1974 {
1975
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1446 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
1458 if (fixedpos && thisfs.orgpos == -1) return;//to kill some errors
1976 1458 snespos=thisfs.pos;
1977
3/6
✓ Branch 0 taken 1338 times.
✓ Branch 1 taken 120 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1338 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1458 if (thisfs.leaked && leakwarn) asar_throw_warning(2, warning_id_freespace_leaked);
1978
2/2
✓ Branch 0 taken 729 times.
✓ Branch 1 taken 729 times.
1458 freespaceuse += (write_rats ? 8 : 0) + thisfs.len;
1979
1980 // add a mapping for the start of the rats tag
1981
3/4
✓ Branch 0 taken 1368 times.
✓ Branch 1 taken 90 times.
✓ Branch 2 taken 1368 times.
✗ Branch 3 not taken.
1458 if (write_rats) add_addr_to_line(snespos-8);
1982 }
1983 4374 thisfs.is_static = fixedpos;
1984
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 4374 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.
4374 if (snespos < 0 && mapper == sa1rom) asar_throw_error(pass, error_type_fatal, error_id_no_freespace_in_mapped_banks, dec(thisfs.len).data());
1985
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 4374 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4374 if (snespos < 0) asar_throw_error(pass, error_type_fatal, error_id_no_freespace, dec(thisfs.len).data());
1986
2/2
✓ Branch 0 taken 2187 times.
✓ Branch 1 taken 2187 times.
4374 bytes+=write_rats ? 8 : 0;
1987 4374 freespacestart=snespos;
1988 4374 startpos=snespos;
1989 4374 realstartpos=snespos;
1990 4374 realsnespos=snespos;
1991 4374 optimizeforbank=-1;
1992
2/2
✓ Branch 0 taken 2187 times.
✓ Branch 1 taken 2187 times.
4374 ratsmetastate=write_rats ? ratsmeta_allow : ratsmeta_ban;
1993 4374 snespos_valid = true;
1994 // check this at the very end so that snespos gets set properly, to
1995 // prevent spurious errors later
1996 //...i guess this can still cause bankcross errors if the old freespace
1997 //happened to be very close to the end of a bank or something, but
1998 //whatever
1999
7/8
✓ Branch 0 taken 1458 times.
✓ Branch 1 taken 2916 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 1446 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
4374 if (pass == 2 && fixedpos && thisfs.orgpos > 0 && thisfs.len > thisfs.orglen)
2000
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 asar_throw_error(2, error_type_block, error_id_static_freespace_growing);
2001
3/6
✓ Branch 0 taken 2184 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2184 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2184 times.
✗ Branch 5 not taken.
4386 }
2002
6/6
✓ Branch 0 taken 28143 times.
✓ Branch 1 taken 885 times.
✓ Branch 2 taken 17316 times.
✓ Branch 3 taken 10827 times.
✓ Branch 4 taken 63 times.
✓ Branch 5 taken 11208 times.
29028 else if (is1("prot"))
2003 {
2004
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);
2005
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);
2006
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 90 times.
126 if (ratsmetastate==ratsmeta_used) step(-5);
2007 int num;
2008
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 autoptr<char**> pars=qpsplit(par, ',', &num);
2009
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 verify_paren(pars);
2010
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('P');
2011
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('R');
2012
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('O');
2013
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('T');
2014
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);
2015
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 write1((unsigned int)(num*3));
2016
2/2
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 126 times.
288 for (int i=0;i<num;i++)
2017 {
2018 //int num=getnum(pars[i]);
2019 162 const char * labeltest=pars[i];
2020
1/2
✓ Branch 0 taken 81 times.
✗ Branch 1 not taken.
81 string testlabel = labeltest;
2021
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 snes_label lblval = labelval(&labeltest);
2022
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());
2023
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 write3(lblval.pos);
2024
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;
2025 162 }
2026
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('S');
2027
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('T');
2028
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('O');
2029
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('P');
2030
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1(0);
2031 126 ratsmetastate=ratsmeta_used;
2032
2033
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 add_addr_to_line(addrToLinePos);
2034 126 }
2035
9/10
✓ Branch 0 taken 28017 times.
✓ Branch 1 taken 885 times.
✓ Branch 2 taken 28017 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 306 times.
✓ Branch 5 taken 28596 times.
✓ Branch 6 taken 198 times.
✓ Branch 7 taken 108 times.
✓ Branch 8 taken 99 times.
✓ Branch 9 taken 11109 times.
28902 else if (is1("autoclean") || is2("autoclean"))
2036 {
2037
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 198 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
198 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2038
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 if (numwords==3)
2039 {
2040
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 198 times.
198 if(freespaceid > 0)
2041 asar_throw_error(0, error_type_block, error_id_autoclean_in_freespace);
2042 198 const char * labeltest = word[2];
2043
1/2
✓ Branch 0 taken 99 times.
✗ Branch 1 not taken.
99 string testlabel = labeltest;
2044
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 snes_label lblval = labelval(&labeltest);
2045
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 198 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
198 if (*labeltest) asar_throw_error(0, error_type_block, error_id_label_not_found, testlabel.data());
2046 198 int targetid= lblval.freespace_id;
2047
3/4
✓ Branch 0 taken 66 times.
✓ Branch 1 taken 132 times.
✓ Branch 2 taken 33 times.
✗ Branch 3 not taken.
231 if (pass==1) freespaces[targetid].leaked = false;
2048 198 int num = lblval.pos;
2049
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 198 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
198 if (strlen(par)>3 && !stricmp(par+3, ".l")) par[3]=0;
2050
7/8
✓ Branch 0 taken 153 times.
✓ Branch 1 taken 45 times.
✓ Branch 2 taken 99 times.
✓ Branch 3 taken 54 times.
✓ Branch 4 taken 54 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✓ Branch 7 taken 45 times.
198 if (!stricmp(par, "JSL") || !stricmp(par, "JML"))
2051 {
2052
1/2
✓ Branch 0 taken 60 times.
✗ Branch 1 not taken.
180 int orgpos=read3(snespos+1);
2053
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
180 int ratsloc=freespaces[targetid].orgpos;
2054
4/4
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 45 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 45 times.
180 int firstbyte = ((!stricmp(par, "JSL")) ? 0x22 : 0x5C);
2055
1/2
✓ Branch 0 taken 60 times.
✗ Branch 1 not taken.
180 int pcpos=snestopc(snespos);
2056
4/6
✓ Branch 0 taken 180 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 180 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 72 times.
✓ Branch 5 taken 108 times.
180 if (/*pass==1 && */pcpos>=0 && pcpos<romlen_r && romdata_r[pcpos]==firstbyte)
2057 {
2058
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 ratsloc=ratsstart(orgpos)+8;
2059
3/5
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 times.
✗ Branch 4 not taken.
72 freespaces[targetid].orglen=read2(ratsloc-4)+1;
2060
10/12
✓ Branch 0 taken 66 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 39 times.
✓ Branch 3 taken 27 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 21 times.
✓ Branch 6 taken 9 times.
✓ Branch 7 taken 27 times.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
81 if (!freespaces[targetid].is_static && pass==1) removerats(orgpos, freespaces[targetid].cleanbyte);
2061 }
2062
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 36 times.
108 else if (ratsloc<0) ratsloc=0;
2063
1/2
✓ Branch 0 taken 180 times.
✗ Branch 1 not taken.
180 write1((unsigned int)firstbyte);
2064
1/2
✓ Branch 0 taken 180 times.
✗ Branch 1 not taken.
180 write3((unsigned int)num);
2065
2/2
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 120 times.
180 if (pass==2)
2066 {
2067
1/2
✓ Branch 0 taken 60 times.
✗ Branch 1 not taken.
60 int start=ratsstart(num);
2068
3/4
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 30 times.
60 if (start>=num || start<0)
2069 {
2070 asar_throw_error(2, error_type_block, error_id_autoclean_label_at_freespace_end);
2071 }
2072
2073
1/2
✓ Branch 0 taken 60 times.
✗ Branch 1 not taken.
60 add_addr_to_line(addrToLinePos);
2074 }
2075 //freespaceorglen[targetid]=read2(ratsloc-4)+1;
2076
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
180 freespaces[targetid].orgpos = ratsloc;
2077 90 }
2078
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, "dl"))
2079 {
2080
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
18 int orgpos=read3(snespos);
2081
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 int ratsloc=freespaces[targetid].orgpos;
2082
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 int start=ratsstart(num);
2083
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
18 if (pass==1 && num>=0)
2084 {
2085
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 ratsloc=ratsstart(orgpos)+8;
2086
4/8
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
9 if (!freespaces[targetid].is_static) removerats(orgpos, freespaces[targetid].cleanbyte);
2087 }
2088
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 else if (!ratsloc) ratsloc=0;
2089
5/6
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
18 if ((start==num || start<0) && pass==2)
2090 asar_throw_error(2, error_type_block, error_id_autoclean_label_at_freespace_end);
2091
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write3((unsigned int)num);
2092
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 freespaces[targetid].orgpos = ratsloc;
2093
3/5
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
18 freespaces[targetid].orglen = read2(ratsloc-4)+1;
2094
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 add_addr_to_line(addrToLinePos);
2095 }
2096 else asar_throw_error(0, error_type_block, error_id_broken_autoclean);
2097 198 }
2098 // weird gotcha: we don't know the freespace id here, so we don't know what clean_byte to use
2099 else if (pass==0) removerats((int)getnum(word[1]), 0x00);
2100 }
2101
6/6
✓ Branch 0 taken 453 times.
✓ Branch 1 taken 28251 times.
✓ Branch 2 taken 225 times.
✓ Branch 3 taken 228 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11100 times.
28704 else if (is0("pushpc"))
2102 {
2103
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 verifysnespos();
2104
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].arch=arch;
2105
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snespos=snespos;
2106
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snesstart=startpos;
2107
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snesposreal=realsnespos;
2108
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snesstartreal=realstartpos;
2109
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].freeid=freespaceid;
2110
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].freest=freespacestart;
2111 18 pushpcnum++;
2112 18 snespos=(int)0xFFFFFFFF;
2113 18 startpos= (int)0xFFFFFFFF;
2114 18 realsnespos= (int)0xFFFFFFFF;
2115 18 realstartpos= (int)0xFFFFFFFF;
2116 18 snespos_valid = false;
2117 }
2118
6/6
✓ Branch 0 taken 435 times.
✓ Branch 1 taken 28251 times.
✓ Branch 2 taken 216 times.
✓ Branch 3 taken 219 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11091 times.
28686 else if (is0("pullpc"))
2119 {
2120
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);
2121 18 pushpcnum--;
2122
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 freespaceend();
2123
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);
2124
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 snespos=pushpc[pushpcnum].snespos;
2125
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 startpos=pushpc[pushpcnum].snesstart;
2126
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 realsnespos=pushpc[pushpcnum].snesposreal;
2127
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 realstartpos=pushpc[pushpcnum].snesstartreal;
2128
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 freespaceid=pushpc[pushpcnum].freeid;
2129
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 freespacestart=pushpc[pushpcnum].freest;
2130 18 snespos_valid = true;
2131 }
2132
6/6
✓ Branch 0 taken 417 times.
✓ Branch 1 taken 28251 times.
✓ Branch 2 taken 207 times.
✓ Branch 3 taken 210 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11082 times.
28668 else if (is0("pushbase"))
2133 {
2134
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 basestack[basestacknum] = snespos;
2135 18 basestacknum++;
2136 }
2137
6/6
✓ Branch 0 taken 399 times.
✓ Branch 1 taken 28251 times.
✓ Branch 2 taken 198 times.
✓ Branch 3 taken 201 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11073 times.
28650 else if (is0("pullbase"))
2138 {
2139
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);
2140 18 basestacknum--;
2141
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 snespos = basestack[basestacknum];
2142
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 startpos = basestack[basestacknum];
2143
2144
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if (snespos != realstartpos)
2145 {
2146 18 optimizeforbank = -1;
2147 }
2148 }
2149
6/6
✓ Branch 0 taken 381 times.
✓ Branch 1 taken 28251 times.
✓ Branch 2 taken 189 times.
✓ Branch 3 taken 192 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 11055 times.
28632 else if (is0("pushns"))
2150 {
2151
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);
2152
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;
2153
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 36 times.
72 for(int i = 0; i < namespace_list.count; i++)
2154 {
2155
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]);
2156 }
2157
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 pushns[pushnsnum].nested_namespaces = nested_namespaces;
2158 36 pushnsnum++;
2159
2160
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 namespace_list.reset();
2161
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 ns = "";
2162 36 nested_namespaces = false;
2163 }
2164
6/6
✓ Branch 0 taken 345 times.
✓ Branch 1 taken 28251 times.
✓ Branch 2 taken 171 times.
✓ Branch 3 taken 174 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 11037 times.
28596 else if (is0("pullns"))
2165 {
2166
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);
2167
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);
2168 36 pushnsnum--;
2169
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;
2170
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 nested_namespaces = pushns[pushnsnum].nested_namespaces;
2171
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 namespace_list.reset();
2172
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++)
2173 {
2174
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]);
2175 }
2176 }
2177
9/10
✓ Branch 0 taken 28017 times.
✓ Branch 1 taken 543 times.
✓ Branch 2 taken 27636 times.
✓ Branch 3 taken 381 times.
✓ Branch 4 taken 108 times.
✓ Branch 5 taken 28071 times.
✓ Branch 6 taken 108 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 246 times.
✓ Branch 9 taken 10791 times.
28560 else if (is1("namespace") || is2("namespace"))
2178 {
2179
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);
2180 246 bool leave = false;
2181
1/2
✓ Branch 0 taken 489 times.
✗ Branch 1 not taken.
489 if (par)
2182 {
2183
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"))
2184 {
2185
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);
2186 72 leave = true;
2187 }
2188
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"))
2189 {
2190
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);
2191
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;
2192
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;
2193 }
2194 else
2195 {
2196
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);
2197
1/2
✓ Branch 0 taken 237 times.
✗ Branch 1 not taken.
237 const char * tmpstr= safedequote(par);
2198
3/7
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 156 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 81 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
237 if (!confirmname(tmpstr)) asar_throw_error(0, error_type_block, error_id_invalid_namespace_name);
2199
2/2
✓ Branch 0 taken 93 times.
✓ Branch 1 taken 144 times.
237 if (!nested_namespaces)
2200 {
2201
1/2
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
93 namespace_list.reset();
2202 }
2203
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);
2204 }
2205 }
2206 else
2207 {
2208 leave = true;
2209 }
2210
2211
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 174 times.
246 if (leave)
2212 {
2213
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 36 times.
144 if (nested_namespaces)
2214 {
2215
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 namespace_list.remove(namespace_list.count - 1);
2216 }
2217 else
2218 {
2219
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 namespace_list.reset();
2220 }
2221 }
2222
2223 // recompute ns
2224
1/2
✓ Branch 0 taken 246 times.
✗ Branch 1 not taken.
246 ns = "";
2225
2/2
✓ Branch 0 taken 579 times.
✓ Branch 1 taken 489 times.
1068 for (int i = 0; i < namespace_list.count; i++)
2226 {
2227
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];
2228
1/2
✓ Branch 0 taken 291 times.
✗ Branch 1 not taken.
579 ns += "_";
2229 }
2230 }
2231
6/6
✓ Branch 0 taken 27636 times.
✓ Branch 1 taken 435 times.
✓ Branch 2 taken 17064 times.
✓ Branch 3 taken 10572 times.
✓ Branch 4 taken 36 times.
✓ Branch 5 taken 10755 times.
28071 else if (is1("warnpc"))
2232 {
2233
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 unsigned int maxpos=getnum(par);
2234
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
72 if (freespaceid > 0) asar_throw_error(0, error_type_block, error_id_warnpc_in_freespace);
2235
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
54 if ((unsigned int)maxpos & 0xFF000000) asar_throw_error(0, error_type_block, error_id_warnpc_broken_param);
2236
6/8
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 9 times.
63 if ((unsigned int)snespos > maxpos) asar_throw_error(0, error_type_block, error_id_warnpc_failed, hex((unsigned int)snespos).data(), hex((unsigned int)maxpos, 6).data());
2237 }
2238 #ifdef SANDBOX
2239 else if (is("incsrc") || is("incbin") || is("table"))
2240 {
2241 asar_throw_error(0, error_type_block, error_id_command_disabled);
2242 }
2243 #endif
2244
6/6
✓ Branch 0 taken 27564 times.
✓ Branch 1 taken 435 times.
✓ Branch 2 taken 10530 times.
✓ Branch 3 taken 17034 times.
✓ Branch 4 taken 8739 times.
✓ Branch 5 taken 2016 times.
27999 else if (is1("incsrc"))
2245 {
2246 8739 string name;
2247 // RPG Hacker: Should this also throw on absolute paths?
2248 // E.g., on something starting with C:/ or whatever.
2249
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 23958 times.
23976 if (strchr(par, '\\'))
2250 {
2251
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_platform_paths);
2252 }
2253
2/4
✓ Branch 0 taken 23958 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8730 times.
✗ Branch 3 not taken.
23958 name=safedequote(par);
2254
2/2
✓ Branch 0 taken 474 times.
✓ Branch 1 taken 23484 times.
23958 assemblefile(name);
2255 23976 }
2256
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"))
2257 {
2258 int len;
2259 108 int start=0;
2260 108 int end=0;
2261
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 90 times.
216 if (strqchr(par, ':'))
2262 {
2263 63 char * lengths=strqchr(par, ':');
2264 126 *lengths=0;
2265 126 lengths++;
2266
2267
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 char* split = strqpstr(lengths, "..");
2268
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);
2269
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 string start_str(lengths, split-lengths);
2270
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);
2271
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 start = getnum(start_str);
2272
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);
2273
1/2
✓ Branch 0 taken 45 times.
✗ Branch 1 not taken.
90 string end_str(split+2);
2274
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);
2275
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 end = getnum(end_str);
2276
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);
2277 126 }
2278
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 const char* current_file = get_current_file_name();
2279 81 string name;
2280 // RPG Hacker: Should this also throw on absolute paths?
2281 // E.g., on something starting with C:/ or whatever.
2282
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 144 times.
162 if (strchr(par, '\\'))
2283 {
2284
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_platform_paths);
2285 }
2286
2/4
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
144 name = safedequote(par);
2287 char * data;//I couldn't find a way to get this into an autoptr
2288
6/10
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 108 times.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 36 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 36 times.
144 if (!readfile(name, current_file, &data, &len)) asar_throw_error(0, error_type_block, vfile_error_to_error_id(asar_get_last_io_error()), name.data());
2289
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 36 times.
108 autoptr<char*> datacopy=data;
2290
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 72 times.
108 if (!end) end=len;
2291
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());
2292
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());
2293
2294
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]);
2295
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 add_addr_to_line(addrToLinePos);
2296 162 }
2297
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"))
2298 {
2299
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);
2300
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);
2301
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);
2302 int amount;
2303
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1962 times.
1980 if(numwords > 2)
2304 {
2305
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 int alignment = getnum(word[2]);
2306
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);
2307 9 int offset = 0;
2308
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if(numwords==5)
2309 {
2310
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 offset = getnum(word[4]);
2311
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);
2312 }
2313
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);
2314
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);
2315
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);
2316 // i just guessed this formula but it seems to work
2317 18 amount = (alignment - ((snespos - offset) & (alignment-1))) & (alignment-1);
2318 }
2319 else
2320 {
2321
1/2
✓ Branch 0 taken 1962 times.
✗ Branch 1 not taken.
1962 amount = (int)getnum(par);
2322
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);
2323 }
2324
2/2
✓ Branch 0 taken 1764 times.
✓ Branch 1 taken 198 times.
1962 if(is("skip")) step(amount);
2325 else
2326 {
2327
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]);
2328
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 add_addr_to_line(addrToLinePos);
2329 }
2330
2331 }
2332
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"))
2333 {
2334
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 cleartable();
2335 }
2336
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"))
2337 {
2338
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 tablestack.append(thetable);
2339 }
2340
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"))
2341 {
2342
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);
2343
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];
2344
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 tablestack.remove(tablestack.count-1);
2345 }
2346
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)
2347 {
2348
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);
2349
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);
2350
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 string line=word[1];
2351
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 line.qnormalize();
2352 108 char * startpar=strqchr(line.data(), '(');
2353
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);
2354 108 *startpar=0;
2355
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
108 startpar++;
2356
3/7
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 36 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
108 if (!confirmname(line)) asar_throw_error(0, error_type_block, error_id_invalid_function_name);
2357 108 char * endpar=strqchr(startpar, ')');
2358 //confirmqpar requires that all parentheses are matched, and a starting one exists, therefore it is harmless to not check for nulls
2359
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);
2360 108 *endpar=0;
2361
2362 54 string pars;
2363
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 108 times.
216 for(int i = 3; i < numwords; i++){
2364
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if(i > 3) pars += " ";
2365
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 pars += word[i];
2366 }
2367
2368
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 createuserfunc(line, startpar, pars.data());
2369 108 }
2370
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"))
2371 {
2372
2/2
✓ Branch 0 taken 852 times.
✓ Branch 1 taken 18 times.
870 string out = handle_print(par);
2373
3/4
✓ Branch 0 taken 284 times.
✓ Branch 1 taken 568 times.
✓ Branch 2 taken 284 times.
✗ Branch 3 not taken.
852 if (pass==2) print(out);
2374 852 }
2375
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"))
2376 {
2377 if(0);
2378
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;
2379 else if (!stricmp(par, "freespaceuse")) freespaceuse=0;
2380 else asar_throw_error(2, error_type_block, error_id_unknown_variable);
2381 }
2382
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"))
2383 {
2384 27 int len = 0;
2385
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 if (is("padbyte")) len=1;
2386
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
54 if (is("padword")) len=2;
2387
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
54 if (is("padlong")) len=3;
2388
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
54 if (is("paddword")) len=4;
2389
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 unsigned int val=getnum(par);
2390
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);
2391
2/2
✓ Branch 0 taken 432 times.
✓ Branch 1 taken 36 times.
468 for (int i=0;i<12;i+=len)
2392 {
2393 216 unsigned int tmpval=val;
2394
2/2
✓ Branch 0 taken 432 times.
✓ Branch 1 taken 432 times.
864 for (int j=0;j<len;j++)
2395 {
2396 432 padbyte[i+j]=(unsigned char)tmpval;
2397 432 tmpval>>=8;
2398 }
2399 }
2400 }
2401
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"))
2402 {
2403
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);
2404
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 int num=(int)getnum(par);
2405
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());
2406
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
54 if (num>realsnespos)
2407 {
2408
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
18 int end=snestopc(num);
2409
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
18 int start=snestopc(realsnespos);
2410 36 int len=end-start;
2411
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]);
2412
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 add_addr_to_line(addrToLinePos);
2413 }
2414 }
2415
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"))
2416 {
2417 72 int len = 0;
2418
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 54 times.
144 if (is("fillbyte")) len=1;
2419
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 126 times.
144 if (is("fillword")) len=2;
2420
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 126 times.
144 if (is("filllong")) len=3;
2421
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 126 times.
144 if (is("filldword")) len=4;
2422
1/2
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
144 unsigned int val= getnum(par);
2423
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);
2424
2/2
✓ Branch 0 taken 1098 times.
✓ Branch 1 taken 126 times.
1224 for (int i=0;i<12;i+=len)
2425 {
2426 549 unsigned int tmpval=val;
2427
2/2
✓ Branch 0 taken 1512 times.
✓ Branch 1 taken 1098 times.
2610 for (int j=0;j<len;j++)
2428 {
2429 1512 fillbyte[i+j]=(unsigned char)tmpval;
2430 1512 tmpval>>=8;
2431 }
2432 }
2433 }
2434
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"))
2435 {
2436
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);
2437
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; }
2438
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; }
2439
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; }
2440 asar_throw_error(0, error_type_block, error_id_broken_command, "arch", "Invalid architecture, expected one of 65816, spc700, superfx");
2441 }
2442
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("}")) {}
2443 else
2444 {
2445
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 39 times.
39 asar_throw_error(1, error_type_block, error_id_unknown_command);
2446 }
2447
2448
6/6
✓ Branch 0 taken 38634 times.
✓ Branch 1 taken 27831 times.
✓ Branch 2 taken 38634 times.
✓ Branch 3 taken 27831 times.
✓ Branch 4 taken 38634 times.
✓ Branch 5 taken 27831 times.
261564 }
2449
2450 48495 bool assemblemapper(char** word, int numwords)
2451 {
2452 48495 auto previous_mapper = mapper;
2453 if(0);
2454
6/6
✓ Branch 0 taken 2379 times.
✓ Branch 1 taken 46116 times.
✓ Branch 2 taken 291 times.
✓ Branch 3 taken 2088 times.
✓ Branch 4 taken 147 times.
✓ Branch 5 taken 20892 times.
48495 else if (is0("lorom"))
2455 {
2456 //this also makes xkas set snespos to $008000 for some reason
2457 291 mapper=lorom;
2458 }
2459
6/6
✓ Branch 0 taken 2088 times.
✓ Branch 1 taken 46116 times.
✓ Branch 2 taken 1035 times.
✓ Branch 3 taken 1053 times.
✓ Branch 4 taken 63 times.
✓ Branch 5 taken 20829 times.
48204 else if (is0("hirom"))
2460 {
2461 //xkas makes this point to $C00000
2462 123 mapper=hirom;
2463 }
2464
6/6
✓ Branch 0 taken 1965 times.
✓ Branch 1 taken 46116 times.
✓ Branch 2 taken 975 times.
✓ Branch 3 taken 990 times.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 20817 times.
48081 else if (is0("exlorom"))
2465 {
2466 21 mapper = exlorom;
2467 }
2468
6/6
✓ Branch 0 taken 1944 times.
✓ Branch 1 taken 46116 times.
✓ Branch 2 taken 966 times.
✓ Branch 3 taken 978 times.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 20805 times.
48060 else if (is0("exhirom"))
2469 {
2470 21 mapper=exhirom;
2471 }
2472
6/6
✓ Branch 0 taken 1923 times.
✓ Branch 1 taken 46116 times.
✓ Branch 2 taken 957 times.
✓ Branch 3 taken 966 times.
✓ Branch 4 taken 21 times.
✓ Branch 5 taken 20784 times.
48039 else if (is0("sfxrom"))
2473 {
2474 39 mapper=sfxrom;
2475 //fastrom=false;
2476 }
2477
6/6
✓ Branch 0 taken 1884 times.
✓ Branch 1 taken 46116 times.
✓ Branch 2 taken 942 times.
✓ Branch 3 taken 942 times.
✓ Branch 4 taken 60 times.
✓ Branch 5 taken 20724 times.
48000 else if (is0("norom"))
2478 {
2479 //$000000 would be the best snespos for this, but I don't care
2480 114 mapper=norom;
2481 //fastrom=false;
2482
2/2
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 36 times.
114 if(!force_checksum_fix)
2483 78 checksum_fix_enabled = false;//we don't know where the header is, so don't set the checksum
2484 }
2485
6/6
✓ Branch 0 taken 1770 times.
✓ Branch 1 taken 46116 times.
✓ Branch 2 taken 885 times.
✓ Branch 3 taken 885 times.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 20712 times.
47886 else if (is0("fullsa1rom"))
2486 {
2487 21 mapper=bigsa1rom;
2488 //fastrom=false;
2489 }
2490
2/2
✓ Branch 0 taken 75 times.
✓ Branch 1 taken 47790 times.
47865 else if (is("sa1rom"))
2491 {
2492 //fastrom=false;
2493
2/2
✓ Branch 0 taken 57 times.
✓ Branch 1 taken 18 times.
75 if (par)
2494 {
2495
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);
2496
1/2
✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
87 if (!is_digit(par[0]) || par[1]!=',' ||
2497
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]!=',' ||
2498
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]!=',' ||
2499
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);
2500 int len;
2501
1/2
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
57 autoptr<char**> pars=qpsplit(par, ',', &len);
2502
1/2
✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
57 verify_paren(pars);
2503
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);
2504 57 sa1banks[0]=(par[0]-'0')<<20;
2505 57 sa1banks[1]=(par[2]-'0')<<20;
2506 57 sa1banks[4]=(par[4]-'0')<<20;
2507 57 sa1banks[5]=(par[6]-'0')<<20;
2508 57 }
2509 else
2510 {
2511 18 sa1banks[0]=0<<20;
2512 18 sa1banks[1]=1<<20;
2513 18 sa1banks[4]=2<<20;
2514 18 sa1banks[5]=3<<20;
2515 }
2516 75 mapper=sa1rom;
2517 }
2518 20673 else return false;
2519
2520
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 705 times.
705 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2521
2/2
✓ Branch 0 taken 435 times.
✓ Branch 1 taken 270 times.
705 if(!mapper_set){
2522 435 mapper_set = true;
2523
2/2
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 135 times.
270 }else if(previous_mapper != mapper){
2524 234 asar_throw_warning(1, warning_id_mapper_already_set);
2525 }
2526 366 return true;
2527 }
2528