asar coverage - build #236


src/asar/
File: src/asar/arch-superfx.cpp
Date: 2025-02-20 02:36:59
Lines:
178/192
92.7%
Functions:
6/7
85.7%
Branches:
629/892
70.5%

Line Branch Exec Source
1 #include "asar.h"
2 #include "assembleblock.h"
3 #include "asar_math.h"
4
5 #define write1 write1_pick
6
7 2196 static int64_t getnum_ck(const char* math)
8 {
9
2/2
✓ Branch 0 taken 732 times.
✓ Branch 1 taken 1464 times.
2196 return pass == 2 ? getnum(math) : 0;
10 }
11
12 void asinit_superfx()
13 {
14 }
15
16 36 void asend_superfx()
17 {
18 36 }
19
20 3852 static void range(int min, int mid, int max)
21 {
22
3/4
✓ Branch 0 taken 1926 times.
✓ Branch 1 taken 1926 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1926 times.
3852 if (mid<min || mid>max) asar_throw_error(0, error_type_block, error_id_superfx_invalid_register, min, max);
23 3852 }
24
25 enum reg_t {
26 reg_parr,
27 reg_r,
28 reg_hash,
29 };
30 30996 static bool getreg(const char * par, int * reg, reg_t type)
31 {
32 int ret;
33 30996 *reg=-1;
34
6/6
✓ Branch 0 taken 10332 times.
✓ Branch 1 taken 20664 times.
✓ Branch 2 taken 5166 times.
✓ Branch 3 taken 5166 times.
✓ Branch 4 taken 4104 times.
✓ Branch 5 taken 11394 times.
30996 if (type==reg_parr && *par++!='(') return false;
35
6/6
✓ Branch 0 taken 2124 times.
✓ Branch 1 taken 20664 times.
✓ Branch 2 taken 1062 times.
✓ Branch 3 taken 1062 times.
✓ Branch 4 taken 594 times.
✓ Branch 5 taken 10800 times.
22788 if (type==reg_parr && to_lower(*par++)!='r') return false;
36
6/6
✓ Branch 0 taken 12240 times.
✓ Branch 1 taken 9360 times.
✓ Branch 2 taken 6120 times.
✓ Branch 3 taken 6120 times.
✓ Branch 4 taken 2790 times.
✓ Branch 5 taken 8010 times.
21600 if (type==reg_r && to_lower(*par++)!='r') return false;
37
6/6
✓ Branch 0 taken 8424 times.
✓ Branch 1 taken 7596 times.
✓ Branch 2 taken 4212 times.
✓ Branch 3 taken 4212 times.
✓ Branch 4 taken 2916 times.
✓ Branch 5 taken 5094 times.
16020 if (type==reg_hash && *par++!='#') return false;
38
2/2
✓ Branch 0 taken 5094 times.
✓ Branch 1 taken 5094 times.
10188 if (!is_digit(par[0])) return false;
39
2/2
✓ Branch 0 taken 3600 times.
✓ Branch 1 taken 6588 times.
10188 if (is_digit(par[1]))
40 {
41
3/4
✓ Branch 0 taken 3600 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1800 times.
✓ Branch 3 taken 1800 times.
3600 if (par[0]!='1' || par[1]>'5') return false;
42 3600 ret=par[1]-'0'+10;
43 3600 par+=2;
44 }
45 else
46 {
47 6588 ret=par[0]-'0';
48 6588 par+=1;
49 }
50
5/6
✓ Branch 0 taken 936 times.
✓ Branch 1 taken 9252 times.
✓ Branch 2 taken 468 times.
✓ Branch 3 taken 468 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 5094 times.
10188 if (type==reg_parr && *par++!=')') return false;
51
2/2
✓ Branch 0 taken 5094 times.
✓ Branch 1 taken 5094 times.
10188 if (*par) return false;
52 10188 *reg=ret;
53 10188 return true;
54 }
55
56 //for LMS and SMS short addressing forms, check range & evenness
57 576 static bool check_short_addr(int num) {
58
4/6
✓ Branch 0 taken 576 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 288 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 288 times.
576 if (num % 2 > 0 || num < 0 || num > 0x1FE) {
59 asar_throw_error(0, error_type_block, error_id_superfx_invalid_short_address, hex((unsigned int)num).data());
60 return false;
61 }
62 288 return true;
63 }
64
65 10962 bool asblock_superfx(char** word, int numwords)
66 {
67 #define is(test) (!stricmp(word[0], test))
68 5481 char * par= nullptr;
69
2/2
✓ Branch 0 taken 10332 times.
✓ Branch 1 taken 630 times.
10962 if (word[1]) par= duplicate_string(word[1]);
70 5481 autoptr<char*> parptr=par;
71 if(0);
72
2/4
✓ Branch 0 taken 10962 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10962 times.
10962 else if (assemblemapper(word, numwords)) return true;
73
2/2
✓ Branch 0 taken 630 times.
✓ Branch 1 taken 10332 times.
10962 else if (numwords==1)
74 {
75 #define op(from, to) if (is(from)) { write1(to); return true; }
76 #define op3d(from, to) if (is(from)) { write1(0x3D); write1(to); return true; }
77 #define op3e(from, to) if (is(from)) { write1(0x3E); write1(to); return true; }
78 #define op3f(from, to) if (is(from)) { write1(0x3F); write1(to); return true; }
79
5/6
✓ Branch 0 taken 324 times.
✓ Branch 1 taken 306 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 306 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
630 op("STOP", 0x00);
80
5/6
✓ Branch 0 taken 342 times.
✓ Branch 1 taken 270 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 270 times.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
612 op("NOP", 0x01);
81
5/6
✓ Branch 0 taken 279 times.
✓ Branch 1 taken 261 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 261 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
540 op("CACHE", 0x02);
82
5/6
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 252 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 252 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
522 op("LSR", 0x03);
83
5/6
✓ Branch 0 taken 261 times.
✓ Branch 1 taken 243 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 243 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
504 op("ROL", 0x04);
84
5/6
✓ Branch 0 taken 252 times.
✓ Branch 1 taken 234 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 234 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
486 op("LOOP", 0x3C);
85
5/6
✓ Branch 0 taken 243 times.
✓ Branch 1 taken 225 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 225 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
468 op("ALT1", 0x3D);
86
5/6
✓ Branch 0 taken 234 times.
✓ Branch 1 taken 216 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 216 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
450 op("ALT2", 0x3E);
87
5/6
✓ Branch 0 taken 225 times.
✓ Branch 1 taken 207 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 207 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
432 op("ALT3", 0x3F);
88
5/6
✓ Branch 0 taken 216 times.
✓ Branch 1 taken 198 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 198 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
414 op("PLOT", 0x4C);
89
5/6
✓ Branch 0 taken 207 times.
✓ Branch 1 taken 189 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 189 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
396 op("SWAP", 0x4D);
90
5/6
✓ Branch 0 taken 198 times.
✓ Branch 1 taken 180 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 180 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
378 op("COLOR", 0x4E);
91
5/6
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 171 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 171 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
360 op("NOT", 0x4F);
92
5/6
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 162 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 162 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
342 op("MERGE", 0x70);
93
5/6
✓ Branch 0 taken 171 times.
✓ Branch 1 taken 153 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 153 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
324 op("SBK", 0x90);
94
5/6
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 144 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 144 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
306 op("SEX", 0x95);
95
5/6
✓ Branch 0 taken 153 times.
✓ Branch 1 taken 135 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 135 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
288 op("ASR", 0x96);
96
5/6
✓ Branch 0 taken 144 times.
✓ Branch 1 taken 126 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 126 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
270 op("ROR", 0x97);
97
5/6
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 117 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 117 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
252 op("LOB", 0x9E);
98
5/6
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 108 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 108 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
234 op("FMULT", 0x9F);
99
5/6
✓ Branch 0 taken 117 times.
✓ Branch 1 taken 99 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 99 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
216 op("HIB", 0xC0);
100
5/6
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 90 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 90 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
198 op("GETC", 0xDF);
101
5/6
✓ Branch 0 taken 99 times.
✓ Branch 1 taken 81 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 81 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
180 op("GETB", 0xEF);
102
6/8
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 72 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 72 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
162 op3d("RPIX", 0x4C);
103
6/8
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 63 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 63 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
144 op3d("CMODE", 0x4E);
104
6/8
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 54 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 54 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
126 op3d("DIV2", 0x96);
105
6/8
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 45 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 45 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
108 op3d("LMULT", 0x9F);
106
6/8
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 36 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 36 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
90 op3d("GETBH", 0xEF);
107
6/8
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 27 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
72 op3e("RAMB", 0xDF);
108
6/8
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
54 op3e("GETBL", 0xEF);
109
6/8
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
36 op3f("ROMB", 0xDF);
110
4/8
✓ 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.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
18 op3f("GETBS", 0xEF);
111 #undef op
112 #undef op3d
113 #undef op3e
114 #undef op3f
115 return false;
116 }
117
2/2
✓ Branch 0 taken 5166 times.
✓ Branch 1 taken 5166 times.
10332 else if (numwords==2)
118 {
119
1/2
✓ Branch 0 taken 5166 times.
✗ Branch 1 not taken.
5166 string tmp=par;
120 int numwordsinner;
121 10332 autoptr<char*> parcpy= duplicate_string(par);
122
1/2
✓ Branch 0 taken 10332 times.
✗ Branch 1 not taken.
10332 autoptr<char**> arg=qpsplit(parcpy, ',', &numwordsinner);
123
1/2
✓ Branch 0 taken 10332 times.
✗ Branch 1 not taken.
10332 verify_paren(arg);
124 5166 bool ret=false;
125 #define ok() ret=true
126 #define op(op) if (is(op)) ok()
127 #define w3d(val) ,write1(0x3D) w(val)
128 #define w3e(val) ,write1(0x3E) w(val)
129 #define w3f(val) ,write1(0x3F) w(val)
130
2/2
✓ Branch 0 taken 8424 times.
✓ Branch 1 taken 1908 times.
10332 if (numwordsinner ==1)
131 {
132 #define w(val) ,write1((unsigned int)(val+reg))
133 #define reg_range(min, max) ,range(min, reg, max)
134 int reg;
135
2/2
✓ Branch 0 taken 4716 times.
✓ Branch 1 taken 3708 times.
8424 if (getreg(par, &reg, reg_r))
136 {
137
5/6
✓ Branch 0 taken 2502 times.
✓ Branch 1 taken 2214 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 2214 times.
✓ Branch 4 taken 144 times.
✗ Branch 5 not taken.
4716 op("TO") w(0x10);
138
5/6
✓ Branch 0 taken 2502 times.
✓ Branch 1 taken 2214 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 2214 times.
✓ Branch 4 taken 144 times.
✗ Branch 5 not taken.
4716 op("WITH") w(0x20);
139
5/6
✓ Branch 0 taken 2502 times.
✓ Branch 1 taken 2214 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 2214 times.
✓ Branch 4 taken 144 times.
✗ Branch 5 not taken.
4716 op("ADD") w(0x50);
140
5/6
✓ Branch 0 taken 2502 times.
✓ Branch 1 taken 2214 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 2214 times.
✓ Branch 4 taken 144 times.
✗ Branch 5 not taken.
4716 op("SUB") w(0x60);
141
6/8
✓ Branch 0 taken 2493 times.
✓ Branch 1 taken 2223 times.
✓ Branch 2 taken 270 times.
✓ Branch 3 taken 2223 times.
✓ Branch 4 taken 270 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 135 times.
✗ Branch 7 not taken.
4716 op("AND") reg_range(1, 15) w(0x70);
142
5/6
✓ Branch 0 taken 2502 times.
✓ Branch 1 taken 2214 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 2214 times.
✓ Branch 4 taken 144 times.
✗ Branch 5 not taken.
4716 op("MULT") w(0x80);
143
6/8
✓ Branch 0 taken 2412 times.
✓ Branch 1 taken 2304 times.
✓ Branch 2 taken 108 times.
✓ Branch 3 taken 2304 times.
✓ Branch 4 taken 108 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 54 times.
✗ Branch 7 not taken.
4716 op("JMP") reg_range(8, 13) w(0x90);
144
5/6
✓ Branch 0 taken 2502 times.
✓ Branch 1 taken 2214 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 2214 times.
✓ Branch 4 taken 144 times.
✗ Branch 5 not taken.
4716 op("FROM") w(0xB0);
145
6/8
✓ Branch 0 taken 2493 times.
✓ Branch 1 taken 2223 times.
✓ Branch 2 taken 270 times.
✓ Branch 3 taken 2223 times.
✓ Branch 4 taken 270 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 135 times.
✗ Branch 7 not taken.
4716 op("OR") reg_range(1, 15) w(0xC0);
146
6/8
✓ Branch 0 taken 2493 times.
✓ Branch 1 taken 2223 times.
✓ Branch 2 taken 270 times.
✓ Branch 3 taken 2223 times.
✓ Branch 4 taken 270 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 135 times.
✗ Branch 7 not taken.
4716 op("INC") reg_range(0, 14) w(0xD0);
147
6/8
✓ Branch 0 taken 2493 times.
✓ Branch 1 taken 2223 times.
✓ Branch 2 taken 270 times.
✓ Branch 3 taken 2223 times.
✓ Branch 4 taken 270 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 135 times.
✗ Branch 7 not taken.
4716 op("DEC") reg_range(0, 14) w(0xE0);
148
149
6/8
✓ Branch 0 taken 2502 times.
✓ Branch 1 taken 2214 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 2214 times.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 144 times.
✗ Branch 7 not taken.
4716 op("ADC") w3d(0x50);
150
6/8
✓ Branch 0 taken 2502 times.
✓ Branch 1 taken 2214 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 2214 times.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 144 times.
✗ Branch 7 not taken.
4716 op("SBC") w3d(0x60);
151
7/10
✓ Branch 0 taken 2493 times.
✓ Branch 1 taken 2223 times.
✓ Branch 2 taken 270 times.
✓ Branch 3 taken 2223 times.
✓ Branch 4 taken 270 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 270 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 135 times.
✗ Branch 9 not taken.
4716 op("BIC") reg_range(1, 15) w3d(0x70);
152
6/8
✓ Branch 0 taken 2502 times.
✓ Branch 1 taken 2214 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 2214 times.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 144 times.
✗ Branch 7 not taken.
4716 op("UMULT") w3d(0x80);
153
7/10
✓ Branch 0 taken 2412 times.
✓ Branch 1 taken 2304 times.
✓ Branch 2 taken 108 times.
✓ Branch 3 taken 2304 times.
✓ Branch 4 taken 108 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 108 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 54 times.
✗ Branch 9 not taken.
4716 op("LJMP") reg_range(8, 13) w3d(0x90);
154
7/10
✓ Branch 0 taken 2493 times.
✓ Branch 1 taken 2223 times.
✓ Branch 2 taken 270 times.
✓ Branch 3 taken 2223 times.
✓ Branch 4 taken 270 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 270 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 135 times.
✗ Branch 9 not taken.
4716 op("XOR") reg_range(1, 15) w3d(0xC0);
155
156
6/8
✓ Branch 0 taken 2502 times.
✓ Branch 1 taken 2214 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 2214 times.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 144 times.
✗ Branch 7 not taken.
4716 op("CMP") w3f(0x60);
157 }
158
2/2
✓ Branch 0 taken 2592 times.
✓ Branch 1 taken 5832 times.
8424 if (getreg(par, &reg, reg_hash))
159 {
160
6/8
✓ Branch 0 taken 1332 times.
✓ Branch 1 taken 1260 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 1260 times.
✓ Branch 4 taken 72 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 36 times.
✗ Branch 7 not taken.
2592 op("LINK") reg_range(1, 4) w(0x90);
161
162
6/8
✓ Branch 0 taken 1440 times.
✓ Branch 1 taken 1152 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 1152 times.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 144 times.
✗ Branch 7 not taken.
2592 op("ADD") w3e(0x50);
163
6/8
✓ Branch 0 taken 1440 times.
✓ Branch 1 taken 1152 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 1152 times.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 144 times.
✗ Branch 7 not taken.
2592 op("SUB") w3e(0x60);
164
7/10
✓ Branch 0 taken 1431 times.
✓ Branch 1 taken 1161 times.
✓ Branch 2 taken 270 times.
✓ Branch 3 taken 1161 times.
✓ Branch 4 taken 270 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 270 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 135 times.
✗ Branch 9 not taken.
2592 op("AND") reg_range(1, 15) w3e(0x70);
165
6/8
✓ Branch 0 taken 1440 times.
✓ Branch 1 taken 1152 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 1152 times.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 144 times.
✗ Branch 7 not taken.
2592 op("MULT") w3e(0x80);
166
7/10
✓ Branch 0 taken 1431 times.
✓ Branch 1 taken 1161 times.
✓ Branch 2 taken 270 times.
✓ Branch 3 taken 1161 times.
✓ Branch 4 taken 270 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 270 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 135 times.
✗ Branch 9 not taken.
2592 op("OR") reg_range(1, 15) w3e(0xC0);
167
168
6/8
✓ Branch 0 taken 1440 times.
✓ Branch 1 taken 1152 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 1152 times.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 144 times.
✗ Branch 7 not taken.
2592 op("ADC") w3f(0x50);
169
7/10
✓ Branch 0 taken 1431 times.
✓ Branch 1 taken 1161 times.
✓ Branch 2 taken 270 times.
✓ Branch 3 taken 1161 times.
✓ Branch 4 taken 270 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 270 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 135 times.
✗ Branch 9 not taken.
2592 op("BIC") reg_range(1, 15) w3f(0x70);
170
6/8
✓ Branch 0 taken 1440 times.
✓ Branch 1 taken 1152 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 1152 times.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 144 times.
✗ Branch 7 not taken.
2592 op("UMULT") w3f(0x80);
171
7/10
✓ Branch 0 taken 1431 times.
✓ Branch 1 taken 1161 times.
✓ Branch 2 taken 270 times.
✓ Branch 3 taken 1161 times.
✓ Branch 4 taken 270 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 270 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 135 times.
✗ Branch 9 not taken.
2592 op("XOR") reg_range(1, 15) w3f(0xC0);
172 }
173
2/2
✓ Branch 0 taken 864 times.
✓ Branch 1 taken 7560 times.
8424 if (getreg(par, &reg, reg_parr))
174 {
175
6/8
✓ Branch 0 taken 540 times.
✓ Branch 1 taken 324 times.
✓ Branch 2 taken 216 times.
✓ Branch 3 taken 324 times.
✓ Branch 4 taken 216 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 108 times.
✗ Branch 7 not taken.
864 op("STW") reg_range(0, 11) w(0x30);
176
6/8
✓ Branch 0 taken 540 times.
✓ Branch 1 taken 324 times.
✓ Branch 2 taken 216 times.
✓ Branch 3 taken 324 times.
✓ Branch 4 taken 216 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 108 times.
✗ Branch 7 not taken.
864 op("LDW") reg_range(0, 11) w(0x40);
177
7/10
✓ Branch 0 taken 540 times.
✓ Branch 1 taken 324 times.
✓ Branch 2 taken 216 times.
✓ Branch 3 taken 324 times.
✓ Branch 4 taken 216 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 216 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 108 times.
✗ Branch 9 not taken.
864 op("STB") reg_range(0, 11) w3d(0x30);
178
7/10
✓ Branch 0 taken 540 times.
✓ Branch 1 taken 324 times.
✓ Branch 2 taken 216 times.
✓ Branch 3 taken 324 times.
✓ Branch 4 taken 216 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 216 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 108 times.
✗ Branch 9 not taken.
864 op("LDB") reg_range(0, 11) w3d(0x40);
179 }
180 #undef w
181 #undef reg_range
182 4212 int byte=-1;
183 #define br(name, val) if (is(name)) byte=val;
184
4/4
✓ Branch 0 taken 4221 times.
✓ Branch 1 taken 4203 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 4203 times.
8424 br("BRA", 0x05);
185
4/4
✓ Branch 0 taken 4221 times.
✓ Branch 1 taken 4203 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 4203 times.
8424 br("BGE", 0x06);
186
4/4
✓ Branch 0 taken 4221 times.
✓ Branch 1 taken 4203 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 4203 times.
8424 br("BLT", 0x07);
187
4/4
✓ Branch 0 taken 4221 times.
✓ Branch 1 taken 4203 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 4203 times.
8424 br("BNE", 0x08);
188
4/4
✓ Branch 0 taken 4221 times.
✓ Branch 1 taken 4203 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 4203 times.
8424 br("BEQ", 0x09);
189
4/4
✓ Branch 0 taken 4221 times.
✓ Branch 1 taken 4203 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 4203 times.
8424 br("BPL", 0x0A);
190
4/4
✓ Branch 0 taken 4221 times.
✓ Branch 1 taken 4203 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 4203 times.
8424 br("BMI", 0x0B);
191
4/4
✓ Branch 0 taken 4221 times.
✓ Branch 1 taken 4203 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 4203 times.
8424 br("BCC", 0x0C);
192
4/4
✓ Branch 0 taken 4221 times.
✓ Branch 1 taken 4203 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 4203 times.
8424 br("BCS", 0x0D);
193
4/4
✓ Branch 0 taken 4221 times.
✓ Branch 1 taken 4203 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 4203 times.
8424 br("BVC", 0x0E);
194
4/4
✓ Branch 0 taken 4221 times.
✓ Branch 1 taken 4203 times.
✓ Branch 2 taken 4203 times.
✓ Branch 3 taken 9 times.
8424 br("BVS", 0x0F);
195 #undef br
196
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 8226 times.
8415 if (byte!=-1)
197 {
198 99 ret=true;
199
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 int len=getlen(par);
200
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 unsigned int num=getnum_ck(par);
201
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 198 times.
198 if (len==1)
202 {
203 write1((unsigned int)byte); write1(num);
204 }
205 else
206 {
207
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 int pos=(int)getnum_ck(par)-((snespos&0xFFFFFF)+2);
208
2/4
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 198 times.
✗ Branch 3 not taken.
198 write1((unsigned int)byte); write1((unsigned int)pos);
209
5/6
✓ Branch 0 taken 66 times.
✓ Branch 1 taken 132 times.
✓ Branch 2 taken 33 times.
✓ Branch 3 taken 33 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 33 times.
198 if (pass==2 && (pos<-128 || pos>127))
210 {
211 asar_throw_error(2, error_type_block, error_id_relative_branch_out_of_bounds, dec(pos).data());
212 }
213 }
214 }
215 }
216
2/2
✓ Branch 0 taken 1908 times.
✓ Branch 1 taken 8424 times.
10332 if (numwordsinner==2)
217 {
218 #define w(val) ,write1((unsigned int)(val))
219 1908 int reg1; bool isreg1=getreg(arg[0], &reg1, reg_r);
220 1908 int reg2; bool isreg2=getreg(arg[1], &reg2, reg_r);
221
2/2
✓ Branch 0 taken 1278 times.
✓ Branch 1 taken 630 times.
1908 if (isreg1)
222 {
223
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 1242 times.
1278 if (isreg2)
224 {
225
6/8
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
36 op("MOVE") w(0x20+reg2) w(0x10+reg1);
226
6/8
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
36 op("MOVES") w(0x20+reg1) w(0xB0+reg2);
227 }
228
2/2
✓ Branch 0 taken 594 times.
✓ Branch 1 taken 684 times.
1278 if (arg[1][0]=='#')
229 {
230
1/2
✓ Branch 0 taken 594 times.
✗ Branch 1 not taken.
594 unsigned int num=getnum_ck(arg[1]+1);
231 594 num&=0xFFFF;
232
6/8
✓ Branch 0 taken 441 times.
✓ Branch 1 taken 153 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 153 times.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 144 times.
✗ Branch 7 not taken.
594 op("IBT") w(0xA0+reg1) w(num);
233
7/10
✓ Branch 0 taken 441 times.
✓ Branch 1 taken 153 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 153 times.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 288 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 144 times.
✗ Branch 9 not taken.
594 op("IWT") w(0xF0+reg1) w(num) w(num>>8);
234
2/4
✓ Branch 0 taken 297 times.
✓ Branch 1 taken 297 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
594 if (num<0x80 || num>=0xFF80)
235 {
236
6/8
✓ Branch 0 taken 306 times.
✓ Branch 1 taken 288 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 288 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
594 op("MOVE") w(0xA0+reg1) w(num);
237 }
238 else
239 {
240 op("MOVE") w(0xF0+reg1) w(num) w(num>>8);
241 }
242 }
243
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 1242 times.
1278 if (getreg(arg[1], &reg2, reg_parr))
244 {
245
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 if (reg1==0)
246 {
247
6/8
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
36 op("MOVEB") w(0x3D) w(0x40+reg2);
248
5/6
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
36 op("MOVEW") w(0x40+reg2);
249 }
250 else
251 {
252 op("MOVEB") w(0x10+reg1) w(0x3D) w(0x40+reg2);
253 op("MOVEW") w(0x10+reg1) w(0x40+reg2);
254 }
255 }
256
2/2
✓ Branch 0 taken 594 times.
✓ Branch 1 taken 648 times.
1242 else if (arg[1][0]=='(')
257 {
258 594 char * endpar=strchr(arg[1], ')');
259
3/4
✓ Branch 0 taken 594 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 297 times.
✓ Branch 3 taken 297 times.
594 if (!endpar || endpar[1]) return false;
260
1/2
✓ Branch 0 taken 594 times.
✗ Branch 1 not taken.
594 unsigned int num=getnum_ck(arg[1]);
261
8/12
✓ Branch 0 taken 441 times.
✓ Branch 1 taken 153 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 153 times.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 288 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 288 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 144 times.
✗ Branch 11 not taken.
594 op("LM") w(0x3D) w(0xF0+reg1) w(num) w(num>>8);
262
263
4/4
✓ Branch 0 taken 441 times.
✓ Branch 1 taken 153 times.
✓ Branch 2 taken 144 times.
✓ Branch 3 taken 153 times.
594 if (is("LMS")) {
264 144 ok();
265
2/4
✓ Branch 0 taken 288 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 288 times.
✗ Branch 3 not taken.
288 if (check_short_addr((int)num))
266 {
267
3/6
✓ Branch 0 taken 288 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 288 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
288 ok() w(0x3D) w(0xA0+reg1) w(num>>1);
268 }
269 }
270
271
2/4
✓ Branch 0 taken 594 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 594 times.
594 if (num&1 || num>=0x200)
272 {
273 op("MOVE") w(0x3D) w(0xF0+reg1) w(num) w(num>>8);
274 }
275 else
276 {
277
7/10
✓ Branch 0 taken 306 times.
✓ Branch 1 taken 288 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 288 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 18 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
594 op("MOVE") w(0x3D) w(0xA0+reg1) w(num);
278 }
279 }
280
4/4
✓ Branch 0 taken 648 times.
✓ Branch 1 taken 630 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 630 times.
1278 if (is("LEA"))
281 {
282
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 unsigned int num=getnum_ck(arg[1]);
283
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.
18 ok() w(0xF0+reg1) w(num) w(num>>8);
284 }
285 }
286
2/2
✓ Branch 0 taken 315 times.
✓ Branch 1 taken 315 times.
630 else if (isreg2)
287 {
288
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 594 times.
630 if (getreg(arg[0], &reg1, reg_parr))
289 {
290
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 if (reg1==0)
291 {
292
6/8
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
36 op("MOVEB") w(0x3D) w(0x30+reg2);
293
5/6
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
36 op("MOVEW") w(0x30+reg2);
294 }
295 else
296 {
297 op("MOVEB") w(0xB0+reg1) w(0x3D) w(0x30+reg2);
298 op("MOVEW") w(0xB0+reg1) w(0x30+reg2);
299 }
300 }
301
2/2
✓ Branch 0 taken 297 times.
✓ Branch 1 taken 297 times.
594 else if (arg[0][0]=='(')
302 {
303 594 char * endpar=strchr(arg[0], ')');
304
3/4
✓ Branch 0 taken 594 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 297 times.
✓ Branch 3 taken 297 times.
594 if (!endpar || endpar[1]) return false;
305
1/2
✓ Branch 0 taken 594 times.
✗ Branch 1 not taken.
594 unsigned int num=getnum_ck(arg[0]);
306
8/12
✓ Branch 0 taken 441 times.
✓ Branch 1 taken 153 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 153 times.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 288 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 288 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 144 times.
✗ Branch 11 not taken.
594 op("SM") w(0x3E) w(0xF0+reg2) w(num) w(num>>8);
307
308
4/4
✓ Branch 0 taken 441 times.
✓ Branch 1 taken 153 times.
✓ Branch 2 taken 144 times.
✓ Branch 3 taken 153 times.
594 if (is("SMS"))
309 {
310 144 ok();
311
2/4
✓ Branch 0 taken 288 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 288 times.
✗ Branch 3 not taken.
288 if (check_short_addr((int)num))
312 {
313
3/6
✓ Branch 0 taken 288 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 288 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 288 times.
✗ Branch 5 not taken.
288 ok() w(0x3E) w(0xA0+reg2) w(num>>1);
314 }
315 }
316
317
2/4
✓ Branch 0 taken 594 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 594 times.
594 if (num&1 || num>=0x200)
318 {
319 op("MOVE") w(0x3E) w(0xF0+reg2) w(num) w(num>>8);
320 }
321 else
322 {
323
7/10
✓ Branch 0 taken 306 times.
✓ Branch 1 taken 288 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 288 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 18 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
594 op("MOVE") w(0x3E) w(0xA0+reg2) w(num);
324 }
325 }
326 }
327 }
328 #undef ok
329 #undef op
330 #undef w3d
331 #undef w3e
332 #undef w3f
333 10332 return ret;
334 10332 }
335 return false;
336 10962 }
337