asar coverage - build #143


src/asar/
File: src/asar/assembleblock.cpp
Date: 2024-01-23 18:02:39
Lines:
1334/1441
92.6%
Functions:
42/42
100.0%
Branches:
2000/3171
63.1%

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 489 int snestopc_pick(int addr)
70 {
71 822 return snestopc(addr);
72 }
73
74 1310724 inline void verifysnespos()
75 {
76
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1310724 times.
1310724 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 1310724 }
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 1309569 inline void step(int num)
150 {
151
2/2
✓ Branch 0 taken 828 times.
✓ Branch 1 taken 1308741 times.
1309569 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 1308741 snespos += num;
167 1308741 realsnespos += num;
168 }
169 1309569 bytes+=num;
170 1309569 }
171
172 1307769 inline void write1_65816(unsigned int num)
173 {
174 1307769 verifysnespos();
175
2/2
✓ Branch 0 taken 435841 times.
✓ Branch 1 taken 871928 times.
1307769 if (pass==2)
176 {
177 435841 int pcpos=snestopc(realsnespos&0xFFFFFF);
178
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 435841 times.
435841 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 435841 writeromdata_byte(pcpos, (unsigned char)num, freespaceid != 0);
184
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 435841 times.
435841 if (pcpos>=romlen) romlen=pcpos+1;
185 }
186
4/4
✓ Branch 0 taken 435961 times.
✓ Branch 1 taken 871808 times.
✓ Branch 2 taken 26725 times.
✓ Branch 3 taken 409236 times.
1307769 if(pass == 1 && freespaceid == 0) {
187 26725 int pcpos = snestopc(realsnespos & 0xFFFFFF);
188
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 26725 times.
26725 if(pcpos < 0) asar_throw_error(pass, error_type_fatal, error_id_internal_error, "invalid pos in pass 1");
189 26725 addromwrite(pcpos, 1);
190
2/2
✓ Branch 0 taken 25714 times.
✓ Branch 1 taken 1011 times.
26725 if (pcpos>=romlen) romlen=pcpos+1;
191 }
192 1307769 step(1);
193 1307769 ratsmetastate=ratsmeta_ban;
194 1307769 }
195
196 685182 void write1_pick(unsigned int num)
197 {
198
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.
685749 write1_65816(num);
199 1265367 }
200
201 85836 static bool asblock_pick(char** word, int numwords)
202 {
203
4/4
✓ Branch 0 taken 78798 times.
✓ Branch 1 taken 7038 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 78726 times.
85836 if (arch==arch_spc700 || in_spcblock) return asblock_spc700(word, numwords);
204
2/2
✓ Branch 0 taken 67764 times.
✓ Branch 1 taken 10962 times.
78726 if (arch==arch_65816) return asblock_65816(word, numwords);
205
1/2
✓ Branch 0 taken 10962 times.
✗ Branch 1 not taken.
10962 if (arch==arch_superfx) return asblock_superfx(word, numwords);
206 return true;
207 }
208
209 #define write1 write1_pick
210 #define snestopc snestopc_pick
211
212 29343 const char * safedequote(char * str)
213 {
214 29343 const char * tmp=dequote(str);
215
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 29343 times.
29343 if (!tmp) asar_throw_error(0, error_type_block, error_id_garbage_near_quoted_string);
216 29343 return tmp;
217 }
218
219 extern char romtitle[30];
220 extern bool stdlib;
221
222 5382 void write2(unsigned int num)
223 {
224 2694 write1(num);
225 5382 write1(num/256);
226 5382 }
227
228 3402 void write3(unsigned int num)
229 {
230 1701 write1(num);
231 3402 write1(num/256);
232 3402 write1(num/65536);
233 3402 }
234
235 342 void write4(unsigned int num)
236 {
237 171 write1(num);
238 342 write1(num/256);
239 342 write1(num/65536);
240 342 write1(num/16777216);
241 342 }
242
243 //these are NOT used by the math parser - see math.cpp for that
244 42 int read2(int insnespos)
245 {
246 21 int addr=snestopc(insnespos);
247
3/4
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 21 times.
✓ Branch 3 taken 21 times.
42 if (addr<0 || addr+2>romlen_r) return -1;
248 return
249 42 romdata_r[addr ] |
250 42 (romdata_r[addr+1]<< 8);
251 }
252
253 102 int read3(int insnespos)
254 {
255 51 int addr=snestopc(insnespos);
256
3/4
✓ Branch 0 taken 102 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 51 times.
✓ Branch 3 taken 51 times.
102 if (addr<0 || addr+3>romlen_r) return -1;
257 return
258 102 romdata_r[addr ] |
259 102 (romdata_r[addr+1]<< 8)|
260 102 (romdata_r[addr+2]<<16);
261 }
262
263 4356 int getlenfromchar(char c)
264 {
265 4356 c=(char)to_lower(c);
266
2/2
✓ Branch 0 taken 2178 times.
✓ Branch 1 taken 2178 times.
4356 if (c=='b') return 1;
267
2/2
✓ Branch 0 taken 1188 times.
✓ Branch 1 taken 1188 times.
2376 if (c=='w') return 2;
268
2/2
✓ Branch 0 taken 153 times.
✓ Branch 1 taken 153 times.
306 if (c=='l') return 3;
269 18 asar_throw_error(0, error_type_block, error_id_invalid_opcode_length);
270 return -1;
271 }
272
273 assocarr<snes_label> labels;
274 static autoarray<int> poslabels;
275 static autoarray<int> neglabels;
276
277 autoarray<int>* macroposlabels;
278 autoarray<int>* macroneglabels;
279
280 autoarray<string> sublabels;
281 autoarray<string>* macrosublabels;
282
283 // randomdude999: ns is still the string to prefix to all labels, it's calculated whenever namespace_list is changed
284 string ns;
285 string ns_backup;
286 autoarray<string> namespace_list;
287
288 autoarray<string> includeonce;
289
290 autoarray<freespace_data> freespaces;
291
292 // id of the next unused freespace.
293 static int freespaceidnext;
294 // id of the current freespace, or 0 if not in freespace.
295 int freespaceid;
296 // start address of the current freespace, used for computing the length of the
297 // current freespace.
298 static int freespacestart;
299
300
301 7377 bool confirmname(const char * name)
302 {
303
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7377 times.
7377 if (!name[0]) return false;
304
2/2
✓ Branch 0 taken 1836 times.
✓ Branch 1 taken 5541 times.
7377 if (is_digit(name[0])) return false;
305
2/2
✓ Branch 0 taken 46353 times.
✓ Branch 1 taken 5523 times.
51876 for (int i=0;name[i];i++)
306 {
307
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 46335 times.
46353 if (!is_ualnum(name[i])) return false;
308 }
309 2763 return true;
310 }
311
312 162956 string posneglabelname(const char ** input, bool define)
313 {
314 162956 const char* label = *input;
315
316 78408 string output;
317
318 78408 int depth = 0;
319 78408 bool ismacro = false;
320
321
2/2
✓ Branch 0 taken 138 times.
✓ Branch 1 taken 162818 times.
162956 if (label[0] == '?')
322 {
323 69 ismacro = true;
324 138 label++;
325 }
326
4/4
✓ Branch 0 taken 78401 times.
✓ Branch 1 taken 84555 times.
✓ Branch 2 taken 403 times.
✓ Branch 3 taken 162390 times.
162956 if (label[0] == '-' || label[0] == '+')
327 {
328 290 char first = label[0];
329
4/4
✓ Branch 0 taken 746 times.
✓ Branch 1 taken 386 times.
✓ Branch 2 taken 566 times.
✓ Branch 3 taken 180 times.
1132 for (depth = 0; label[0] && label[0] == first; depth++) label++;
330
331
2/2
✓ Branch 0 taken 518 times.
✓ Branch 1 taken 48 times.
566 if (!ismacro)
332 {
333
2/2
✓ Branch 0 taken 379 times.
✓ Branch 1 taken 139 times.
518 if (first == '+')
334 {
335 379 *input = label;
336
8/16
✓ Branch 0 taken 193 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 193 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 193 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 193 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 193 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 193 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 193 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 193 times.
✗ Branch 15 not taken.
565 output = STR":pos_" + dec(depth) + "_" + dec(poslabels[depth]);
337
3/4
✓ Branch 0 taken 309 times.
✓ Branch 1 taken 70 times.
✓ Branch 2 taken 156 times.
✗ Branch 3 not taken.
532 if (define) poslabels[depth]++;
338 }
339 else
340 {
341 139 *input = label;
342
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]++;
343
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]);
344 }
345 }
346 else
347 {
348
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)
349 {
350 if (!macrorecursion) asar_throw_error(0, error_type_block, error_id_macro_label_outside_of_macro);
351 }
352 else
353 {
354
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 24 times.
48 if (first == '+')
355 {
356 24 *input = label;
357
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]);
358
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]++;
359 }
360 else
361 {
362 24 *input = label;
363
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]++;
364
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]);
365 }
366 }
367 }
368 }
369
370 162956 return output;
371 }
372
373 7003 static string labelname(const char ** rawname, bool define=false)
374 {
375 #define deref_rawname (*rawname)
376 3510 autoarray<string>* sublabellist = &sublabels;
377
378 7003 bool ismacro = (deref_rawname[0] == '?');
379 3510 bool issublabel = false;
380
381
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 6931 times.
7003 if (ismacro)
382 {
383 72 deref_rawname++;
384 72 sublabellist = macrosublabels;
385 }
386
387 3510 string name;
388 3510 int i=-1;
389
390
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 7003 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7003 if (is_digit(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
391
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 6913 times.
7003 if (*deref_rawname ==':')
392 {
393 90 deref_rawname++;
394
1/2
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
48 name=":";
395 }
396
4/4
✓ Branch 0 taken 3462 times.
✓ Branch 1 taken 3451 times.
✓ Branch 2 taken 3165 times.
✓ Branch 3 taken 3154 times.
6913 else if (!in_struct && !in_sub_struct)
397 {
398
2/2
✓ Branch 0 taken 285 times.
✓ Branch 1 taken 6247 times.
6532 for (i=0;(*deref_rawname =='.');i++) deref_rawname++;
399
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6247 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6247 if (!is_ualnum(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
400
2/2
✓ Branch 0 taken 267 times.
✓ Branch 1 taken 5980 times.
6247 if (i)
401 {
402
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);
403
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]+"_";
404 135 issublabel = true;
405 }
406 }
407
408
4/4
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 6943 times.
✓ Branch 2 taken 24 times.
✓ Branch 3 taken 12 times.
7003 if (ismacro && !issublabel)
409 {
410 // RPG Hacker: Don't add the prefix for sublabels, because they already inherit it from
411 // their parents' names.
412
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);
413
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;
414 }
415
416
417
4/4
✓ Branch 0 taken 6391 times.
✓ Branch 1 taken 594 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 6319 times.
6985 if (in_struct || in_sub_struct)
418 {
419
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 594 times.
666 if(in_sub_struct)
420 {
421
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 name += struct_parent + ".";
422 }
423
1/2
✓ Branch 0 taken 333 times.
✗ Branch 1 not taken.
666 name += struct_name;
424
1/2
✓ Branch 0 taken 333 times.
✗ Branch 1 not taken.
666 name += '.';
425
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!!!
426 648 deref_rawname++;
427 }
428
429
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6967 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6967 if (!is_ualnum(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
430
431
6/6
✓ Branch 0 taken 27874 times.
✓ Branch 1 taken 27945 times.
✓ Branch 2 taken 678 times.
✓ Branch 3 taken 6967 times.
✓ Branch 4 taken 24470 times.
✓ Branch 5 taken 3492 times.
55819 while (is_ualnum(*deref_rawname) || *deref_rawname == '.')
432 {
433
1/2
✓ Branch 0 taken 24470 times.
✗ Branch 1 not taken.
48852 name+=*(deref_rawname++);
434 }
435
436
4/4
✓ Branch 0 taken 4378 times.
✓ Branch 1 taken 2589 times.
✓ Branch 2 taken 174 times.
✓ Branch 3 taken 4204 times.
6967 if(!define && *deref_rawname == '[')
437 {
438
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++;
439
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);
440 174 deref_rawname++;
441 }
442
443
6/6
✓ Branch 0 taken 3912 times.
✓ Branch 1 taken 3895 times.
✓ Branch 2 taken 168 times.
✓ Branch 3 taken 6967 times.
✓ Branch 4 taken 420 times.
✓ Branch 5 taken 3492 times.
7807 while (is_ualnum(*deref_rawname) || *deref_rawname == '.')
444 {
445
1/2
✓ Branch 0 taken 420 times.
✗ Branch 1 not taken.
840 name+=*(deref_rawname++);
446 }
447
448
3/4
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 6895 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 72 times.
6967 if(*deref_rawname == '[') asar_throw_error(2, error_type_block, error_id_invalid_subscript);
449
450
4/4
✓ Branch 0 taken 2202 times.
✓ Branch 1 taken 4693 times.
✓ Branch 2 taken 948 times.
✓ Branch 3 taken 315 times.
6895 if (define && i>=0)
451 {
452
1/2
✓ Branch 0 taken 948 times.
✗ Branch 1 not taken.
1887 (*sublabellist).reset(i);
453
2/4
✓ Branch 0 taken 948 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 948 times.
✗ Branch 3 not taken.
948 (*sublabellist)[i]=name;
454 }
455 6895 return name;
456 #undef deref_rawname
457 108 }
458
459 4234 inline bool labelvalcore(const char ** rawname, snes_label * rval, bool define, bool shouldthrow)
460 {
461
1/2
✓ Branch 0 taken 2121 times.
✗ Branch 1 not taken.
4234 string name=labelname(rawname, define);
462
14/20
✓ Branch 0 taken 2211 times.
✓ Branch 1 taken 2023 times.
✓ Branch 2 taken 140 times.
✓ Branch 3 taken 4094 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 2029 times.
✓ Branch 12 taken 48 times.
✓ Branch 13 taken 2073 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.
4372 if (ns && labels.exists(ns+name)) {*rval = labels.find(ns+name);}
463
5/6
✓ Branch 0 taken 3907 times.
✓ Branch 1 taken 231 times.
✓ Branch 2 taken 1841 times.
✓ Branch 3 taken 232 times.
✓ Branch 4 taken 1841 times.
✗ Branch 5 not taken.
4138 else if (labels.exists(name)) {*rval = labels.find(name);}
464 else
465 {
466
4/4
✓ Branch 0 taken 79 times.
✓ Branch 1 taken 384 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 72 times.
463 if (shouldthrow && pass)
467 {
468
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());
469 }
470 456 rval->pos = (unsigned int)-1;
471 456 rval->freespace_id = 0;
472 456 rval->is_static = false;
473 456 return false;
474 }
475 1889 return true;
476 4234 }
477
478 1984 snes_label labelval(const char ** rawname, bool define)
479 {
480 993 snes_label rval;
481
2/2
✓ Branch 0 taken 989 times.
✓ Branch 1 taken 4 times.
1984 labelvalcore(rawname, &rval, define, true);
482 1977 return rval;
483 }
484
485 134 snes_label labelval(string name, bool define)
486 {
487 134 const char * rawname=name;
488 68 snes_label rval;
489
1/2
✓ Branch 0 taken 68 times.
✗ Branch 1 not taken.
134 labelvalcore(&rawname, &rval, define, true);
490 134 return rval;
491 }
492
493 2076 bool labelval(const char ** rawname, snes_label * rval, bool define)
494 {
495 2076 return labelvalcore(rawname, rval, define, false);
496 }
497
498 40 bool labelval(string name, snes_label * rval, bool define)
499 {
500 40 const char * str=name;
501
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
62 return labelvalcore(&str, rval, define, false);
502 }
503
504 3477 static void setlabel(string name, int loc=-1, bool is_static=false, int freespace_id = -1)
505 {
506
2/2
✓ Branch 0 taken 2937 times.
✓ Branch 1 taken 540 times.
3477 if (loc==-1)
507 {
508
1/2
✓ Branch 0 taken 1476 times.
✗ Branch 1 not taken.
2937 verifysnespos();
509 2937 loc=snespos;
510 }
511
512 1746 snes_label label_data;
513 3477 label_data.pos = (unsigned int)loc;
514 3477 label_data.is_static = is_static;
515
1/2
✓ Branch 0 taken 3477 times.
✗ Branch 1 not taken.
3477 label_data.freespace_id = freespace_id == -1 ? freespaceid : freespace_id;
516
517 unsigned int labelpos;
518
2/2
✓ Branch 0 taken 1159 times.
✓ Branch 1 taken 2318 times.
3477 if (pass==0)
519 {
520
4/4
✓ Branch 0 taken 585 times.
✓ Branch 1 taken 574 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 579 times.
1159 if (labels.exists(name))
521 {
522 6 movinglabelspossible=true;
523
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());
524 }
525
1/2
✓ Branch 0 taken 579 times.
✗ Branch 1 not taken.
1153 labels.create(name) = label_data;
526 }
527
2/2
✓ Branch 0 taken 1159 times.
✓ Branch 1 taken 1159 times.
2318 else if (pass==1)
528 {
529
1/2
✓ Branch 0 taken 582 times.
✗ Branch 1 not taken.
1159 labels.create(name) = label_data;
530 }
531
1/2
✓ Branch 0 taken 1159 times.
✗ Branch 1 not taken.
1159 else if (pass==2)
532 {
533 //all label locations are known at this point, add a sanity check
534
3/6
✓ Branch 0 taken 582 times.
✓ Branch 1 taken 577 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 582 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1159 if (!labels.exists(name)) asar_throw_error(2, error_type_block, error_id_label_on_third_pass);
535
1/2
✓ Branch 0 taken 582 times.
✗ Branch 1 not taken.
1159 labelpos = labels.find(name).pos;
536
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1147 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
1159 if ((int)labelpos != loc && !movinglabelspossible)
537 {
538
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());
539
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());
540
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 else if(errored) return;
541 else asar_throw_error(2, error_type_block, error_id_label_moving);
542 }
543 }
544 }
545
546 table thetable;
547 static autoarray<table> tablestack;
548
549 2127 static void cleartable()
550 {
551
2/4
✓ Branch 0 taken 2127 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1095 times.
✗ Branch 3 not taken.
2127 thetable = table();
552 2127 }
553
554 struct pushable {
555 int arch;
556 int snespos;
557 int snesstart;
558 int snesposreal;
559 int snesstartreal;
560 int freeid;
561 int freest;
562 int arch1;
563 int arch2;
564 int arch3;
565 int arch4;
566 };
567 static autoarray<pushable> pushpc;
568 static int pushpcnum;
569
570 static autoarray<int> basestack;
571 static int basestacknum;
572
573 129 struct ns_pushable {
574 string ns;
575 autoarray<string> namespace_list;
576 bool nested_namespaces;
577 };
578
579 static autoarray<ns_pushable> pushns;
580 static int pushnsnum;
581
582
583 static unsigned char fillbyte[12];
584 static unsigned char padbyte[12];
585
586 static bool nested_namespaces = false;
587
588 4518 static int getfreespaceid()
589 {
590 /*static const int max_num_freespaces = 125;
591 if (freespaceidnext > max_num_freespaces) asar_throw_error(pass, error_type_fatal, error_id_freespace_limit_reached, max_num_freespaces);*/
592 4518 int newid = freespaceidnext++;
593
2/2
✓ Branch 0 taken 1506 times.
✓ Branch 1 taken 3012 times.
4518 if(newid >= freespaces.count) {
594 1506 freespaces[newid].leaked = true;
595 1506 freespaces[newid].orgpos = -2;
596 1506 freespaces[newid].orglen = -1;
597 1506 freespaces[newid].cleanbyte = 0x00;
598 }
599 4518 return newid;
600 }
601
602 134265 void checkbankcross()
603 {
604
2/2
✓ Branch 0 taken 67080 times.
✓ Branch 1 taken 67185 times.
134265 if (!snespos_valid) return;
605
2/2
✓ Branch 0 taken 53988 times.
✓ Branch 1 taken 54150 times.
108138 if (disable_bank_cross_errors) return;
606
2/2
✓ Branch 0 taken 53421 times.
✓ Branch 1 taken 53583 times.
107004 unsigned int mask = 0x7FFF0000 | (check_half_banks_crossed ? 0x8000 : 0);
607
4/4
✓ Branch 0 taken 1716 times.
✓ Branch 1 taken 105288 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 1704 times.
107004 if (((snespos^startpos) & mask) && (((snespos - 1) ^ startpos) & mask))
608 {
609 12 asar_throw_error(pass, error_type_fatal, error_id_bank_border_crossed, snespos);
610 }
611 // don't verify realsnespos when using norom. this allows making custom mappers where the file layout doesn't follow bank borders
612
5/6
✓ Branch 0 taken 106116 times.
✓ Branch 1 taken 876 times.
✓ Branch 2 taken 1704 times.
✓ Branch 3 taken 104412 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1704 times.
106992 else if (mapper != norom && ((realsnespos^realstartpos) & mask) && (((realsnespos - 1) ^ realstartpos) & mask))
613 {
614 asar_throw_error(pass, error_type_fatal, error_id_bank_border_crossed, realsnespos);
615 }
616 }
617
618 8985 static void freespaceend()
619 {
620
2/2
✓ Branch 0 taken 4536 times.
✓ Branch 1 taken 4449 times.
8985 if (freespaceid > 0)
621 {
622 4536 freespaces[freespaceid].len = snespos-freespacestart;
623 4536 snespos=(int)0xFFFFFFFF;
624 4536 snespos_valid = false;
625 }
626 8985 freespaceid = 0;
627 8985 }
628
629
1/2
✓ Branch 0 taken 9605 times.
✗ Branch 1 not taken.
19417 static void adddefine(const string & key, string & value)
630 {
631
1/2
✓ Branch 0 taken 19417 times.
✗ Branch 1 not taken.
19417 if (!defines.exists(key)) defines.create(key) = value;
632 19417 }
633
634 2109 void initstuff()
635 {
636
2/2
✓ Branch 0 taken 723 times.
✓ Branch 1 taken 1386 times.
2109 if (pass==0)
637 {
638 723 freespaces.reset();
639 723 movinglabelspossible = false;
640 723 found_rats_tags_initialized = false;
641 723 found_rats_tags.clear();
642 }
643 2109 arch=arch_65816;
644 2109 mapper=lorom;
645 2109 mapper_set = false;
646 2109 calledmacros = 0;
647 2109 reallycalledmacros = 0;
648 2109 macrorecursion = 0;
649 2109 defines.reset();
650 2109 builtindefines.each(adddefine);
651 2109 clidefines.each(adddefine);
652 1086 ns="";
653 2109 namespace_list.reset();
654 2109 sublabels.reset();
655 2109 poslabels.reset();
656 2109 neglabels.reset();
657 2109 macroposlabels = nullptr;
658 2109 macroneglabels = nullptr;
659 2109 macrosublabels = nullptr;
660 2109 cleartable();
661 2109 pushpc.reset();
662 2109 pushpcnum=0;
663 2109 pushns.reset();
664 2109 pushnsnum = 0;
665 2109 bytes=0;
666 2109 freespaceuse=0;
667 2109 memset(fillbyte, 0, sizeof(fillbyte));
668 2109 memset(padbyte, 0, sizeof(padbyte));
669 2109 snespos_valid = false;
670 2109 snespos=(int)0xFFFFFFFF;
671 2109 realsnespos= (int)0xFFFFFFFF;
672 2109 startpos= (int)0xFFFFFFFF;
673 2109 realstartpos= (int)0xFFFFFFFF;
674 2109 freespaceidnext=1;
675 2109 freespaceid=0;
676 2109 incsrcdepth = 0;
677
678 2109 optimizeforbank = -1;
679 2109 optimize_dp = optimize_dp_flag::NONE;
680 2109 dp_base = 0;
681 2109 optimize_address = optimize_address_flag::DEFAULT;
682
683 2109 in_struct = false;
684 2109 in_sub_struct = false;
685 2109 in_spcblock = false;
686
687
1/2
✓ Branch 0 taken 2109 times.
✗ Branch 1 not taken.
2109 if (arch==arch_65816) asinit_65816();
688
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2109 times.
2109 if (arch==arch_spc700) asinit_spc700();
689
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2109 times.
2109 if (arch==arch_superfx) asinit_superfx();
690
691 2109 disable_bank_cross_errors = false;
692 2109 check_half_banks_crossed = false;
693 2109 nested_namespaces = false;
694
695 2109 includeonce.reset();
696
697 extern AddressToLineMapping addressToLineMapping;
698 2109 addressToLineMapping.reset();
699
700 2109 push_warnings(false);
701
702 2109 initmathcore();
703
704 2109 callstack.reset();
705 #if defined(_WIN32) || !defined(NO_USE_THREADS)
706 2109 init_stack_use_check();
707 #endif
708 2109 }
709
710 1530 int get_freespace_pin_target(int target_id) {
711 // union-find algorithm
712
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1530 times.
2307 while(freespaces[target_id].pin_target_id != target_id) {
713 // i love programming
714 18 freespaces[target_id].pin_target_id =
715 12 freespaces[freespaces[target_id].pin_target_id].pin_target_id;
716 12 target_id = freespaces[target_id].pin_target_id;
717 }
718 1530 return target_id;
719 }
720
721 693 void resolve_pinned_freespaces() {
722
2/2
✓ Branch 0 taken 1506 times.
✓ Branch 1 taken 693 times.
2199 for(int i = 1; i < freespaces.count; i++)
723 // default to everyone being in a separate component
724 1506 freespaces[i].pin_target_id = i;
725
2/2
✓ Branch 0 taken 1506 times.
✓ Branch 1 taken 693 times.
2199 for(int i = 1; i < freespaces.count; i++) {
726
1/2
✓ Branch 0 taken 753 times.
✗ Branch 1 not taken.
753 freespace_data& fs = freespaces[i];
727
2/2
✓ Branch 0 taken 1482 times.
✓ Branch 1 taken 24 times.
1506 if(fs.pin_target == "") continue;
728 12 snes_label value;
729
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))
730 value = labels.find(fs.pin_target_ns + fs.pin_target);
731
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))
732
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
24 value = labels.find(fs.pin_target);
733 else continue; // the error for this is thrown in the freespace command during pass 2
734
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
24 fs.pin_target_id = get_freespace_pin_target(value.freespace_id);
735 24 fs.len = 0;
736 }
737 693 }
738
739 693 void allocate_freespaces() {
740 // compute real size of all pinned freespace blocks
741
2/2
✓ Branch 0 taken 1506 times.
✓ Branch 1 taken 693 times.
2199 for(int i = 1; i < freespaces.count; i++) {
742 753 freespace_data& fs = freespaces[i];
743 // just in case the pin target changed again or something
744 1506 fs.pin_target_id = get_freespace_pin_target(fs.pin_target_id);
745 753 freespace_data& target = freespaces[fs.pin_target_id];
746 1506 target.total_len += fs.len;
747
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 753 times.
1506 target.search_start = std::max(fs.search_start, target.search_start);
748 }
749
750
2/2
✓ Branch 0 taken 1506 times.
✓ Branch 1 taken 693 times.
2199 for(int i = 1; i < freespaces.count; i++) {
751 753 freespace_data& fs = freespaces[i];
752
4/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1494 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 6 times.
1506 if(fs.is_static && fs.orgpos > 0) {
753 6 fs.pos = fs.orgpos;
754 6 continue;
755 }
756 // if this freespace is pinned to another one, set it later
757
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1482 times.
1500 if(fs.pin_target_id != i) continue;
758 // TODO: possibly fancier align
759 1482 fs.pos = getsnesfreespace(fs.total_len, fs.bank, true, true, fs.flag_align, fs.cleanbyte, fs.write_rats, fs.search_start);
760 1482 fs.used_len = fs.len;
761 }
762 // set pos for all pinned freespaces
763
2/2
✓ Branch 0 taken 1506 times.
✓ Branch 1 taken 693 times.
2199 for(int i = 1; i < freespaces.count; i++) {
764 753 freespace_data& fs = freespaces[i];
765
2/2
✓ Branch 0 taken 1488 times.
✓ Branch 1 taken 18 times.
1506 if(fs.pin_target_id == i) continue;
766 9 freespace_data& tgt = freespaces[fs.pin_target_id];
767 18 fs.pos = tgt.pos + tgt.used_len;
768 18 tgt.used_len += fs.len;
769 }
770
771 // relocate all labels that were in freespace to point them to their real location
772 693 labels.each([](const char * key, snes_label & val) {
773
2/2
✓ Branch 0 taken 216 times.
✓ Branch 1 taken 937 times.
1153 if(val.freespace_id != 0) {
774 216 val.pos += freespaces[val.freespace_id].pos;
775 }
776 1153 });
777 693 }
778
779 //void nerf(const string& left, string& right){puts(S left+" = "+right);}
780
781 2079 void finishpass()
782 {
783 2079 verify_warnings();
784 2079 pull_warnings(false);
785
786 //defines.traverse(nerf);
787
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2079 times.
2079 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_missing_endspcblock);
788
2/4
✓ Branch 0 taken 2079 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2079 times.
2079 if (in_struct || in_sub_struct) asar_throw_error(pass, error_type_null, error_id_struct_without_endstruct);
789
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2079 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2079 else if (pushpcnum && pass == 0) asar_throw_error(pass, error_type_null, error_id_pushpc_without_pullpc);
790
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2079 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2079 else if (pushnsnum && pass == 0) asar_throw_error(pass, error_type_null, error_id_pushns_without_pullns);
791 2079 freespaceend();
792
2/2
✓ Branch 0 taken 1971 times.
✓ Branch 1 taken 108 times.
2079 if (arch==arch_65816) asend_65816();
793
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 2007 times.
2079 if (arch==arch_spc700) asend_spc700();
794
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 2043 times.
2079 if (arch==arch_superfx) asend_superfx();
795
796 2079 deinitmathcore();
797
2/2
✓ Branch 0 taken 693 times.
✓ Branch 1 taken 1386 times.
2079 if(pass == 0) {
798 693 resolve_pinned_freespaces();
799
2/2
✓ Branch 0 taken 693 times.
✓ Branch 1 taken 693 times.
1386 } else if(pass == 1) {
800 693 allocate_freespaces();
801 693 handle_cleared_rats_tags();
802 }
803 #if defined(_WIN32) || !defined(NO_USE_THREADS)
804 2079 deinit_stack_use_check();
805 #endif
806 2079 }
807
808 148398 static bool addlabel(const char * label, int pos=-1, bool global_label = false)
809 {
810
4/4
✓ Branch 0 taken 102537 times.
✓ Branch 1 taken 45861 times.
✓ Branch 2 taken 54387 times.
✓ Branch 3 taken 48150 times.
148398 if (!label[0] || label[0]==':') return false;//colons are reserved for special labels
811
812 102537 const char* posneglabel = label;
813
1/2
✓ Branch 0 taken 48150 times.
✗ Branch 1 not taken.
102537 string posnegname = posneglabelname(&posneglabel, true);
814
815
4/4
✓ Branch 0 taken 48330 times.
✓ Branch 1 taken 54207 times.
✓ Branch 2 taken 186 times.
✓ Branch 3 taken 47964 times.
102537 if (posnegname.length() > 0)
816 {
817
2/2
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 186 times.
366 if (global_label) return false;
818
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);
819
2/4
✓ Branch 0 taken 366 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 186 times.
✗ Branch 3 not taken.
366 setlabel(posnegname, pos);
820 366 return true;
821 }
822
7/8
✓ Branch 0 taken 99621 times.
✓ Branch 1 taken 2550 times.
✓ Branch 2 taken 99438 times.
✓ Branch 3 taken 183 times.
✓ Branch 4 taken 99420 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 99420 times.
102171 if (label[strlen(label)-1]==':' || label[0]=='.' || label[0]=='?' || label[0] == '#')
823 {
824
2/2
✓ Branch 0 taken 1371 times.
✓ Branch 1 taken 1380 times.
2751 if (!label[1]) return false;
825
6/8
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 2589 times.
✓ Branch 2 taken 126 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 126 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 63 times.
✓ Branch 7 taken 63 times.
2715 if(global_label && (in_struct || in_sub_struct || label[0]=='?')) return false;
826
827 1353 bool define = true;
828
829
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 2625 times.
2697 if (label[0] == '#')
830 {
831 36 define = false;
832 72 label++;
833 }
834
835 // RPG Hacker: Also checking label[1] now, since it might be a macro sublabel.
836 // Also, apparently this here doesn't account for main labels. I guess because
837 // we don't even get here in the first place if they don't include a colon?
838
7/8
✓ Branch 0 taken 1812 times.
✓ Branch 1 taken 885 times.
✓ Branch 2 taken 1794 times.
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 1776 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 891 times.
2697 bool requirecolon = (label[0] != '.' && label[1] != '.') && (in_struct || in_sub_struct);
839
2/2
✓ Branch 0 taken 2589 times.
✓ Branch 1 taken 108 times.
2697 string name=labelname(&label, define);
840
2/2
✓ Branch 0 taken 2460 times.
✓ Branch 1 taken 129 times.
2589 if (label[0]==':') label++;
841
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);
842
2/2
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 66 times.
129 else if (global_label) return false;
843
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2571 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2571 if (label[0]) asar_throw_error(0, error_type_block, error_id_broken_label_definition);
844
10/12
✓ Branch 0 taken 1452 times.
✓ Branch 1 taken 1119 times.
✓ Branch 2 taken 309 times.
✓ Branch 3 taken 1143 times.
✓ Branch 4 taken 147 times.
✓ Branch 5 taken 18 times.
✓ Branch 6 taken 147 times.
✓ Branch 7 taken 1143 times.
✓ Branch 8 taken 147 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 147 times.
✗ Branch 11 not taken.
2715 if (ns && !global_label) name=ns+name;
845
9/10
✓ Branch 0 taken 2013 times.
✓ Branch 1 taken 558 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 1941 times.
✓ Branch 4 taken 1500 times.
✓ Branch 5 taken 96 times.
✓ Branch 6 taken 1290 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1284 times.
✓ Branch 9 taken 6 times.
2577 setlabel(name, pos, ((in_struct || in_sub_struct) && static_struct));
846 2559 return true;
847 2589 }
848 46584 return false;
849 102537 }
850
851 45429 static void add_addr_to_line(int pos)
852 {
853
2/2
✓ Branch 0 taken 16029 times.
✓ Branch 1 taken 29400 times.
45429 if (pass == 2)
854 16029 addressToLineMapping.includeMapping(get_current_file_name(), get_current_line() + 1, pos);
855 45429 }
856
857 static autoarray<bool> elsestatus;
858 int numtrue=0;//if 1 -> increase both
859 int numif = 0; //if 0 or inside if 0 -> increase only numif
860
861 autoarray<whiletracker> whilestatus;
862 int single_line_for_tracker;
863
864
865 270 static void push_pc()
866 {
867 270 pushpc[pushpcnum].arch=arch;
868 270 pushpc[pushpcnum].snespos=snespos;
869 270 pushpc[pushpcnum].snesstart=startpos;
870 270 pushpc[pushpcnum].snesposreal=realsnespos;
871 270 pushpc[pushpcnum].snesstartreal=realstartpos;
872 270 pushpc[pushpcnum].freeid=freespaceid;
873 270 pushpc[pushpcnum].freest=freespacestart;
874 270 pushpcnum++;
875 270 }
876
877 270 static void pop_pc()
878 {
879 270 pushpcnum--;
880 270 snespos=pushpc[pushpcnum].snespos;
881 270 startpos=pushpc[pushpcnum].snesstart;
882 270 realsnespos=pushpc[pushpcnum].snesposreal;
883 270 realstartpos=pushpc[pushpcnum].snesstartreal;
884 270 freespaceid=pushpc[pushpcnum].freeid;
885 270 freespacestart=pushpc[pushpcnum].freest;
886 270 }
887
888
889 984 string handle_print(char* input)
890 {
891 498 string out;
892
1/2
✓ Branch 0 taken 984 times.
✗ Branch 1 not taken.
984 autoptr<char**> pars = qpsplit(input, ',');
893
1/2
✓ Branch 0 taken 984 times.
✗ Branch 1 not taken.
984 verify_paren(pars);
894
2/2
✓ Branch 0 taken 1659 times.
✓ Branch 1 taken 966 times.
2625 for (int i = 0; pars[i]; i++)
895 {
896 if (0);
897
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]);
898
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);
899
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);
900
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);
901
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(")) ||
902
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(")) ||
903
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(")) ||
904
2/2
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 9 times.
144 !strncasecmp(pars[i], "double(", strlen("double(")))
905 {
906 369 char * arg1pos = strchr(pars[i], '(') + 1;
907 369 char * endpos = strchr(arg1pos, '\0');
908
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--;
909
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);
910
1/2
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
369 string paramstr = string(arg1pos, (int)(endpos - arg1pos));
911
912 int numargs;
913
1/2
✓ Branch 0 taken 369 times.
✗ Branch 1 not taken.
369 autoptr<char**> params = qpsplit(paramstr.temp_raw(), ',', &numargs);
914
1/2
✓ Branch 0 taken 369 times.
✗ Branch 1 not taken.
369 verify_paren(params);
915
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);
916 189 int precision = 0;
917 369 bool hasprec = numargs == 2;
918
2/2
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 189 times.
369 if (hasprec)
919 {
920
1/2
✓ Branch 0 taken 234 times.
✗ Branch 1 not taken.
234 precision = getnum(params[1]);
921
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 234 times.
234 if (precision < 0) precision = 0;
922
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 117 times.
234 if (precision > 64) precision = 64;
923 }
924 369 *(arg1pos - 1) = '\0'; // allows more convenient comparsion functions
925
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"))
926 {
927 // sadly printf doesn't have binary, so let's roll our own
928
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 int64_t value = getnum(params[0]);
929 char buffer[65];
930
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 72 times.
90 if (value < 0) {
931
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 out += '-';
932 18 value = -value;
933 // decrement precision because we've output one char already
934 18 precision -= 1;
935
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if (precision<0) precision = 0;
936 }
937
2/2
✓ Branch 0 taken 5760 times.
✓ Branch 1 taken 90 times.
5850 for (int j = 0; j < 64; j++) {
938 5760 buffer[63 - j] = '0' + ((value & (1ull << j)) >> j);
939 }
940 90 buffer[64] = 0;
941 45 int startidx = 0;
942
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++;
943
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
90 if (startidx == 64) startidx--; // always want to print at least one digit
944
1/2
✓ Branch 0 taken 45 times.
✗ Branch 1 not taken.
90 out += buffer + startidx;
945 }
946
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"))
947 {
948
1/2
✓ Branch 0 taken 75 times.
✗ Branch 1 not taken.
75 int64_t value = getnum(params[0]);
949 char buffer[65];
950
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
75 snprintf(buffer, 65, "%0*" PRId64, precision, value);
951
1/2
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
75 out += buffer;
952 }
953
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"))
954 {
955
1/2
✓ Branch 0 taken 78 times.
✗ Branch 1 not taken.
78 int64_t value = getnum(params[0]);
956 char buffer[65];
957
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
78 snprintf(buffer, 65, "%0*" PRIX64, precision, value);
958
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
78 out += buffer;
959 }
960
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"))
961 {
962
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 18 times.
126 if (!hasprec) precision = 5;
963
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);
964 }
965 369 }
966
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 else asar_throw_error(2, error_type_block, error_id_unknown_variable);
967 }
968 1455 return out;
969 1002 }
970
971 222 void handle_autoclean(string& arg, int checkbyte, int write_pos)
972 {
973
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 222 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
222 if(freespaceid > 0) asar_throw_error(0, error_type_block, error_id_autoclean_in_freespace);
974
975 222 const char* labeltest = arg.data();
976
1/2
✓ Branch 0 taken 111 times.
✗ Branch 1 not taken.
222 snes_label lblval = labelval(&labeltest);
977
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 222 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
222 if (*labeltest) asar_throw_error(0, error_type_block, error_id_label_not_found, arg.data());
978 222 int num = lblval.pos;
979
1/2
✓ Branch 0 taken 111 times.
✗ Branch 1 not taken.
222 auto& targetfs = freespaces[lblval.freespace_id];
980
981
2/2
✓ Branch 0 taken 102 times.
✓ Branch 1 taken 120 times.
222 if (pass == 1) {
982 102 targetfs.leaked = false;
983
3/4
✓ Branch 0 taken 84 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 34 times.
✗ Branch 3 not taken.
102 int orig_pos = read3(checkbyte != -1 ? write_pos+1 : write_pos);
984
1/2
✓ Branch 0 taken 34 times.
✗ Branch 1 not taken.
51 int write_pos_pc = snestopc(write_pos);
985 102 targetfs.orgpos = targetfs.orglen = -1;
986
6/8
✓ Branch 0 taken 102 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 102 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 84 times.
✓ Branch 5 taken 18 times.
✓ Branch 6 taken 36 times.
✓ Branch 7 taken 48 times.
102 if(write_pos_pc >= 0 && write_pos_pc < romlen_r && (checkbyte == -1 || romdata_r[write_pos_pc] == checkbyte)) {
987
1/2
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
54 int rats_loc = ratsstart(orig_pos);
988
2/2
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 12 times.
54 if(rats_loc != -1) {
989 42 targetfs.orgpos = rats_loc + 8;
990
1/2
✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
42 targetfs.orglen = read2(rats_loc + 4) + 1;
991
3/4
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
42 if(!targetfs.is_static) removerats(rats_loc + 8, targetfs.cleanbyte);
992 }
993 }
994
2/2
✓ Branch 0 taken 102 times.
✓ Branch 1 taken 18 times.
120 } else if(pass == 2) {
995
1/2
✓ Branch 0 taken 51 times.
✗ Branch 1 not taken.
102 int start = ratsstart(num);
996
3/6
✓ Branch 0 taken 51 times.
✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 51 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
102 if(start >= num || start < 0) asar_throw_error(2, error_type_block, error_id_autoclean_label_at_freespace_end);
997 }
998 222 }
999
1000 // single_line_for_tracker is:
1001 // 0 if not in first block of line, not in (single-line) for loop
1002 // 1 if first block of line
1003 // 2 if in single-line for loop
1004 // 3 if after endfor (of a single-line loop)
1005 158766 void assembleblock(const char * block, int& single_line_for_tracker)
1006 {
1007 #define is(test) (!stricmpwithlower(word[0], test))
1008 #define is0(test) (numwords==1 && !stricmpwithlower(word[0], test))
1009 #define is1(test) (numwords==2 && !stricmpwithlower(word[0], test))
1010 #define is2(test) (numwords==3 && !stricmpwithlower(word[0], test))
1011 #define is3(test) (numwords==4 && !stricmpwithlower(word[0], test))
1012 #define par word[1]
1013
1014
1/2
✓ Branch 0 taken 76284 times.
✗ Branch 1 not taken.
76284 callstack_push cs_push(callstack_entry_type::BLOCK, block);
1015
1016 int numwords;
1017
1/2
✓ Branch 0 taken 76284 times.
✗ Branch 1 not taken.
76284 string splitblock = block;
1018
1/2
✓ Branch 0 taken 158766 times.
✗ Branch 1 not taken.
158766 char ** word = qsplit(splitblock.temp_raw(), ' ', &numwords);
1019 76284 autoptr<char **> scope_word = word;
1020 // when writing out the data for the addrToLine mapping,
1021 // we want to write out the snespos we had before writing opcodes
1022 158766 int addrToLinePos = realsnespos & 0xFFFFFF;
1023
1024
14/14
✓ Branch 0 taken 151917 times.
✓ Branch 1 taken 9684 times.
✓ Branch 2 taken 149766 times.
✓ Branch 3 taken 2151 times.
✓ Branch 4 taken 86946 times.
✓ Branch 5 taken 62820 times.
✓ Branch 6 taken 85452 times.
✓ Branch 7 taken 1494 times.
✓ Branch 8 taken 148152 times.
✓ Branch 9 taken 120 times.
✓ Branch 10 taken 2835 times.
✓ Branch 11 taken 145317 times.
✓ Branch 12 taken 1425 times.
✓ Branch 13 taken 76224 times.
161601 while (numif==numtrue && word[0] && (!word[1] || strcmp(word[1], "=")) && addlabel(word[0]))
1025 {
1026 2835 word++;
1027 2835 numwords--;
1028 }
1029
4/4
✓ Branch 0 taken 156495 times.
✓ Branch 1 taken 2151 times.
✓ Branch 2 taken 81393 times.
✓ Branch 3 taken 75102 times.
158646 if (!word[0] || !word[0][0]) return;
1030
12/12
✓ Branch 0 taken 108198 times.
✓ Branch 1 taken 1644 times.
✓ Branch 2 taken 107208 times.
✓ Branch 3 taken 990 times.
✓ Branch 4 taken 107118 times.
✓ Branch 5 taken 90 times.
✓ Branch 6 taken 101340 times.
✓ Branch 7 taken 5778 times.
✓ Branch 8 taken 53796 times.
✓ Branch 9 taken 47544 times.
✓ Branch 10 taken 4773 times.
✓ Branch 11 taken 47022 times.
109842 if (is("if") || is("elseif") || is("assert") || is("while") || is("for"))
1031 {
1032 4773 string errmsg;
1033 4773 whiletracker wstatus;
1034
1/2
✓ Branch 0 taken 9546 times.
✗ Branch 1 not taken.
9546 wstatus.startline = get_current_line();
1035 9546 wstatus.iswhile = is("while");
1036 9546 wstatus.cond = false;
1037 9546 wstatus.is_for = false;
1038 9546 wstatus.for_start = wstatus.for_end = wstatus.for_cur = 0;
1039 9546 wstatus.for_has_var_backup = false;
1040
2/2
✓ Branch 0 taken 1044 times.
✓ Branch 1 taken 8502 times.
9546 if(is("for")) wstatus.is_for = true;
1041
1042 4773 bool is_for_cont = false;
1043 // if this is a for loop and a whilestatus entry already exists at this level,
1044 // and the for loop isn't finished, this is a continuation of the for loop
1045
6/6
✓ Branch 0 taken 1042 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1019 times.
✓ Branch 3 taken 23 times.
✓ Branch 4 taken 498 times.
✓ Branch 5 taken 23 times.
6338 if (is("for") && whilestatus.count > numif && whilestatus[numif].is_for
1046
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)
1047 369 is_for_cont = true;
1048
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);
1049
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 9456 times.
9546 if (is("assert"))
1050 {
1051
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 autoptr<char**> tokens = qpsplit(word[numwords - 1], ',');
1052
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 verify_paren(tokens);
1053
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)
1054 {
1055 18 string rawerrmsg;
1056 18 size_t pos = 1;
1057
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 36 times.
162 while (tokens[pos])
1058 {
1059
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
126 rawerrmsg += tokens[pos];
1060
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 36 times.
126 if (tokens[pos + 1] != NULL)
1061 {
1062
1/2
✓ Branch 0 taken 45 times.
✗ Branch 1 not taken.
90 rawerrmsg += ",";
1063 }
1064 63 pos++;
1065 }
1066
1067
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
36 errmsg = handle_print(rawerrmsg.raw());
1068 36 }
1069 90 }
1070
1071 //handle nested if statements
1072
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))
1073 {
1074
8/8
✓ Branch 0 taken 342 times.
✓ Branch 1 taken 144 times.
✓ Branch 2 taken 198 times.
✓ Branch 3 taken 144 times.
✓ Branch 4 taken 54 times.
✓ Branch 5 taken 144 times.
✓ Branch 6 taken 171 times.
✓ Branch 7 taken 72 times.
486 if ((is("if") || is("while") || is("for"))) numif++;
1075 243 return;
1076 }
1077
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++;
1078
1079
2/2
✓ Branch 0 taken 15912 times.
✓ Branch 1 taken 9060 times.
24972 for(int i = 1; i < numwords - 1; i++)
1080 {
1081 15912 word[i][strlen(word[i])] = ' ';
1082 }
1083 9060 numwords = 2;
1084
1085 bool cond;
1086
2/2
✓ Branch 0 taken 8070 times.
✓ Branch 1 taken 990 times.
9060 if(!is("for"))
1087 {
1088
1/2
✓ Branch 0 taken 8070 times.
✗ Branch 1 not taken.
8070 cond = getnum(word[1]);
1089
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]);
1090 }
1091
1092
2/2
✓ Branch 0 taken 990 times.
✓ Branch 1 taken 7980 times.
8970 if (is("for"))
1093 {
1094
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 990 times.
990 if(single_line_for_tracker != 1)
1095 {
1096 numif--;
1097 asar_throw_error(0, error_type_line, error_id_bad_single_line_for);
1098 }
1099
1100
2/2
✓ Branch 0 taken 252 times.
✓ Branch 1 taken 738 times.
990 if(!is_for_cont)
1101 {
1102 252 char* past_eq = strchr(word[1], '=');
1103
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
252 if(!past_eq)
1104 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "missing loop range");
1105
1106
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 string varname(word[1], past_eq - word[1]);
1107 252 past_eq += 1;
1108
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 strip_whitespace(varname);
1109
2/4
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 252 times.
252 if(!validatedefinename(varname))
1110 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "invalid define name");
1111
1112
1/2
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
252 char* range_sep = strqpstr(past_eq, "..");
1113
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
252 if(!range_sep)
1114 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "invalid loop range");
1115
1116
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 string for_start(past_eq, range_sep - past_eq);
1117
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 strip_whitespace(for_start);
1118
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 string for_end(range_sep+2);
1119
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 strip_whitespace(for_end);
1120
1121
1/2
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
252 addedwstatus.for_start = getnum(for_start);
1122
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 if(foundlabel && !foundlabel_static)
1123 asar_throw_error(0, error_type_block, error_id_label_in_conditional, "for");
1124
1/2
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
252 addedwstatus.for_end = getnum(for_end);
1125
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 if(foundlabel && !foundlabel_static)
1126 asar_throw_error(0, error_type_block, error_id_label_in_conditional, "for");
1127
1128
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 addedwstatus.for_variable = varname;
1129 252 addedwstatus.for_cur = addedwstatus.for_start;
1130 252 }
1131 738 else addedwstatus.for_cur++;
1132
1133 990 addedwstatus.cond = addedwstatus.for_cur < addedwstatus.for_end;
1134 990 single_line_for_tracker = 2;
1135
2/2
✓ Branch 0 taken 738 times.
✓ Branch 1 taken 252 times.
990 if(addedwstatus.cond)
1136 {
1137
2/2
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 81 times.
738 numtrue++;
1138
4/4
✓ Branch 0 taken 657 times.
✓ Branch 1 taken 81 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 81 times.
738 if(defines.exists(addedwstatus.for_variable))
1139 {
1140 576 addedwstatus.for_has_var_backup = true;
1141
2/4
✓ Branch 0 taken 288 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 288 times.
✗ Branch 3 not taken.
576 addedwstatus.for_var_backup = defines.find(addedwstatus.for_variable);
1142 }
1143
3/6
✓ Branch 0 taken 738 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 369 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 369 times.
✗ Branch 5 not taken.
738 defines.create(addedwstatus.for_variable) = ftostr(addedwstatus.for_cur);
1144 }
1145 }
1146
6/6
✓ Branch 0 taken 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"))
1147 {
1148 if(0);
1149
2/2
✓ Branch 0 taken 5754 times.
✓ Branch 1 taken 1290 times.
7044 else if (cond)
1150 {
1151 5754 numtrue++;
1152
1/2
✓ Branch 0 taken 2877 times.
✗ Branch 1 not taken.
5754 elsestatus[numif]=true;
1153 }
1154
1/2
✓ Branch 0 taken 645 times.
✗ Branch 1 not taken.
645 else if (!cond)
1155 {
1156
1/2
✓ Branch 0 taken 645 times.
✗ Branch 1 not taken.
1290 elsestatus[numif]=false;
1157 }
1158 7044 addedwstatus.cond = cond;
1159 }
1160
2/2
✓ Branch 0 taken 846 times.
✓ Branch 1 taken 90 times.
936 else if (is("elseif"))
1161 {
1162
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 846 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
846 if (!numif) asar_throw_error(1, error_type_block, error_id_misplaced_elseif);
1163
3/6
✓ Branch 0 taken 423 times.
✓ Branch 1 taken 423 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 423 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
846 if (whilestatus[numif - 1].iswhile) asar_throw_error(1, error_type_block, error_id_elseif_in_while);
1164
2/2
✓ Branch 0 taken 324 times.
✓ Branch 1 taken 522 times.
846 if (numif==numtrue) numtrue--;
1165
8/8
✓ Branch 0 taken 324 times.
✓ Branch 1 taken 522 times.
✓ Branch 2 taken 279 times.
✓ Branch 3 taken 45 times.
✓ Branch 4 taken 117 times.
✓ Branch 5 taken 45 times.
✓ Branch 6 taken 117 times.
✓ Branch 7 taken 306 times.
1008 if (cond && !elsestatus[numif])
1166 {
1167 234 numtrue++;
1168
1/2
✓ Branch 0 taken 117 times.
✗ Branch 1 not taken.
234 elsestatus[numif]=true;
1169 }
1170 }
1171 // otherwise, must be assert command
1172
4/4
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 60 times.
✓ Branch 2 taken 24 times.
✓ Branch 3 taken 6 times.
90 else if (pass == 2 && !cond)
1173 {
1174
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());
1175
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 else asar_throw_error(2, error_type_block, error_id_assertion_failed, ".");
1176 }
1177
4/4
✓ Branch 0 taken 4473 times.
✓ Branch 1 taken 243 times.
✓ Branch 2 taken 4473 times.
✓ Branch 3 taken 243 times.
9903 }
1178
14/14
✓ Branch 0 taken 18516 times.
✓ Branch 1 taken 81780 times.
✓ Branch 2 taken 16872 times.
✓ Branch 3 taken 1644 times.
✓ Branch 4 taken 16872 times.
✓ Branch 5 taken 81780 times.
✓ Branch 6 taken 11094 times.
✓ Branch 7 taken 5778 times.
✓ Branch 8 taken 11094 times.
✓ Branch 9 taken 81780 times.
✓ Branch 10 taken 1044 times.
✓ Branch 11 taken 10050 times.
✓ Branch 12 taken 4233 times.
✓ Branch 13 taken 42789 times.
100296 else if (is0("endif") || is0("endwhile") || is0("endfor"))
1179 {
1180
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8466 times.
8466 if (!numif)
1181 asar_throw_error(1, error_type_block, error_id_misplaced_endif);
1182
1/2
✓ Branch 0 taken 4233 times.
✗ Branch 1 not taken.
8466 whiletracker& thisws = whilestatus[numif - 1];
1183
1184
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")) ||
1185
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")) ||
1186
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")))
1187 asar_throw_error(1, error_type_block, error_id_misplaced_endif);
1188
1189
2/2
✓ Branch 0 taken 6258 times.
✓ Branch 1 taken 2208 times.
8466 if (numif==numtrue) numtrue--;
1190 8466 numif--;
1191
1192
2/2
✓ Branch 0 taken 1044 times.
✓ Branch 1 taken 7422 times.
8466 if(thisws.is_for)
1193 {
1194
2/2
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 864 times.
1044 if(single_line_for_tracker == 2) single_line_for_tracker = 3;
1195
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1044 times.
1044 if(moreonline)
1196 {
1197 // sabotage the whilestatus to prevent the loop running again
1198 // and spamming more of the same error
1199 thisws.for_cur = thisws.for_end;
1200 thisws.cond = false;
1201 asar_throw_error(0, error_type_block, error_id_bad_single_line_for);
1202 }
1203
1204
2/2
✓ Branch 0 taken 738 times.
✓ Branch 1 taken 306 times.
1044 if(thisws.cond)
1205 {
1206
2/2
✓ Branch 0 taken 576 times.
✓ Branch 1 taken 162 times.
738 if(thisws.for_has_var_backup)
1207
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;
1208 else
1209
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 defines.remove(thisws.for_variable);
1210 }
1211 }
1212 }
1213
6/6
✓ Branch 0 taken 10050 times.
✓ Branch 1 taken 81780 times.
✓ Branch 2 taken 5010 times.
✓ Branch 3 taken 5040 times.
✓ Branch 4 taken 399 times.
✓ Branch 5 taken 42390 times.
91830 else if (is0("else"))
1214 {
1215
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);
1216
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);
1217
2/2
✓ Branch 0 taken 318 times.
✓ Branch 1 taken 480 times.
798 else if (numif==numtrue) numtrue--;
1218
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])
1219 {
1220 174 numtrue++;
1221
1/2
✓ Branch 0 taken 87 times.
✗ Branch 1 not taken.
174 elsestatus[numif]=true;
1222 }
1223 }
1224
2/2
✓ Branch 0 taken 48642 times.
✓ Branch 1 taken 42390 times.
91032 else if (numif!=numtrue) return;
1225
4/4
✓ Branch 0 taken 85788 times.
✓ Branch 1 taken 48 times.
✓ Branch 2 taken 29589 times.
✓ Branch 3 taken 56199 times.
85836 else if (asblock_pick(word, numwords))
1226 {
1227
1/2
✓ Branch 0 taken 29589 times.
✗ Branch 1 not taken.
29589 add_addr_to_line(addrToLinePos);
1228 }
1229
12/12
✓ Branch 0 taken 52659 times.
✓ Branch 1 taken 3540 times.
✓ Branch 2 taken 40947 times.
✓ Branch 3 taken 11712 times.
✓ Branch 4 taken 40785 times.
✓ Branch 5 taken 162 times.
✓ Branch 6 taken 38997 times.
✓ Branch 7 taken 1788 times.
✓ Branch 8 taken 288 times.
✓ Branch 9 taken 38709 times.
✓ Branch 10 taken 6999 times.
✓ Branch 11 taken 17970 times.
56199 else if (numwords > 1 && (is("db") || is("dw") || is("dl") || is("dd")))
1230 {
1231 6999 string line;
1232
2/2
✓ Branch 0 taken 13950 times.
✓ Branch 1 taken 13950 times.
27900 for(int i = 1; i < numwords; i++){
1233
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13950 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
13950 if(i > 1) line += " ";
1234
1/2
✓ Branch 0 taken 6999 times.
✗ Branch 1 not taken.
13950 line += word[i];
1235 }
1236
1/2
✓ Branch 0 taken 13950 times.
✗ Branch 1 not taken.
13950 autoptr<char**> pars=qpsplit(line.temp_raw(), ',');
1237
1/2
✓ Branch 0 taken 13950 times.
✗ Branch 1 not taken.
13950 verify_paren(pars);
1238
1239 void (*do_write)(unsigned int);
1240 13950 char first = to_lower(word[0][1]);
1241
2/2
✓ Branch 0 taken 6999 times.
✓ Branch 1 taken 6951 times.
13950 if (first == 'b') do_write = &write1;
1242
2/2
✓ Branch 0 taken 1119 times.
✓ Branch 1 taken 1119 times.
2238 else if (first == 'w') do_write = &write2;
1243
2/2
✓ Branch 0 taken 1038 times.
✓ Branch 1 taken 1038 times.
2076 else if (first == 'l') do_write = &write3;
1244 144 else do_write = &write4;
1245
1246
2/2
✓ Branch 0 taken 16440 times.
✓ Branch 1 taken 13884 times.
30324 for (int i=0;pars[i];i++)
1247 {
1248
2/2
✓ Branch 0 taken 669 times.
✓ Branch 1 taken 15771 times.
16440 if (pars[i][0]=='"')
1249 {
1250
1/2
✓ Branch 0 taken 669 times.
✗ Branch 1 not taken.
669 char * str=const_cast<char*>(safedequote(pars[i]));
1251 669 int codepoint = 0u;
1252
1/2
✓ Branch 0 taken 669 times.
✗ Branch 1 not taken.
669 str += utf8_val(&codepoint, str);
1253
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 )
1254 {
1255
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));
1256
1/2
✓ Branch 0 taken 2718 times.
✗ Branch 1 not taken.
2718 str += utf8_val(&codepoint, str);
1257 }
1258
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);
1259 }
1260 else
1261 {
1262
5/6
✓ Branch 0 taken 5251 times.
✓ Branch 1 taken 10520 times.
✓ Branch 2 taken 5185 times.
✓ Branch 3 taken 66 times.
✓ Branch 4 taken 15705 times.
✗ Branch 5 not taken.
15771 do_write((pass==2)?getnum(pars[i]):0);
1263 }
1264 }
1265
1/2
✓ Branch 0 taken 13884 times.
✗ Branch 1 not taken.
13884 add_addr_to_line(addrToLinePos);
1266 14016 }
1267
2/2
✓ Branch 0 taken 1566 times.
✓ Branch 1 taken 40683 times.
42249 else if(word[0][0]=='%')
1268 {
1269
2/2
✓ Branch 0 taken 1530 times.
✓ Branch 1 taken 36 times.
1566 callmacro(strchr(block, '%')+1);
1270 }
1271
6/6
✓ Branch 0 taken 36033 times.
✓ Branch 1 taken 4650 times.
✓ Branch 2 taken 21186 times.
✓ Branch 3 taken 14847 times.
✓ Branch 4 taken 180 times.
✓ Branch 5 taken 17007 times.
40683 else if (is1("undef"))
1272 {
1273
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);
1274
1275
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))
1276 {
1277
1/2
✓ Branch 0 taken 342 times.
✗ Branch 1 not taken.
342 defines.remove(def);
1278 }
1279 else
1280 {
1281
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());
1282 }
1283 360 }
1284
6/6
✓ Branch 0 taken 1992 times.
✓ Branch 1 taken 38331 times.
✓ Branch 2 taken 981 times.
✓ Branch 3 taken 1011 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 16998 times.
40323 else if (is0("error"))
1285 {
1286
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_error_command, ".");
1287 }
1288
6/6
✓ Branch 0 taken 1974 times.
✓ Branch 1 taken 38331 times.
✓ Branch 2 taken 972 times.
✓ Branch 3 taken 1002 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 16989 times.
40305 else if (is0("warn"))
1289 {
1290
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 asar_throw_warning(2, warning_id_warn_command, ".");
1291 }
1292
6/6
✓ Branch 0 taken 35673 times.
✓ Branch 1 taken 4614 times.
✓ Branch 2 taken 21009 times.
✓ Branch 3 taken 14664 times.
✓ Branch 4 taken 21 times.
✓ Branch 5 taken 16968 times.
40287 else if (is1("error"))
1293 {
1294
1/2
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
39 string out = handle_print(par);
1295 // RPG Hacker: This used to be on pass 0, which had its merits (you don't want to miss a potentially critical
1296 // user-generated error, just because a bazillion other errors are thrown in passes before it). However, I
1297 // don't see how to support print functions with this without moving it to pass 2. Suggestions are welcome.
1298
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());
1299 39 }
1300
6/6
✓ Branch 0 taken 35634 times.
✓ Branch 1 taken 4614 times.
✓ Branch 2 taken 20991 times.
✓ Branch 3 taken 14643 times.
✓ Branch 4 taken 21 times.
✓ Branch 5 taken 16947 times.
40248 else if (is1("warn"))
1301 {
1302
1/2
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
39 string out = handle_print(par);
1303
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());
1304 39 }
1305
6/6
✓ Branch 0 taken 35595 times.
✓ Branch 1 taken 4614 times.
✓ Branch 2 taken 20970 times.
✓ Branch 3 taken 14625 times.
✓ Branch 4 taken 72 times.
✓ Branch 5 taken 16875 times.
40209 else if (is1("warnings"))
1306 {
1307
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)
1308 {
1309
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 push_warnings();
1310 }
1311
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)
1312 {
1313
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 18 times.
72 pull_warnings();
1314 }
1315 else
1316 {
1317 asar_throw_error(0, error_type_block, error_id_broken_command, "warnings", "Unknown parameter");
1318 }
1319 }
1320
6/6
✓ Branch 0 taken 2460 times.
✓ Branch 1 taken 37605 times.
✓ Branch 2 taken 1230 times.
✓ Branch 3 taken 1230 times.
✓ Branch 4 taken 126 times.
✓ Branch 5 taken 16749 times.
40065 else if (is2("warnings"))
1321 {
1322
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)
1323 {
1324
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 asar_warning_id warnid = parse_warning_id_from_string(word[2]);
1325
1326
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
54 if (warnid != warning_id_end)
1327 {
1328
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 set_warning_enabled(warnid, true);
1329 }
1330 else
1331 {
1332
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");
1333 }
1334 }
1335
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)
1336 {
1337
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 asar_warning_id warnid = parse_warning_id_from_string(word[2]);
1338
1339
2/2
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 36 times.
198 if (warnid != warning_id_end)
1340 {
1341
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 set_warning_enabled(warnid, false);
1342 }
1343 else
1344 {
1345
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");
1346 }
1347 }
1348 else
1349 {
1350 asar_throw_error(0, error_type_block, error_id_broken_command, "warnings", "Unknown parameter");
1351 }
1352 }
1353
6/6
✓ Branch 0 taken 35451 times.
✓ Branch 1 taken 4362 times.
✓ Branch 2 taken 20898 times.
✓ Branch 3 taken 14553 times.
✓ Branch 4 taken 63 times.
✓ Branch 5 taken 16686 times.
39813 else if(is1("global"))
1354 {
1355
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))
1356 {
1357
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]);
1358 }
1359 }
1360
6/6
✓ Branch 0 taken 2208 times.
✓ Branch 1 taken 37479 times.
✓ Branch 2 taken 1104 times.
✓ Branch 3 taken 1104 times.
✓ Branch 4 taken 105 times.
✓ Branch 5 taken 16581 times.
39687 else if (is2("check"))
1361 {
1362
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)
1363 {
1364 // RPG Hacker: Removed trimming for now - I think requiring an exact match is probably
1365 // better here (not sure, though, it's worth discussing)
1366
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]);
1367 // randomdude999: this also removes leading spaces because itrim gets stuck in an endless
1368 // loop when multi is true and one argument is empty
1369 // in hirom the rom needs to be an entire bank for it to have a title, other modes only need 0x8000 bytes
1370
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
1371 {
1372 if (!ignoretitleerrors) // title errors shouldn't be ignored
1373 asar_throw_error(0, error_type_block, error_id_rom_too_short, expected_title.data());
1374 else // title errors should be ignored, throw a warning anyways
1375 asar_throw_warning(0, warning_id_rom_too_short, expected_title.data());
1376 }
1377 else {
1378 9 string actual_title;
1379 9 string actual_display_title;
1380
2/2
✓ Branch 0 taken 378 times.
✓ Branch 1 taken 18 times.
396 for (int i = 0;i < 21;i++)
1381 {
1382
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
378 unsigned char c = romdata[snestopc(0x00FFC0 + i)];
1383
1/2
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
378 actual_title += (char)c;
1384 // the replacements are from interface-cli.cpp
1385
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == 7) c = 14;
1386
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == 8) c = 27;
1387
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == 9) c = 26;
1388
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == '\r') c = 17;
1389
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == '\n') c = 25;
1390
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 378 times.
378 if (c == '\0') c = 155;
1391
1/2
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
378 actual_display_title += (char)c;
1392 }
1393
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (strncmp(expected_title, actual_title, 21) != 0)
1394 {
1395 if (!ignoretitleerrors) // title errors shouldn't be ignored
1396 asar_throw_error(0, error_type_block, error_id_rom_title_incorrect, expected_title.data(), actual_display_title.data());
1397 else // title errors should be ignored, throw a warning anyways
1398 asar_throw_warning(0, warning_id_rom_title_incorrect, expected_title.data(), actual_display_title.data());
1399 }
1400 18 }
1401 18 }
1402
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)
1403 {
1404 if (0);
1405
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"))
1406 {
1407 90 disable_bank_cross_errors = true;
1408 }
1409
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"))
1410 {
1411 96 disable_bank_cross_errors = false;
1412 96 check_half_banks_crossed = true;
1413 }
1414
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"))
1415 {
1416 6 disable_bank_cross_errors = false;
1417 6 check_half_banks_crossed = false;
1418 }
1419 else asar_throw_error(0, error_type_block, error_id_invalid_check);
1420
1421 }
1422 else
1423 {
1424 asar_throw_error(0, error_type_block, error_id_invalid_check);
1425 }
1426 }
1427
9/10
✓ Branch 0 taken 1956 times.
✓ Branch 1 taken 37521 times.
✓ Branch 2 taken 1956 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 35325 times.
✓ Branch 5 taken 4152 times.
✓ Branch 6 taken 108 times.
✓ Branch 7 taken 35217 times.
✓ Branch 8 taken 54 times.
✓ Branch 9 taken 16527 times.
39477 else if (is0("asar") || is1("asar"))
1428 {
1429
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);
1430
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 54 times.
198 if (!par) return;
1431 54 int dots=0;
1432 54 int dig=0;
1433
2/2
✓ Branch 0 taken 450 times.
✓ Branch 1 taken 108 times.
558 for (int i=0;par[i];i++)
1434 {
1435
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 324 times.
450 if (par[i]=='.')
1436 {
1437
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);
1438 63 dig=0;
1439 126 dots++;
1440 }
1441
1/2
✓ Branch 0 taken 324 times.
✗ Branch 1 not taken.
324 else if (is_digit(par[i])) dig++;
1442 else asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1443 }
1444
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);
1445
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 autoptr<char**> vers=split(par, '.');
1446 108 int vermaj=atoi(vers[0]);
1447
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);
1448
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 18 times.
108 if (vermaj<asarver_maj) return;
1449
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (dots==1)
1450 {
1451 if (strlen(vers[1])!=2) asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1452 //if (asarver_min<10 && asarver_bug<10 && strlen(vers[1])>2) error(0, "This version of Asar is too old for this patch.");
1453 int verminbug=atoi(vers[1]);
1454 int tmpver=asarver_bug;
1455 if (tmpver>9) tmpver=9;
1456 if (asarver_min*10+tmpver<verminbug) asar_throw_error(pass, error_type_fatal, error_id_asar_too_old);
1457 }
1458 else
1459 {
1460 18 int vermin=atoi(vers[1]);
1461
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);
1462 18 int verbug=atoi(vers[2]);
1463
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);
1464 }
1465
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 45 times.
108 }
1466
10/10
✓ Branch 0 taken 1956 times.
✓ Branch 1 taken 37413 times.
✓ Branch 2 taken 1950 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 35217 times.
✓ Branch 5 taken 4146 times.
✓ Branch 6 taken 18 times.
✓ Branch 7 taken 35199 times.
✓ Branch 8 taken 12 times.
✓ Branch 9 taken 16515 times.
39369 else if (is0("include") || is1("includefrom"))
1467 {
1468
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);
1469
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())
1470 {
1471
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());
1472
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, "");
1473 }
1474 }
1475
6/6
✓ Branch 0 taken 1950 times.
✓ Branch 1 taken 37395 times.
✓ Branch 2 taken 960 times.
✓ Branch 3 taken 990 times.
✓ Branch 4 taken 45 times.
✓ Branch 5 taken 16470 times.
39345 else if (is0("includeonce"))
1476 {
1477
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 const char* current_file = get_current_file_name();
1478
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))
1479 {
1480
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);
1481 }
1482 }
1483
6/6
✓ Branch 0 taken 1998 times.
✓ Branch 1 taken 37257 times.
✓ Branch 2 taken 1746 times.
✓ Branch 3 taken 252 times.
✓ Branch 4 taken 252 times.
✓ Branch 5 taken 747 times.
39255 else if (numwords==3 && !stricmp(word[1], "="))
1484 {
1485
3/4
✓ Branch 0 taken 1206 times.
✓ Branch 1 taken 288 times.
✓ Branch 2 taken 1206 times.
✗ Branch 3 not taken.
1494 if(word[0][0] == '\'' && word[0][1])
1486 {
1487 int codepoint;
1488 1206 const char* char_start = word[0]+1;
1489
1/2
✓ Branch 0 taken 1206 times.
✗ Branch 1 not taken.
1206 const char* after = char_start + utf8_val(&codepoint, char_start);
1490
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);
1491
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') {
1492
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]));
1493
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);
1494 1188 return;
1495 } // todo: error checking here
1496 }
1497 // randomdude999: int cast b/c i'm too lazy to also mess with making setlabel()
1498 // unsigned, besides it wouldn't matter anyways.
1499
1/2
✓ Branch 0 taken 288 times.
✗ Branch 1 not taken.
288 int num=(int)getnum(word[2]);
1500
5/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 252 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
288 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_label_cross_assignment);
1501
1502 270 const char* newlabelname = word[0];
1503 135 bool ismacro = false;
1504
1505
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 252 times.
270 if (newlabelname[0] == '?')
1506 {
1507 9 ismacro = true;
1508 18 newlabelname++;
1509 }
1510
1511
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 126 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
144 if (ismacro && macrorecursion == 0)
1512 {
1513 asar_throw_error(0, error_type_block, error_id_macro_label_outside_of_macro);
1514 }
1515
1516
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(newlabelname)) asar_throw_error(0, error_type_block, error_id_invalid_label_name);
1517
1518 135 string completename;
1519
1520
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 252 times.
270 if (ismacro)
1521 {
1522
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) + "_";
1523 }
1524
1525
1/2
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
270 completename += newlabelname;
1526
1527
2/4
✓ Branch 0 taken 270 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
270 setlabel(ns + completename, num, true);
1528 270 }
1529
3/4
✓ Branch 0 taken 37761 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 37053 times.
✓ Branch 3 taken 708 times.
37761 else if (assemblemapper(word, numwords)) {}
1530
6/6
✓ Branch 0 taken 35142 times.
✓ Branch 1 taken 1911 times.
✓ Branch 2 taken 20793 times.
✓ Branch 3 taken 14349 times.
✓ Branch 4 taken 1209 times.
✓ Branch 5 taken 14145 times.
37053 else if (is1("org"))
1531 {
1532
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2370 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2370 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
1533
1/2
✓ Branch 0 taken 1209 times.
✗ Branch 1 not taken.
2370 freespaceend();
1534
1/2
✓ Branch 0 taken 2370 times.
✗ Branch 1 not taken.
2370 unsigned int num=getnum(par);
1535
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2370 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2370 if (forwardlabel) asar_throw_error(0, error_type_block, error_id_org_label_forward);
1536
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2370 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2370 if (num&~0xFFFFFF) asar_throw_error(1, error_type_block, error_id_snes_address_out_of_bounds, hex(num, 6).data());
1537
5/10
✓ Branch 0 taken 819 times.
✓ Branch 1 taken 1551 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 801 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.
2370 if ((mapper==lorom || mapper==exlorom) && (num&0x408000)==0x400000 && (num&0x700000)!=0x700000) asar_throw_warning(0, warning_id_set_middle_byte);
1538 2370 snespos=(int)num;
1539 2370 realsnespos=(int)num;
1540 2370 startpos=(int)num;
1541 2370 realstartpos=(int)num;
1542 2370 snespos_valid = true;
1543 }
1544 #define ret_error(errid) { asar_throw_error(0, error_type_block, errid); return; }
1545 #define ret_error_params(errid, ...) { asar_throw_error(0, error_type_block, errid, __VA_ARGS__); return; }
1546
2/2
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 34413 times.
34683 else if (is("struct"))
1547 {
1548 //verifysnespos();
1549
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);
1550
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);
1551
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);
1552
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);
1553
1554
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]);
1555
1556 270 static_struct = false;
1557 270 old_snespos = snespos;
1558 270 old_startpos = startpos;
1559 270 old_optimizeforbank = optimizeforbank;
1560 270 old_snespos_valid = snespos_valid;
1561 135 unsigned int base = 0;
1562
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 180 times.
270 if (numwords == 3)
1563 {
1564 90 static_struct = true;
1565
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 base = getnum(word[2]);
1566
1567
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;
1568 }
1569
1570 270 bool old_in_struct = in_struct;
1571 270 bool old_in_sub_struct = in_sub_struct;
1572
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;
1573 270 in_sub_struct = numwords == 4;
1574
1575 #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; }
1576 #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; }
1577
1578
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 180 times.
270 if (numwords == 3)
1579 {
1580
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());
1581 90 snespos = (int)base;
1582 90 startpos = (int)base;
1583 }
1584
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 108 times.
180 else if (numwords == 4)
1585 {
1586
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);
1587
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);
1588
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 string tmp_struct_parent = word[3];
1589
1590
3/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 36 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
72 if (!structs.exists(tmp_struct_parent)) ret_error_params_cleanup(error_id_struct_not_found, tmp_struct_parent.data());
1591
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);
1592
1593 72 static_struct = structure.is_static;
1594
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 struct_parent = tmp_struct_parent;
1595 72 snespos = structure.base_end;
1596 72 startpos = structure.base_end;
1597
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
72 }
1598
1599
1/2
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
270 push_pc();
1600
1601 270 optimizeforbank = -1;
1602
1603
1/2
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
270 struct_name = word[1];
1604 270 struct_base = snespos;
1605 270 realsnespos = 0;
1606 270 realstartpos = 0;
1607 270 snespos_valid = true;
1608
1609
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);
1610
1611 #undef ret_error_cleanup
1612 #undef ret_error_params_cleanup
1613 }
1614
2/2
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 34143 times.
34413 else if (is("endstruct"))
1615 {
1616
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);
1617
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);
1618
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);
1619
1620
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;
1621
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);
1622
1623 135 snes_struct structure;
1624 270 structure.base_end = snespos;
1625 270 structure.struct_size = alignment * ((snespos - struct_base + alignment - 1) / alignment);
1626 270 structure.object_size = structure.struct_size;
1627 270 structure.is_static = static_struct;
1628
1629
2/2
✓ Branch 0 taken 198 times.
✓ Branch 1 taken 72 times.
270 if (in_struct)
1630 {
1631
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;
1632 }
1633
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 else if (in_sub_struct)
1634 {
1635 36 snes_struct parent;
1636
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);
1637
1638
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 if (parent.object_size < parent.struct_size + structure.struct_size) {
1639 72 parent.object_size = parent.struct_size + structure.struct_size;
1640 }
1641
1642
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;
1643
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;
1644 36 }
1645
1646
1/2
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
270 pop_pc();
1647 270 in_struct = false;
1648 270 in_sub_struct = false;
1649 270 snespos = old_snespos;
1650 270 startpos = old_startpos;
1651 270 optimizeforbank = old_optimizeforbank;
1652 270 snespos_valid = old_snespos_valid;
1653 270 static_struct = false;
1654 135 }
1655 #undef ret_error
1656
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 34125 times.
34143 else if(is("spcblock"))
1657 {
1658 //banned features when active: org, freespace(and variants), arch, mapper,namespace,pushns
1659
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);
1660
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);
1661
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);
1662
1663
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 spcblock.destination = getnum(par);
1664 18 spcblock.type = spcblock_nspc;
1665
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
9 spcblock.macro_name = "";
1666
1667
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());
1668
1669
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if(numwords == 3)
1670 {
1671 if(!stricmp(word[2], "nspc")) spcblock.type = spcblock_nspc;
1672 else if(!stricmp(word[2], "custom")) asar_throw_error(0, error_type_block, error_id_custom_spcblock_missing_macro);
1673 else asar_throw_error(0, error_type_block, error_id_unknown_spcblock_type);
1674 }
1675
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 else if(numwords == 4)
1676 {
1677 if(!stricmp(word[2], "custom")) spcblock.type = spcblock_custom;
1678 else asar_throw_error(0, error_type_block, error_id_extra_spcblock_arg_for_type);
1679
1680 if(macros.exists(word[3]))
1681 {
1682 macrodata *macro = macros.find(word[3]);
1683 if(!macro->variadic) asar_throw_error(0, error_type_block, error_id_spcblock_macro_must_be_varadic);
1684 if(macro->numargs != 3) asar_throw_error(0, error_type_block, error_id_spcblock_macro_invalid_static_args);
1685 spcblock.macro_name = word[3];
1686 }
1687 else asar_throw_error(0, error_type_block, error_id_spcblock_macro_doesnt_exist);
1688 }
1689
1690
1/3
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
18 switch(spcblock.type)
1691 {
1692 18 case spcblock_nspc:
1693 18 spcblock.size_address=realsnespos;
1694
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write2(0x0000);
1695
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write2(spcblock.destination);
1696 18 snespos=(int)spcblock.destination;
1697 18 startpos=(int)spcblock.destination;
1698 18 spcblock.execute_address = -1u;
1699
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 add_addr_to_line(addrToLinePos);
1700 9 break;
1701 case spcblock_custom:
1702 //this is a todo that probably won't be ready for 1.9
1703 //mostly so we can leverage some cleanups we make in 2.0 for practicality
1704 asar_throw_error(0, error_type_block, error_id_spcblock_custom_types_incomplete);
1705 push_pc();
1706 spcblock.old_mapper = mapper;
1707 mapper = norom;
1708 break;
1709 default:
1710 asar_throw_error(0, error_type_fatal, error_id_internal_error, "invalid spcblock type");
1711 }
1712
1713
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
9 ns_backup = ns;
1714
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;
1715 18 in_spcblock = true;
1716 }
1717
6/6
✓ Branch 0 taken 957 times.
✓ Branch 1 taken 33168 times.
✓ Branch 2 taken 477 times.
✓ Branch 3 taken 480 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 13857 times.
34125 else if(is0("endspcblock"))
1718 {
1719
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);
1720
1721
1/3
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
18 switch(spcblock.type)
1722 {
1723 18 case spcblock_nspc:
1724
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 12 times.
18 if (pass==2)
1725 {
1726
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6 int pcpos=snestopc(spcblock.size_address&0xFFFFFF);
1727
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());
1728 6 int num=snespos-startpos;
1729
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 writeromdata_byte(pcpos, (unsigned char)num);
1730
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 writeromdata_byte(pcpos+1, (unsigned char)(num >> 8));
1731 }
1732
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if(spcblock.execute_address != -1u)
1733 {
1734
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write2(0x0000);
1735
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write2((unsigned int)spcblock.execute_address);
1736 }
1737 9 break;
1738 case spcblock_custom:
1739 mapper = spcblock.old_mapper;
1740 pop_pc();
1741 break;
1742 default:
1743 asar_throw_error(0, error_type_fatal, error_id_internal_error, "invalid spcblock type");
1744 }
1745
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
9 ns = ns_backup;
1746 18 in_spcblock = false;
1747 }
1748
6/6
✓ Branch 0 taken 32646 times.
✓ Branch 1 taken 1461 times.
✓ Branch 2 taken 19521 times.
✓ Branch 3 taken 13125 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 13848 times.
34107 else if (is1("startpos"))
1749 {
1750
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);
1751
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 spcblock.execute_address=getnum(par);
1752 }
1753
6/6
✓ Branch 0 taken 32628 times.
✓ Branch 1 taken 1461 times.
✓ Branch 2 taken 19512 times.
✓ Branch 3 taken 13116 times.
✓ Branch 4 taken 135 times.
✓ Branch 5 taken 13713 times.
34089 else if (is1("base"))
1754 {
1755
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"))
1756 {
1757 90 snespos=realsnespos;
1758 90 startpos=realstartpos;
1759 90 snespos_valid = realsnespos >= 0;
1760 90 return;
1761 }
1762
1/2
✓ Branch 0 taken 180 times.
✗ Branch 1 not taken.
180 unsigned int num=getnum(par);
1763
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);
1764
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());
1765 180 snespos=(int)num;
1766 180 startpos=(int)num;
1767 180 optimizeforbank=-1;
1768 180 snespos_valid = realsnespos >= 0;
1769 }
1770
6/6
✓ Branch 0 taken 32358 times.
✓ Branch 1 taken 1461 times.
✓ Branch 2 taken 19377 times.
✓ Branch 3 taken 12981 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 13695 times.
33819 else if (is1("dpbase"))
1771 {
1772
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 unsigned int num=(int)getnum(par);
1773
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);
1774
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());
1775 36 dp_base = (int)num;
1776 }
1777
6/6
✓ Branch 0 taken 396 times.
✓ Branch 1 taken 33387 times.
✓ Branch 2 taken 198 times.
✓ Branch 3 taken 198 times.
✓ Branch 4 taken 117 times.
✓ Branch 5 taken 13578 times.
33783 else if (is2("optimize"))
1778 {
1779
4/4
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 72 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 72 times.
234 if (!stricmp(par, "dp"))
1780 {
1781
4/4
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 27 times.
90 if (!stricmp(word[2], "none"))
1782 {
1783 36 optimize_dp = optimize_dp_flag::NONE;
1784 36 return;
1785 }
1786
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"))
1787 {
1788 18 optimize_dp = optimize_dp_flag::RAM;
1789 18 return;
1790 }
1791
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"))
1792 {
1793 36 optimize_dp = optimize_dp_flag::ALWAYS;
1794 36 return;
1795 }
1796 asar_throw_error(1, error_type_block, error_id_bad_dp_optimize, word[2]);
1797 }
1798
2/4
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
144 if (!stricmp(par, "address"))
1799 {
1800
4/4
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 54 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 54 times.
144 if (!stricmp(word[2], "default"))
1801 {
1802 36 optimize_address = optimize_address_flag::DEFAULT;
1803 36 return;
1804 }
1805
4/4
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 27 times.
✓ Branch 3 taken 27 times.
108 if (!stricmp(word[2], "ram"))
1806 {
1807 54 optimize_address = optimize_address_flag::RAM;
1808 54 return;
1809 }
1810
2/4
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
54 if (!stricmp(word[2], "mirrors"))
1811 {
1812 54 optimize_address = optimize_address_flag::MIRRORS;
1813 54 return;
1814 }
1815 asar_throw_error(1, error_type_block, error_id_bad_address_optimize, word[2]);
1816 }
1817 asar_throw_error(1, error_type_block, error_id_bad_optimize, par);
1818 }
1819
6/6
✓ Branch 0 taken 32322 times.
✓ Branch 1 taken 1227 times.
✓ Branch 2 taken 19359 times.
✓ Branch 3 taken 12963 times.
✓ Branch 4 taken 27 times.
✓ Branch 5 taken 13551 times.
33549 else if (is1("bank"))
1820 {
1821
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"))
1822 {
1823 18 optimizeforbank=-1;
1824 18 return;
1825 }
1826
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"))
1827 {
1828 18 optimizeforbank=0x140;
1829 18 return;
1830 }
1831
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 unsigned int num=getnum(par);
1832 //if (forwardlabel) error(0, "bank Label is not valid");
1833 //if (foundlabel) num>>=16;
1834
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());
1835 18 optimizeforbank=(int)num;
1836 }
1837
10/10
✓ Branch 0 taken 33477 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 30255 times.
✓ Branch 3 taken 3222 times.
✓ Branch 4 taken 29247 times.
✓ Branch 5 taken 1008 times.
✓ Branch 6 taken 17820 times.
✓ Branch 7 taken 11427 times.
✓ Branch 8 taken 2259 times.
✓ Branch 9 taken 11292 times.
33495 else if (is("freespace") || is("freecode") || is("freedata") || is("segment"))
1838 {
1839
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4518 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4518 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
1840 2259 string parstr;
1841
3/4
✓ Branch 0 taken 486 times.
✓ Branch 1 taken 4032 times.
✓ Branch 2 taken 243 times.
✗ Branch 3 not taken.
4518 if (numwords==1) parstr="\n";//crappy hack: impossible character to cut out extra commas
1842
2/4
✓ Branch 0 taken 4032 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2016 times.
✗ Branch 3 not taken.
4032 else if (numwords==2) parstr=word[1];
1843 else asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1844
5/8
✓ Branch 0 taken 3222 times.
✓ Branch 1 taken 1296 times.
✓ Branch 2 taken 1611 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1611 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1611 times.
✗ Branch 7 not taken.
6129 if (is("freecode")) parstr=STR"ram,"+parstr;
1845
5/8
✓ Branch 0 taken 1008 times.
✓ Branch 1 taken 3510 times.
✓ Branch 2 taken 504 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 504 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 504 times.
✗ Branch 7 not taken.
5022 if (is("freedata")) parstr=STR"noram,"+parstr;
1846
5/8
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 4248 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.
4653 if (is("segment")) parstr = STR "norats," + parstr;
1847
1/2
✓ Branch 0 taken 4518 times.
✗ Branch 1 not taken.
4518 autoptr<char**> pars=split(parstr.temp_raw(), ',');
1848 2259 unsigned char fsbyte = 0x00;
1849 2259 bool fixedpos=false;
1850 2259 bool align=false;
1851 2259 bool leakwarn=true;
1852 2259 bool write_rats=true;
1853 2259 int target_bank = -3;
1854
1/2
✓ Branch 0 taken 2259 times.
✗ Branch 1 not taken.
2259 string pin_to_freespace = "";
1855 2259 int search_start_pos = -1;
1856
1857
2/2
✓ Branch 0 taken 9054 times.
✓ Branch 1 taken 4518 times.
13572 for (int i=0;pars[i];i++)
1858 {
1859
2/2
✓ Branch 0 taken 8568 times.
✓ Branch 1 taken 486 times.
9054 if (pars[i][0]=='\n') {}
1860
4/4
✓ Branch 0 taken 5895 times.
✓ Branch 1 taken 2673 times.
✓ Branch 2 taken 1611 times.
✓ Branch 3 taken 2673 times.
8568 else if (!stricmp(pars[i], "ram"))
1861 {
1862
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3222 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3222 if (target_bank!=-3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1863 1611 target_bank = -2;
1864 }
1865
4/4
✓ Branch 0 taken 3177 times.
✓ Branch 1 taken 2169 times.
✓ Branch 2 taken 504 times.
✓ Branch 3 taken 2169 times.
5346 else if (!stricmp(pars[i], "noram"))
1866 {
1867
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1008 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1008 if (target_bank!=-3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1868 504 target_bank = -1;
1869 }
1870
4/4
✓ Branch 0 taken 2187 times.
✓ Branch 1 taken 2151 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 2151 times.
4338 else if (!stricmp(pars[i], "static"))
1871 {
1872
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);
1873 18 fixedpos=true;
1874 }
1875
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], "align"))
1876 {
1877
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);
1878 18 align=true;
1879 }
1880
4/4
✓ Branch 0 taken 4032 times.
✓ Branch 1 taken 234 times.
✓ Branch 2 taken 1899 times.
✓ Branch 3 taken 234 times.
4266 else if (!stricmp(pars[i], "cleaned"))
1881 {
1882
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3798 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3798 if (!leakwarn) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1883 1899 leakwarn=false;
1884 }
1885
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"))
1886 {
1887 135 write_rats=false;
1888 }
1889
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 108 times.
198 else if (stribegin(pars[i], "bank="))
1890 {
1891
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);
1892
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 target_bank = getnum(pars[i] + 5);
1893
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);
1894 }
1895
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 72 times.
108 else if (stribegin(pars[i], "start="))
1896 {
1897
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 search_start_pos = getnum(pars[i] + 6);
1898
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);
1899 }
1900
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 else if (stribegin(pars[i], "pin="))
1901 {
1902 // TODO: should we handle posneg labels here too?
1903
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
72 string pin_to = pars[i] + 4;
1904 72 const char* pin_to_c = pin_to.data();
1905
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);
1906
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);
1907 // this is to throw an "undefined label" error with the proper callstack
1908
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);
1909 72 }
1910 else if (stribegin(pars[i], "cleanbyte="))
1911 {
1912 fsbyte = getnum(pars[i] + strlen("cleanbyte="));
1913 if(foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
1914 }
1915 else
1916 {
1917 // for backwards compat i guess
1918 fsbyte = (unsigned char)getnum(pars[i]);
1919 }
1920 }
1921
3/4
✓ Branch 0 taken 2259 times.
✓ Branch 1 taken 2259 times.
✓ Branch 2 taken 99 times.
✗ Branch 3 not taken.
4518 if(target_bank == -3 && !write_rats) target_bank = -1;
1922
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4419 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4419 if(target_bank == -3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1923 // no point specifying anything about cleaning when not writing a rats tag
1924
4/8
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 4248 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.
4518 if(!write_rats && (!leakwarn || fixedpos)) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1925
2/2
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 2124 times.
2259 if(!write_rats) leakwarn = false;
1926
1/2
✓ Branch 0 taken 2259 times.
✗ Branch 1 not taken.
4518 freespaceend();
1927
1/2
✓ Branch 0 taken 2259 times.
✗ Branch 1 not taken.
4518 freespaceid=getfreespaceid();
1928
1/2
✓ Branch 0 taken 2259 times.
✗ Branch 1 not taken.
2259 freespace_data& thisfs = freespaces[freespaceid];
1929 4518 thisfs.cleanbyte = fsbyte;
1930
1931
1/2
✓ Branch 0 taken 2259 times.
✗ Branch 1 not taken.
4518 thisfs.pin_target = pin_to_freespace;
1932
5/6
✓ Branch 0 taken 2295 times.
✓ Branch 1 taken 2223 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 2223 times.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
4518 if(pin_to_freespace) thisfs.pin_target_ns = ns;
1933 4518 thisfs.write_rats = write_rats;
1934 4518 thisfs.search_start = search_start_pos;
1935 4518 thisfs.bank = target_bank;
1936 4518 thisfs.flag_align = align;
1937
1938
2/2
✓ Branch 0 taken 1506 times.
✓ Branch 1 taken 3012 times.
4518 if (pass==0) snespos=0;
1939
2/2
✓ Branch 0 taken 1506 times.
✓ Branch 1 taken 3012 times.
4518 if (pass==1)
1940 {
1941
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1494 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
1506 if (fixedpos && thisfs.orgpos == -2)
1942 {
1943 thisfs.pos = 0;
1944 thisfs.leaked = false;//mute some other errors
1945 asar_throw_error(1, error_type_block, error_id_static_freespace_autoclean);
1946 }
1947 1506 snespos = 0;
1948 }
1949
2/2
✓ Branch 0 taken 1506 times.
✓ Branch 1 taken 3012 times.
4518 if (pass==2)
1950 {
1951
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1494 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
1506 if (fixedpos && thisfs.orgpos == -2) return;//to kill some errors (supposedly????)
1952 1506 snespos=thisfs.pos;
1953
3/6
✓ Branch 0 taken 1350 times.
✓ Branch 1 taken 156 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1350 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1506 if (thisfs.leaked && leakwarn) asar_throw_warning(2, warning_id_freespace_leaked);
1954
2/2
✓ Branch 0 taken 753 times.
✓ Branch 1 taken 753 times.
1506 freespaceuse += (write_rats ? 8 : 0) + thisfs.len;
1955
1956 // add a mapping for the start of the rats tag
1957
3/4
✓ Branch 0 taken 1416 times.
✓ Branch 1 taken 90 times.
✓ Branch 2 taken 1416 times.
✗ Branch 3 not taken.
1506 if (write_rats) add_addr_to_line(snespos-8);
1958 }
1959 4518 thisfs.is_static = fixedpos;
1960
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 4518 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.
4518 if (snespos < 0 && mapper == sa1rom) asar_throw_error(pass, error_type_fatal, error_id_no_freespace_in_mapped_banks, dec(thisfs.len).data());
1961
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 4518 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4518 if (snespos < 0) asar_throw_error(pass, error_type_fatal, error_id_no_freespace, dec(thisfs.len).data());
1962
2/2
✓ Branch 0 taken 2259 times.
✓ Branch 1 taken 2259 times.
4518 bytes+=write_rats ? 8 : 0;
1963 4518 freespacestart=snespos;
1964 4518 startpos=snespos;
1965 4518 realstartpos=snespos;
1966 4518 realsnespos=snespos;
1967 4518 optimizeforbank=-1;
1968
2/2
✓ Branch 0 taken 2259 times.
✓ Branch 1 taken 2259 times.
4518 ratsmetastate=write_rats ? ratsmeta_allow : ratsmeta_ban;
1969 4518 snespos_valid = true;
1970 // check this at the very end so that snespos gets set properly, to
1971 // prevent spurious errors later
1972 //...i guess this can still cause bankcross errors if the old freespace
1973 //happened to be very close to the end of a bank or something, but
1974 //whatever
1975
7/8
✓ Branch 0 taken 1506 times.
✓ Branch 1 taken 3012 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 1494 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
4518 if (pass == 2 && fixedpos && thisfs.orgpos > 0 && thisfs.len > thisfs.orglen)
1976
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 asar_throw_error(2, error_type_block, error_id_static_freespace_growing);
1977
3/6
✓ Branch 0 taken 2256 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2256 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2256 times.
✗ Branch 5 not taken.
4530 }
1978
6/6
✓ Branch 0 taken 28236 times.
✓ Branch 1 taken 741 times.
✓ Branch 2 taken 17316 times.
✓ Branch 3 taken 10920 times.
✓ Branch 4 taken 63 times.
✓ Branch 5 taken 11229 times.
28977 else if (is1("prot"))
1979 {
1980
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);
1981
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);
1982
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 90 times.
126 if (ratsmetastate==ratsmeta_used) step(-5);
1983 int num;
1984
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 autoptr<char**> pars=qpsplit(par, ',', &num);
1985
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 verify_paren(pars);
1986
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('P');
1987
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('R');
1988
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('O');
1989
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('T');
1990
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);
1991
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 write1((unsigned int)(num*3));
1992
2/2
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 126 times.
288 for (int i=0;i<num;i++)
1993 {
1994 //int num=getnum(pars[i]);
1995 162 const char * labeltest=pars[i];
1996
1/2
✓ Branch 0 taken 81 times.
✗ Branch 1 not taken.
81 string testlabel = labeltest;
1997
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 snes_label lblval = labelval(&labeltest);
1998
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());
1999
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 write3(lblval.pos);
2000
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;
2001 162 }
2002
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('S');
2003
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('T');
2004
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('O');
2005
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('P');
2006
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1(0);
2007 126 ratsmetastate=ratsmeta_used;
2008
2009
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 add_addr_to_line(addrToLinePos);
2010 126 }
2011
9/10
✓ Branch 0 taken 28110 times.
✓ Branch 1 taken 741 times.
✓ Branch 2 taken 28110 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 162 times.
✓ Branch 5 taken 28689 times.
✓ Branch 6 taken 54 times.
✓ Branch 7 taken 108 times.
✓ Branch 8 taken 27 times.
✓ Branch 9 taken 11202 times.
28851 else if (is1("autoclean") || is2("autoclean"))
2012 {
2013
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
54 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2014
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 if (numwords==3)
2015 {
2016 54 const char * labeltest = word[2];
2017
1/2
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
27 string testlabel = labeltest;
2018
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 if(!stricmpwithlower(word[1], "dl")) {
2019
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 handle_autoclean(testlabel, -1, snespos);
2020
4/6
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 36 times.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 54 times.
✗ Branch 5 not taken.
54 write3(pass==2 ? getnum(testlabel.data()) : 0);
2021
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 add_addr_to_line(addrToLinePos);
2022 } else {
2023 // other ones are handled in arch-65816
2024 asar_throw_error(0, error_type_block, error_id_broken_autoclean);
2025 }
2026 54 }
2027 // weird gotcha: we don't know the freespace id here, so we don't know what clean_byte to use
2028 else if (pass==0) removerats((int)getnum(word[1]), 0x00);
2029 }
2030
6/6
✓ Branch 0 taken 453 times.
✓ Branch 1 taken 28344 times.
✓ Branch 2 taken 225 times.
✓ Branch 3 taken 228 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11193 times.
28797 else if (is0("pushpc"))
2031 {
2032
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 verifysnespos();
2033
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].arch=arch;
2034
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snespos=snespos;
2035
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snesstart=startpos;
2036
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snesposreal=realsnespos;
2037
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snesstartreal=realstartpos;
2038
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].freeid=freespaceid;
2039
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].freest=freespacestart;
2040 18 pushpcnum++;
2041 18 snespos=(int)0xFFFFFFFF;
2042 18 startpos= (int)0xFFFFFFFF;
2043 18 realsnespos= (int)0xFFFFFFFF;
2044 18 realstartpos= (int)0xFFFFFFFF;
2045 18 snespos_valid = false;
2046 }
2047
6/6
✓ Branch 0 taken 435 times.
✓ Branch 1 taken 28344 times.
✓ Branch 2 taken 216 times.
✓ Branch 3 taken 219 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11184 times.
28779 else if (is0("pullpc"))
2048 {
2049
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);
2050 18 pushpcnum--;
2051
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 freespaceend();
2052
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);
2053
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 snespos=pushpc[pushpcnum].snespos;
2054
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 startpos=pushpc[pushpcnum].snesstart;
2055
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 realsnespos=pushpc[pushpcnum].snesposreal;
2056
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 realstartpos=pushpc[pushpcnum].snesstartreal;
2057
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 freespaceid=pushpc[pushpcnum].freeid;
2058
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 freespacestart=pushpc[pushpcnum].freest;
2059 18 snespos_valid = true;
2060 }
2061
6/6
✓ Branch 0 taken 417 times.
✓ Branch 1 taken 28344 times.
✓ Branch 2 taken 207 times.
✓ Branch 3 taken 210 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11175 times.
28761 else if (is0("pushbase"))
2062 {
2063
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 basestack[basestacknum] = snespos;
2064 18 basestacknum++;
2065 }
2066
6/6
✓ Branch 0 taken 399 times.
✓ Branch 1 taken 28344 times.
✓ Branch 2 taken 198 times.
✓ Branch 3 taken 201 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11166 times.
28743 else if (is0("pullbase"))
2067 {
2068
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);
2069 18 basestacknum--;
2070
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 snespos = basestack[basestacknum];
2071
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 startpos = basestack[basestacknum];
2072
2073
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if (snespos != realstartpos)
2074 {
2075 18 optimizeforbank = -1;
2076 }
2077 }
2078
6/6
✓ Branch 0 taken 381 times.
✓ Branch 1 taken 28344 times.
✓ Branch 2 taken 189 times.
✓ Branch 3 taken 192 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 11148 times.
28725 else if (is0("pushns"))
2079 {
2080
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);
2081
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;
2082
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 36 times.
72 for(int i = 0; i < namespace_list.count; i++)
2083 {
2084
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]);
2085 }
2086
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 pushns[pushnsnum].nested_namespaces = nested_namespaces;
2087 36 pushnsnum++;
2088
2089
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 namespace_list.reset();
2090
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 ns = "";
2091 36 nested_namespaces = false;
2092 }
2093
6/6
✓ Branch 0 taken 345 times.
✓ Branch 1 taken 28344 times.
✓ Branch 2 taken 171 times.
✓ Branch 3 taken 174 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 11130 times.
28689 else if (is0("pullns"))
2094 {
2095
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);
2096
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);
2097 36 pushnsnum--;
2098
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;
2099
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 nested_namespaces = pushns[pushnsnum].nested_namespaces;
2100
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 namespace_list.reset();
2101
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++)
2102 {
2103
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]);
2104 }
2105 }
2106
9/10
✓ Branch 0 taken 28110 times.
✓ Branch 1 taken 543 times.
✓ Branch 2 taken 27729 times.
✓ Branch 3 taken 381 times.
✓ Branch 4 taken 108 times.
✓ Branch 5 taken 28164 times.
✓ Branch 6 taken 108 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 246 times.
✓ Branch 9 taken 10884 times.
28653 else if (is1("namespace") || is2("namespace"))
2107 {
2108
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);
2109 246 bool leave = false;
2110
1/2
✓ Branch 0 taken 489 times.
✗ Branch 1 not taken.
489 if (par)
2111 {
2112
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"))
2113 {
2114
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);
2115 72 leave = true;
2116 }
2117
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"))
2118 {
2119
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);
2120
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;
2121
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;
2122 }
2123 else
2124 {
2125
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);
2126
1/2
✓ Branch 0 taken 237 times.
✗ Branch 1 not taken.
237 const char * tmpstr= safedequote(par);
2127
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);
2128
2/2
✓ Branch 0 taken 93 times.
✓ Branch 1 taken 144 times.
237 if (!nested_namespaces)
2129 {
2130
1/2
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
93 namespace_list.reset();
2131 }
2132
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);
2133 }
2134 }
2135 else
2136 {
2137 leave = true;
2138 }
2139
2140
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 174 times.
246 if (leave)
2141 {
2142
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 36 times.
144 if (nested_namespaces)
2143 {
2144
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 namespace_list.remove(namespace_list.count - 1);
2145 }
2146 else
2147 {
2148
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 namespace_list.reset();
2149 }
2150 }
2151
2152 // recompute ns
2153
1/2
✓ Branch 0 taken 246 times.
✗ Branch 1 not taken.
246 ns = "";
2154
2/2
✓ Branch 0 taken 579 times.
✓ Branch 1 taken 489 times.
1068 for (int i = 0; i < namespace_list.count; i++)
2155 {
2156
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];
2157
1/2
✓ Branch 0 taken 291 times.
✗ Branch 1 not taken.
579 ns += "_";
2158 }
2159 }
2160
6/6
✓ Branch 0 taken 27729 times.
✓ Branch 1 taken 435 times.
✓ Branch 2 taken 17064 times.
✓ Branch 3 taken 10665 times.
✓ Branch 4 taken 36 times.
✓ Branch 5 taken 10848 times.
28164 else if (is1("warnpc"))
2161 {
2162
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 unsigned int maxpos=getnum(par);
2163
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);
2164
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);
2165
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());
2166 }
2167 #ifdef SANDBOX
2168 else if (is("incsrc") || is("incbin") || is("table"))
2169 {
2170 asar_throw_error(0, error_type_block, error_id_command_disabled);
2171 }
2172 #endif
2173
6/6
✓ Branch 0 taken 27657 times.
✓ Branch 1 taken 435 times.
✓ Branch 2 taken 10623 times.
✓ Branch 3 taken 17034 times.
✓ Branch 4 taken 8832 times.
✓ Branch 5 taken 2016 times.
28092 else if (is1("incsrc"))
2174 {
2175 8832 string name;
2176 // RPG Hacker: Should this also throw on absolute paths?
2177 // E.g., on something starting with C:/ or whatever.
2178
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 24051 times.
24069 if (strchr(par, '\\'))
2179 {
2180
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_platform_paths);
2181 }
2182
2/4
✓ Branch 0 taken 24051 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8823 times.
✗ Branch 3 not taken.
24051 name=safedequote(par);
2183
2/2
✓ Branch 0 taken 474 times.
✓ Branch 1 taken 23577 times.
24051 assemblefile(name);
2184 24069 }
2185
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"))
2186 {
2187 int len;
2188 108 int start=0;
2189 108 int end=0;
2190
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 90 times.
216 if (strqchr(par, ':'))
2191 {
2192 63 char * lengths=strqchr(par, ':');
2193 126 *lengths=0;
2194 126 lengths++;
2195
2196
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 char* split = strqpstr(lengths, "..");
2197
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);
2198
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 string start_str(lengths, split-lengths);
2199
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);
2200
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 start = getnum(start_str);
2201
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);
2202
1/2
✓ Branch 0 taken 45 times.
✗ Branch 1 not taken.
90 string end_str(split+2);
2203
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);
2204
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 end = getnum(end_str);
2205
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);
2206 126 }
2207
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 const char* current_file = get_current_file_name();
2208 81 string name;
2209 // RPG Hacker: Should this also throw on absolute paths?
2210 // E.g., on something starting with C:/ or whatever.
2211
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 144 times.
162 if (strchr(par, '\\'))
2212 {
2213
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_platform_paths);
2214 }
2215
2/4
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
144 name = safedequote(par);
2216 char * data;//I couldn't find a way to get this into an autoptr
2217
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());
2218
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 36 times.
108 autoptr<char*> datacopy=data;
2219
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 72 times.
108 if (!end) end=len;
2220
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());
2221
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());
2222
2223
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]);
2224
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 add_addr_to_line(addrToLinePos);
2225 162 }
2226
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"))
2227 {
2228
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);
2229
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);
2230
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);
2231 int amount;
2232
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1962 times.
1980 if(numwords > 2)
2233 {
2234
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 int alignment = getnum(word[2]);
2235
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);
2236 9 int offset = 0;
2237
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if(numwords==5)
2238 {
2239
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 offset = getnum(word[4]);
2240
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);
2241 }
2242
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);
2243
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);
2244
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);
2245 // i just guessed this formula but it seems to work
2246 18 amount = (alignment - ((snespos - offset) & (alignment-1))) & (alignment-1);
2247 }
2248 else
2249 {
2250
1/2
✓ Branch 0 taken 1962 times.
✗ Branch 1 not taken.
1962 amount = (int)getnum(par);
2251
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);
2252 }
2253
2/2
✓ Branch 0 taken 1764 times.
✓ Branch 1 taken 198 times.
1962 if(is("skip")) step(amount);
2254 else
2255 {
2256
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]);
2257
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 add_addr_to_line(addrToLinePos);
2258 }
2259
2260 }
2261
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"))
2262 {
2263
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 cleartable();
2264 }
2265
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"))
2266 {
2267
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 tablestack.append(thetable);
2268 }
2269
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"))
2270 {
2271
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);
2272
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];
2273
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 tablestack.remove(tablestack.count-1);
2274 }
2275
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)
2276 {
2277
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);
2278
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);
2279
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 string line=word[1];
2280
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 line.qnormalize();
2281 108 char * startpar=strqchr(line.data(), '(');
2282
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);
2283 108 *startpar=0;
2284
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
108 startpar++;
2285
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);
2286 108 char * endpar=strqchr(startpar, ')');
2287 //confirmqpar requires that all parentheses are matched, and a starting one exists, therefore it is harmless to not check for nulls
2288
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);
2289 108 *endpar=0;
2290
2291 54 string pars;
2292
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 108 times.
216 for(int i = 3; i < numwords; i++){
2293
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if(i > 3) pars += " ";
2294
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 pars += word[i];
2295 }
2296
2297
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 createuserfunc(line, startpar, pars.data());
2298 108 }
2299
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"))
2300 {
2301
2/2
✓ Branch 0 taken 852 times.
✓ Branch 1 taken 18 times.
870 string out = handle_print(par);
2302
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);
2303 852 }
2304
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"))
2305 {
2306 if(0);
2307
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;
2308 else if (!stricmp(par, "freespaceuse")) freespaceuse=0;
2309 else asar_throw_error(2, error_type_block, error_id_unknown_variable);
2310 }
2311
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"))
2312 {
2313 27 int len = 0;
2314
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 if (is("padbyte")) len=1;
2315
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
54 if (is("padword")) len=2;
2316
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
54 if (is("padlong")) len=3;
2317
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
54 if (is("paddword")) len=4;
2318
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 unsigned int val=getnum(par);
2319
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);
2320
2/2
✓ Branch 0 taken 432 times.
✓ Branch 1 taken 36 times.
468 for (int i=0;i<12;i+=len)
2321 {
2322 216 unsigned int tmpval=val;
2323
2/2
✓ Branch 0 taken 432 times.
✓ Branch 1 taken 432 times.
864 for (int j=0;j<len;j++)
2324 {
2325 432 padbyte[i+j]=(unsigned char)tmpval;
2326 432 tmpval>>=8;
2327 }
2328 }
2329 }
2330
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"))
2331 {
2332
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);
2333
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 int num=(int)getnum(par);
2334
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());
2335
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
54 if (num>realsnespos)
2336 {
2337
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
18 int end=snestopc(num);
2338
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
18 int start=snestopc(realsnespos);
2339 36 int len=end-start;
2340
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]);
2341
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 add_addr_to_line(addrToLinePos);
2342 }
2343 }
2344
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"))
2345 {
2346 72 int len = 0;
2347
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 54 times.
144 if (is("fillbyte")) len=1;
2348
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 126 times.
144 if (is("fillword")) len=2;
2349
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 126 times.
144 if (is("filllong")) len=3;
2350
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 126 times.
144 if (is("filldword")) len=4;
2351
1/2
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
144 unsigned int val= getnum(par);
2352
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);
2353
2/2
✓ Branch 0 taken 1098 times.
✓ Branch 1 taken 126 times.
1224 for (int i=0;i<12;i+=len)
2354 {
2355 549 unsigned int tmpval=val;
2356
2/2
✓ Branch 0 taken 1512 times.
✓ Branch 1 taken 1098 times.
2610 for (int j=0;j<len;j++)
2357 {
2358 1512 fillbyte[i+j]=(unsigned char)tmpval;
2359 1512 tmpval>>=8;
2360 }
2361 }
2362 }
2363
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"))
2364 {
2365
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);
2366
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; }
2367
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; }
2368
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; }
2369 asar_throw_error(0, error_type_block, error_id_broken_command, "arch", "Invalid architecture, expected one of 65816, spc700, superfx");
2370 }
2371
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("}")) {}
2372 else
2373 {
2374
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 39 times.
39 asar_throw_error(1, error_type_block, error_id_unknown_command);
2375 }
2376
2377
6/6
✓ Branch 0 taken 39018 times.
✓ Branch 1 taken 28224 times.
✓ Branch 2 taken 39018 times.
✓ Branch 3 taken 28224 times.
✓ Branch 4 taken 39018 times.
✓ Branch 5 taken 28224 times.
264216 }
2378
2379 48723 bool assemblemapper(char** word, int numwords)
2380 {
2381 48723 auto previous_mapper = mapper;
2382 if(0);
2383
6/6
✓ Branch 0 taken 2490 times.
✓ Branch 1 taken 46233 times.
✓ Branch 2 taken 291 times.
✓ Branch 3 taken 2199 times.
✓ Branch 4 taken 147 times.
✓ Branch 5 taken 21057 times.
48723 else if (is0("lorom"))
2384 {
2385 //this also makes xkas set snespos to $008000 for some reason
2386 291 mapper=lorom;
2387 }
2388
6/6
✓ Branch 0 taken 2199 times.
✓ Branch 1 taken 46233 times.
✓ Branch 2 taken 1092 times.
✓ Branch 3 taken 1107 times.
✓ Branch 4 taken 66 times.
✓ Branch 5 taken 20991 times.
48432 else if (is0("hirom"))
2389 {
2390 //xkas makes this point to $C00000
2391 126 mapper=hirom;
2392 }
2393
6/6
✓ Branch 0 taken 2073 times.
✓ Branch 1 taken 46233 times.
✓ Branch 2 taken 1029 times.
✓ Branch 3 taken 1044 times.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 20979 times.
48306 else if (is0("exlorom"))
2394 {
2395 21 mapper = exlorom;
2396 }
2397
6/6
✓ Branch 0 taken 2052 times.
✓ Branch 1 taken 46233 times.
✓ Branch 2 taken 1020 times.
✓ Branch 3 taken 1032 times.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 20967 times.
48285 else if (is0("exhirom"))
2398 {
2399 21 mapper=exhirom;
2400 }
2401
6/6
✓ Branch 0 taken 2031 times.
✓ Branch 1 taken 46233 times.
✓ Branch 2 taken 1011 times.
✓ Branch 3 taken 1020 times.
✓ Branch 4 taken 21 times.
✓ Branch 5 taken 20946 times.
48264 else if (is0("sfxrom"))
2402 {
2403 39 mapper=sfxrom;
2404 }
2405
6/6
✓ Branch 0 taken 1992 times.
✓ Branch 1 taken 46233 times.
✓ Branch 2 taken 996 times.
✓ Branch 3 taken 996 times.
✓ Branch 4 taken 60 times.
✓ Branch 5 taken 20886 times.
48225 else if (is0("norom"))
2406 {
2407 //$000000 would be the best snespos for this, but I don't care
2408 114 mapper=norom;
2409
2/2
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 36 times.
114 if(!force_checksum_fix)
2410 78 checksum_fix_enabled = false;//we don't know where the header is, so don't set the checksum
2411 }
2412
6/6
✓ Branch 0 taken 1878 times.
✓ Branch 1 taken 46233 times.
✓ Branch 2 taken 939 times.
✓ Branch 3 taken 939 times.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 20874 times.
48111 else if (is0("fullsa1rom"))
2413 {
2414 21 mapper=bigsa1rom;
2415 }
2416
2/2
✓ Branch 0 taken 75 times.
✓ Branch 1 taken 48015 times.
48090 else if (is("sa1rom"))
2417 {
2418
2/2
✓ Branch 0 taken 57 times.
✓ Branch 1 taken 18 times.
75 if (par)
2419 {
2420
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);
2421
1/2
✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
87 if (!is_digit(par[0]) || par[1]!=',' ||
2422
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]!=',' ||
2423
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]!=',' ||
2424
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);
2425 int len;
2426
1/2
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
57 autoptr<char**> pars=qpsplit(par, ',', &len);
2427
1/2
✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
57 verify_paren(pars);
2428
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);
2429 57 sa1banks[0]=(par[0]-'0')<<20;
2430 57 sa1banks[1]=(par[2]-'0')<<20;
2431 57 sa1banks[4]=(par[4]-'0')<<20;
2432 57 sa1banks[5]=(par[6]-'0')<<20;
2433 57 }
2434 else
2435 {
2436 18 sa1banks[0]=0<<20;
2437 18 sa1banks[1]=1<<20;
2438 18 sa1banks[4]=2<<20;
2439 18 sa1banks[5]=3<<20;
2440 }
2441 75 mapper=sa1rom;
2442 }
2443 20835 else return false;
2444
2445
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 708 times.
708 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2446
2/2
✓ Branch 0 taken 438 times.
✓ Branch 1 taken 270 times.
708 if(!mapper_set){
2447 438 mapper_set = true;
2448
2/2
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 135 times.
270 }else if(previous_mapper != mapper){
2449 234 asar_throw_warning(1, warning_id_mapper_already_set);
2450 }
2451 369 return true;
2452 }
2453