Mercurial > hg > index.cgi
annotate test/tests/opcodes6809.pl @ 583:000381ee2d5c default tip
Guard against single operand multiplication when detecting like terms
This *shouldn't* happen, but it apparently does in some pathological cases
so guard against a single operand multiplication to prevent a crash.
author | William Astle <lost@l-w.ca> |
---|---|
date | Mon, 04 Nov 2024 23:48:23 -0700 |
parents | 3cd8aa013b88 |
children |
rev | line source |
---|---|
448
3cd8aa013b88
Change the perl invocations for the test bits to use /usr/bin/env
William Astle <lost@l-w.ca>
parents:
175
diff
changeset
|
1 #!/usr/bin/env perl |
175 | 2 # |
3 # these tests determine if the opcodes for each instruction, in each | |
4 # addressing mode, are correct. | |
5 # | |
6 # The following list is used to construct the tests. The key is the | |
7 # mneumonic and the value is a list of address mode characters as follows | |
8 # | |
9 # R: register/inherent | |
10 # I: immediate | |
11 # E: extended | |
12 # D: direct | |
13 # i: indexed | |
14 # r: register to register (TFR, etc.) | |
15 # p: psh/pul | |
16 # each letter is followed by an = and the 2 or 4 digit opcode in hex | |
17 # each entry is separated by a comma | |
18 | |
19 $lwasm = './lwasm/lwasm'; | |
20 | |
21 %insnlist = ( | |
22 'neg' => 'D=00,E=70,i=60', | |
23 'com' => 'D=03,E=73,i=63', | |
24 'lsr' => 'D=04,E=74,i=64', | |
25 'ror' => 'D=06,E=76,i=66', | |
26 'asr' => 'D=07,E=77,i=67', | |
27 'lsl' => 'D=08,E=78,i=68', | |
28 'rol' => 'D=09,E=79,i=69', | |
29 'dec' => 'D=0A,E=7A,i=6A', | |
30 'inc' => 'D=0C,E=7C,i=6C', | |
31 'tst' => 'D=0D,E=7D,i=6D', | |
32 'jmp' => 'D=0E,E=7E,i=6E', | |
33 'clr' => 'D=0F,E=7F,i=6F', | |
34 'nop' => 'R=12', | |
35 'sync' => 'R=13', | |
36 'lbra' => 'b=16', | |
37 'lbsr' => 'b=17', | |
38 'daa' => 'R=19', | |
39 'orcc' => 'I=1A', | |
40 'andcc' => 'I=1C', | |
41 'sex' => 'R=1D', | |
42 'exg' => 'r=1E', | |
43 'tfr' => 'r=1F', | |
44 'bra' => 'b=20', | |
45 'brn' => 'b=21', | |
46 'lbrn' => 'b=1021', | |
47 'bhi' => 'b=22', | |
48 'lbhi' => 'b=1022', | |
49 'bls' => 'b=23', | |
50 'lbls' => 'b=1023', | |
51 'bcc' => 'b=24', | |
52 'lbcc' => 'b=1024', | |
53 'bhs' => 'b=24', | |
54 'lbhs' => 'b=1024', | |
55 'bcs' => 'b=25', | |
56 'lbcs' => 'b=1025', | |
57 'blo' => 'b=25', | |
58 'lblo' => 'b=1025', | |
59 'bne' => 'b=26', | |
60 'lbne' => 'b=1026', | |
61 'beq' => 'b=27', | |
62 'lbeq' => 'b=1027', | |
63 'bvc' => 'b=28', | |
64 'lbvc' => 'b=1028', | |
65 'bvs' => 'b=29', | |
66 'lbvs' => 'b=1029', | |
67 'bpl' => 'b=2A', | |
68 'lbpl' => 'b=102A', | |
69 'bmi' => 'b=2B', | |
70 'lbmi' => 'b=102B', | |
71 'bge' => 'b=2C', | |
72 'lbge' => 'b=102C', | |
73 'blt' => 'b=2D', | |
74 'lblt' => 'b=102D', | |
75 'bgt' => 'b=2E', | |
76 'lbgt' => 'b=102E', | |
77 'ble' => 'b=2F', | |
78 'lble' => 'b=102F', | |
79 'leax' => 'i=30', | |
80 'leay' => 'i=31', | |
81 'leas' => 'i=32', | |
82 'leau' => 'i=33', | |
83 'pshs' => 'p=34', | |
84 'puls' => 'p=35', | |
85 'pshu' => 'p=36', | |
86 'pulu' => 'p=37', | |
87 'rts' => 'R=39', | |
88 'abx' => 'R=3A', | |
89 'rti' => 'R=3B', | |
90 'cwai' => 'I=3C', | |
91 'mul' => 'R=3D', | |
92 'swi' => 'R=3F', | |
93 'swi2' => 'R=103F', | |
94 'swi3' => 'R=113F', | |
95 'nega' => 'R=40', | |
96 'coma' => 'R=43', | |
97 'lsra' => 'R=44', | |
98 'rora' => 'R=46', | |
99 'asra' => 'R=47', | |
100 'lsla' => 'R=48', | |
101 'rola' => 'R=49', | |
102 'deca' => 'R=4A', | |
103 'inca' => 'R=4C', | |
104 'tsta' => 'R=4D', | |
105 'clra' => 'R=4F', | |
106 'negb' => 'R=50', | |
107 'comb' => 'R=53', | |
108 'lsrb' => 'R=54', | |
109 'rorb' => 'R=56', | |
110 'asrb' => 'R=57', | |
111 'lslb' => 'R=58', | |
112 'rolb' => 'R=59', | |
113 'decb' => 'R=5A', | |
114 'incb' => 'R=5C', | |
115 'tstb' => 'R=5D', | |
116 'clrb' => 'R=5F', | |
117 'suba' => 'I=80,D=90,i=A0,E=B0', | |
118 'cmpa' => 'I=81,D=91,i=A1,E=B1', | |
119 'sbca' => 'I=82,D=92,i=A2,E=B2', | |
120 'subd' => 'I=83,D=93,i=A3,E=B3', | |
121 'cmpd' => 'I=1083,D=1093,i=10A3,E=10B3', | |
122 'cmpu' => 'I=1183,D=1193,i=11A3,E=11B3', | |
123 'anda' => 'I=84,D=94,i=A4,E=B4', | |
124 'bita' => 'I=85,D=95,i=A5,E=B5', | |
125 'lda' => 'I=86,D=96,i=A6,E=B6', | |
126 'sta' => 'D=97,i=A7,E=B7', | |
127 'eora' => 'I=88,D=98,i=A8,E=B8', | |
128 'adca' => 'I=89,D=99,i=A9,E=B9', | |
129 'ora' => 'I=8A,D=9A,i=AA,E=BA', | |
130 'adda' => 'I=8B,D=9B,i=AB,E=BB', | |
131 'cmpx' => 'I=8C,D=9C,i=AC,E=BC', | |
132 'cmpy' => 'I=108C,D=109C,i=10AC,E=10BC', | |
133 'cmps' => 'I=118C,D=119C,i=11AC,E=11BC', | |
134 'bsr' => 'b=8D', | |
135 'jsr' => 'D=9D,i=AD,E=BD', | |
136 'ldx' => 'I=8E,D=9E,i=AE,E=BE', | |
137 'ldy' => 'I=108E,D=109E,i=10AE,E=10BE', | |
138 'stx' => 'D=9F,i=AF,E=BF', | |
139 'sty' => 'D=109F,i=10AF,E=10BF', | |
140 'subb' => 'I=C0,D=D0,i=E0,E=F0', | |
141 'cmpb' => 'I=C1,D=D1,i=E1,E=F1', | |
142 'sbcb' => 'I=C2,D=D2,i=E2,E=F2', | |
143 'addd' => 'I=C3,D=D3,i=E3,E=F3', | |
144 'andb' => 'I=C4,D=D4,i=E4,E=F4', | |
145 'bitb' => 'I=C5,D=D5,i=E5,E=F5', | |
146 'ldb' => 'I=C6,D=D6,i=E6,E=F6', | |
147 'stb' => 'D=D7,i=E7,E=F7', | |
148 'eorb' => 'I=C8,D=D8,i=E8,E=F8', | |
149 'adcb' => 'I=C9,D=D9,i=E9,E=F9', | |
150 'orb' => 'I=CA,D=DA,i=EA,E=FA', | |
151 'addb' => 'I=CB,D=DB,i=EB,E=FB', | |
152 'ldd' => 'I=CC,D=DC,i=EC,E=FC', | |
153 'std' => 'D=DD,i=ED,E=FD', | |
154 'ldu' => 'I=CE,D=DE,i=EE,E=FE', | |
155 'lds' => 'I=10CE,D=10DE,i=10EE,E=10FE', | |
156 'stu' => 'D=DF,i=EF,E=FF', | |
157 'sts' => 'D=10DF,i=10EF,E=10FF' | |
158 | |
159 ); | |
160 | |
161 foreach $i (keys %insnlist) | |
162 { | |
163 # print "$i ... $insnlist{$i}\n"; | |
164 @modes = split(/,/, $insnlist{$i}); | |
165 foreach $j (@modes) | |
166 { | |
167 ($mc, $oc) = split(/=/, $j); | |
168 $operand = ''; | |
169 if ($mc eq 'D') | |
170 { | |
171 $operand = '<0'; | |
172 } | |
173 elsif ($mc eq 'E') | |
174 { | |
175 $operand = '>0'; | |
176 } | |
177 elsif ($mc eq 'I') | |
178 { | |
179 $operand = '#0'; | |
180 } | |
181 elsif ($mc eq 'i') | |
182 { | |
183 $operand = ',x'; | |
184 } | |
185 elsif ($mc eq 'r') | |
186 { | |
187 $operand = 'a,a'; | |
188 } | |
189 elsif ($mc eq 'p') | |
190 { | |
191 $operand = 'cc'; | |
192 } | |
193 elsif ($mc eq 'b') | |
194 { | |
195 $operand = '*'; | |
196 } | |
197 $asmcode = "\t$i $operand"; | |
198 | |
199 # now feed the asm code to the assembler and fetch the result | |
200 $tf = ".asmtmp.$$.$i.$mc"; | |
201 open H, ">$tf.asm"; | |
202 print H "$asmcode\n"; | |
203 close H; | |
204 $r = `$lwasm --raw --list -o $tf $tf.asm`; | |
205 open H, "<$tf"; | |
206 binmode H; | |
207 $buffer = ''; | |
208 $r = read(H, $buffer, 10); | |
209 close H; | |
210 unlink $tf; | |
211 unlink "$tf.asm"; | |
212 if ($r == 0) | |
213 { | |
214 $st = 'FAIL (no result)'; | |
215 } | |
216 else | |
217 { | |
218 @bytes = split(//,$buffer); | |
219 $rc = sprintf('%02X', ord($bytes[0])); | |
220 if (length($oc) > 2) | |
221 { | |
222 $rc .= sprintf('%02X', ord($bytes[1])); | |
223 } | |
224 if ($rc ne $oc) | |
225 { | |
226 $st = "FAIL ($rc ≠ $oc, $asmcode)"; | |
227 } | |
228 else | |
229 { | |
230 $st = 'PASS'; | |
231 } | |
232 } | |
233 print "$i" . "_$mc $st\n"; | |
234 } | |
235 } |