1 |
16 |
rehayes |
#!/usr/bin/perl -w
|
2 |
|
|
|
3 |
|
|
sub test_for_keyword {
|
4 |
|
|
foreach $keyword (@instruction_keyword_list) {
|
5 |
|
|
if ($_[0] eq $keyword) {
|
6 |
|
|
return 1;
|
7 |
|
|
}
|
8 |
|
|
}
|
9 |
|
|
return 0;
|
10 |
|
|
}
|
11 |
|
|
|
12 |
|
|
sub print_symbol_table {
|
13 |
|
|
while (($key, $value) = each %symbol_table) {
|
14 |
|
|
print "Symbol Name $key => $value\n";
|
15 |
|
|
}
|
16 |
|
|
}
|
17 |
|
|
|
18 |
|
|
sub do_expression {
|
19 |
|
|
print "Do Expersion input = $_[0]\n";
|
20 |
|
|
@expresion = split /([()+-])/, $_[0];
|
21 |
|
|
$converted = 0;
|
22 |
|
|
print "Do Expression - Expresion parts are: @expresion\n";
|
23 |
|
|
$i = 0;
|
24 |
|
|
foreach (@expresion) {
|
25 |
|
|
print "Foreach value is: $_\n";
|
26 |
|
|
s/ *$//g; # get rid of trailing blanks
|
27 |
|
|
s/^ *//g; # get rid of all leading blanks
|
28 |
|
|
if (/^\$/) {
|
29 |
|
|
$temp = &hex_to_num;
|
30 |
|
|
$expresion[$i] = $temp;
|
31 |
|
|
} elsif (/^[0-9]/) {
|
32 |
|
|
$temp = &dec_to_num;
|
33 |
|
|
$expresion[$i] = $temp;
|
34 |
|
|
} elsif (/^[a-zA-Z_]/) {
|
35 |
|
|
$temp = &symbol_to_num;
|
36 |
|
|
$expresion[$i] = $temp;
|
37 |
|
|
}
|
38 |
|
|
print " -- Expression part is: $expresion[$i]\n";
|
39 |
|
|
$i++;
|
40 |
|
|
}
|
41 |
|
|
$converted = @expresion[0];
|
42 |
|
|
print "Final Do Expression is: $converted, expression = @expresion\n";
|
43 |
|
|
return $converted;
|
44 |
|
|
}
|
45 |
|
|
|
46 |
|
|
sub hex_to_num {
|
47 |
|
|
my ($i, $temp, $converted);
|
48 |
|
|
s/^\$//;
|
49 |
|
|
$i = 1;
|
50 |
|
|
@chars = split //, $_;
|
51 |
|
|
@chars = reverse @chars;
|
52 |
|
|
$converted = 0;
|
53 |
|
|
foreach $c (@chars) {
|
54 |
|
|
if ($c =~ /[A-F]/) {
|
55 |
|
|
$temp = ord($c) - ord("A") + 10;
|
56 |
|
|
} elsif ($c =~ /[a-f]/) {
|
57 |
|
|
$temp = ord($c) - ord("a") + 10;
|
58 |
|
|
} elsif ($c =~ /[0-9]/) {
|
59 |
|
|
$temp = ord($c) - ord("0");
|
60 |
|
|
} else {
|
61 |
|
|
print "ERROR - in hex number conversion\n";
|
62 |
|
|
}
|
63 |
|
|
$temp = $temp * $i;
|
64 |
|
|
$converted = $converted + $temp;
|
65 |
|
|
$i = $i*16;
|
66 |
|
|
}
|
67 |
|
|
return $converted;
|
68 |
|
|
}
|
69 |
|
|
|
70 |
|
|
sub dec_to_num {
|
71 |
|
|
my ($i, $temp, $converted);
|
72 |
|
|
s/^\$//;
|
73 |
|
|
$i = 1;
|
74 |
|
|
@chars = split //, $_;
|
75 |
|
|
@chars = reverse @chars;
|
76 |
|
|
$converted = 0;
|
77 |
|
|
foreach $c (@chars) {
|
78 |
|
|
if ($c =~ /[0-9]/) {
|
79 |
|
|
$temp = ord($c) - ord("0");
|
80 |
|
|
} else {
|
81 |
|
|
print "ERROR - in dec number conversion\n";
|
82 |
|
|
}
|
83 |
|
|
$temp = $temp * $i;
|
84 |
|
|
$converted = $converted + $temp;
|
85 |
|
|
$i = $i*10;
|
86 |
|
|
}
|
87 |
|
|
return $converted;
|
88 |
|
|
}
|
89 |
|
|
|
90 |
|
|
sub symbol_to_num {
|
91 |
|
|
my $converted;
|
92 |
|
|
print "Symbol_convert - $_\n";
|
93 |
|
|
$converted = $symbol_table{$_};
|
94 |
|
|
if ($converted =~ /XXX/) {
|
95 |
|
|
print "ERROR - Undefined Symbol Conversion => $_/n";
|
96 |
|
|
}
|
97 |
|
|
return $converted;
|
98 |
|
|
}
|
99 |
|
|
|
100 |
|
|
sub print_memory_image {
|
101 |
|
|
$j = 0;
|
102 |
|
|
foreach $i (@memory_image) {
|
103 |
|
|
print "Address $j => $i\n";
|
104 |
|
|
$j++;
|
105 |
|
|
}
|
106 |
|
|
}
|
107 |
|
|
|
108 |
|
|
sub reg_to_num {
|
109 |
|
|
my $register = $_;
|
110 |
|
|
if ($register eq "R0") {
|
111 |
|
|
$register = "000";
|
112 |
|
|
} elsif ($register eq "R1") {
|
113 |
|
|
$register = "001";
|
114 |
|
|
} elsif ($register eq "R2") {
|
115 |
|
|
$register = "010";
|
116 |
|
|
} elsif ($register eq "R3") {
|
117 |
|
|
$register = "011";
|
118 |
|
|
} elsif ($register eq "R4") {
|
119 |
|
|
$register = "100";
|
120 |
|
|
} elsif ($register eq "R5") {
|
121 |
|
|
$register = "101";
|
122 |
|
|
} elsif ($register eq "R6") {
|
123 |
|
|
$register = "110";
|
124 |
|
|
} elsif ($register eq "R7") {
|
125 |
|
|
$register = "111";
|
126 |
|
|
} else {
|
127 |
|
|
printf "Bad Register Name: %s\n", $register;
|
128 |
|
|
$register = "";
|
129 |
|
|
}
|
130 |
|
|
}
|
131 |
|
|
|
132 |
|
|
sub translate_RD {
|
133 |
|
|
$rd_prototype = "00000???00000000";
|
134 |
|
|
&fill_field($rd_prototype, ®_to_num($_[0]));
|
135 |
|
|
}
|
136 |
|
|
|
137 |
|
|
sub do_compiler_command {
|
138 |
|
|
if ($white_split[0] eq "EQU") {
|
139 |
|
|
shift @white_split;
|
140 |
|
|
print "\nStarting EQU - Symbol = $current_symbol, @white_split\n";
|
141 |
|
|
$junk_temp = &do_expression(@white_split);
|
142 |
|
|
print "Ending EQU - value is $junk_temp\n\n";
|
143 |
|
|
$symbol_table{$current_symbol} = $junk_temp;
|
144 |
|
|
} elsif ($white_split[0] eq "ORG") {
|
145 |
|
|
$program_address = $white_split[1];
|
146 |
|
|
$symbol_table{$current_symbol} = $program_address;
|
147 |
|
|
} elsif ($white_split[0] eq "ALIGN") {
|
148 |
|
|
$program_address = $white_split[1];
|
149 |
|
|
$symbol_table{$current_symbol} = $program_address;
|
150 |
|
|
} elsif ($white_split[0] eq "DW") {
|
151 |
|
|
$symbol_table{$current_symbol} = $program_address;
|
152 |
|
|
$program_address = $program_address + 1;
|
153 |
|
|
} elsif ($white_split[0] eq "DB") {
|
154 |
|
|
$symbol_table{$current_symbol} = $program_address;
|
155 |
|
|
$program_address++;
|
156 |
|
|
} elsif ($white_split[0] eq "FCC") {
|
157 |
|
|
$program_address = $white_split[1];
|
158 |
|
|
$symbol_table{$current_symbol} = $program_address;
|
159 |
|
|
}
|
160 |
|
|
}
|
161 |
|
|
|
162 |
|
|
sub do_instruction {
|
163 |
|
|
if ($white_split[0] eq "BRK") {
|
164 |
|
|
$protype_op_code = "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0";
|
165 |
|
|
$xyzpp = "0000000000000000";
|
166 |
|
|
|
167 |
|
|
} elsif ($white_split[0] eq "NOP") {
|
168 |
|
|
$protype_op_code = "0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0";
|
169 |
|
|
$xyzpp = "0000000100000000";
|
170 |
|
|
|
171 |
|
|
} elsif ($white_split[0] eq "RTS") {
|
172 |
|
|
$protype_op_code = "0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0";
|
173 |
|
|
$xyzpp = "0000001000000000";
|
174 |
|
|
|
175 |
|
|
} elsif ($white_split[0] eq "SIF") {
|
176 |
|
|
$protype_op_code = "0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0";
|
177 |
|
|
$xyzpp = "0000001100000000";
|
178 |
|
|
|
179 |
|
|
} elsif ($white_split[0] eq "CSEM") {
|
180 |
|
|
$protype_op_code = "0 0 0 0 0 IMM3 1 1 1 1 0 0 0 0";
|
181 |
|
|
$xyzpp = "00000???11110000";
|
182 |
|
|
|
183 |
|
|
$protype_op_code = "0 0 0 0 0 RS 1 1 1 1 0 0 0 1";
|
184 |
|
|
$xyzpp = "00000???11110001";
|
185 |
|
|
|
186 |
|
|
} elsif ($white_split[0] eq "SSEM") {
|
187 |
|
|
$protype_op_code = "0 0 0 0 0 IMM3 1 1 1 1 0 0 1 0";
|
188 |
|
|
$xyzpp = "00000???11110010";
|
189 |
|
|
|
190 |
|
|
$protype_op_code = "0 0 0 0 0 RS 1 1 1 1 0 0 1 1";
|
191 |
|
|
$xyzpp = "00000???11110011";
|
192 |
|
|
|
193 |
|
|
|
194 |
|
|
} elsif ($white_split[0] eq "SEX") {
|
195 |
|
|
$protype_op_code = "0 0 0 0 0 RD 1 1 1 1 0 1 0 0";
|
196 |
|
|
$xyzpp = "00000???11110100";
|
197 |
|
|
|
198 |
|
|
} elsif ($white_split[0] eq "PAR") {
|
199 |
|
|
$protype_op_code = "0 0 0 0 0 RD 1 1 1 1 0 1 0 1";
|
200 |
|
|
$xyzpp = "00000???11110101";
|
201 |
|
|
|
202 |
|
|
} elsif ($white_split[0] eq "JAL") {
|
203 |
|
|
$protype_op_code = "0 0 0 0 0 RD 1 1 1 1 0 1 1 0";
|
204 |
|
|
$xyzpp = "00000???11110110";
|
205 |
|
|
|
206 |
|
|
} elsif ($white_split[0] eq "SIF") {
|
207 |
|
|
$protype_op_code = "0 0 0 0 0 RS 1 1 1 1 0 1 1 1";
|
208 |
|
|
$xyzpp = "00000???11110111";
|
209 |
|
|
|
210 |
|
|
|
211 |
|
|
} elsif ($white_split[0] eq "TFR") {
|
212 |
|
|
# RD,CCR
|
213 |
|
|
$protype_op_code = "0 0 0 0 0 RD 1 1 1 1 1 0 0 0";
|
214 |
|
|
$xyzpp = "00000???11111000";
|
215 |
|
|
|
216 |
|
|
} elsif ($white_split[0] eq "TFR") {
|
217 |
|
|
# CCR,RS
|
218 |
|
|
$protype_op_code = "0 0 0 0 0 RS 1 1 1 1 1 0 0 1";
|
219 |
|
|
$xyzpp = "00000???11111001";
|
220 |
|
|
|
221 |
|
|
} elsif ($white_split[0] eq "TFR") {
|
222 |
|
|
# RD,PC
|
223 |
|
|
$protype_op_code = "0 0 0 0 0 RD 1 1 1 1 1 0 1 0";
|
224 |
|
|
$xyzpp = "00000???11111010";
|
225 |
|
|
|
226 |
|
|
|
227 |
|
|
} elsif ($white_split[0] eq "BFFO") {
|
228 |
|
|
$protype_op_code = "0 0 0 0 1 RD RS 1 0 0 0 0";
|
229 |
|
|
$xyzpp = "00001??????10000";
|
230 |
|
|
|
231 |
|
|
} elsif ($white_split[0] eq "ASR") {
|
232 |
|
|
$_ = $white_space[2];
|
233 |
|
|
if (/R[0-7]/) {
|
234 |
|
|
$protype_op_code = "0 0 0 0 1 RD RS 1 0 0 0 1";
|
235 |
|
|
$xyzpp = "00001??????10001";
|
236 |
|
|
} else {
|
237 |
|
|
$protype_op_code = "0 0 0 0 1 RD IMM4 1 0 0 1";
|
238 |
|
|
$xyzpp = "00001???????1001";
|
239 |
|
|
}
|
240 |
|
|
} elsif ($white_split[0] eq "CSL") {
|
241 |
|
|
$protype_op_code = "0 0 0 0 1 RD RS 1 0 0 1 0";
|
242 |
|
|
$xyzpp = "00001??????10010";
|
243 |
|
|
|
244 |
|
|
$protype_op_code = "0 0 0 0 1 RD IMM4 1 0 1 0";
|
245 |
|
|
$xyzpp = "00001???????1010";
|
246 |
|
|
|
247 |
|
|
} elsif ($white_split[0] eq "CSR") {
|
248 |
|
|
$protype_op_code = "0 0 0 0 1 RD RS 1 0 0 1 1";
|
249 |
|
|
$xyzpp = "00001??????10011";
|
250 |
|
|
|
251 |
|
|
$protype_op_code = "0 0 0 0 1 RD IMM4 1 0 1 1";
|
252 |
|
|
$xyzpp = "00001???????1011";
|
253 |
|
|
|
254 |
|
|
} elsif ($white_split[0] eq "LSL") {
|
255 |
|
|
$protype_op_code = "0 0 0 0 1 RD RS 1 0 1 0 0";
|
256 |
|
|
$xyzpp = "00001??????10100";
|
257 |
|
|
|
258 |
|
|
$protype_op_code = "0 0 0 0 1 RD IMM4 1 1 0 0";
|
259 |
|
|
$xyzpp = "00001???????1100";
|
260 |
|
|
|
261 |
|
|
} elsif ($white_split[0] eq "LSR") {
|
262 |
|
|
$protype_op_code = "0 0 0 0 1 RD RS 1 0 1 0 1";
|
263 |
|
|
$xyzpp = "00001??????10101";
|
264 |
|
|
|
265 |
|
|
$protype_op_code = "0 0 0 0 1 RD IMM4 1 1 0 1";
|
266 |
|
|
$xyzpp = "00001???????1101";
|
267 |
|
|
|
268 |
|
|
} elsif ($white_split[0] eq "ROL") {
|
269 |
|
|
$protype_op_code = "0 0 0 0 1 RD RS 1 0 1 1 0";
|
270 |
|
|
$xyzpp = "00001??????10110";
|
271 |
|
|
|
272 |
|
|
$protype_op_code = "0 0 0 0 1 RD IMM4 1 1 1 0";
|
273 |
|
|
$xyzpp = "00001???????1110";
|
274 |
|
|
|
275 |
|
|
} elsif ($white_split[0] eq "ROR") {
|
276 |
|
|
$protype_op_code = "0 0 0 0 1 RD RS 1 0 1 1 1";
|
277 |
|
|
$xyzpp = "00001??????10111";
|
278 |
|
|
|
279 |
|
|
$protype_op_code = "0 0 0 0 1 RD IMM4 1 1 1 1";
|
280 |
|
|
$xyzpp = "00001???????1111";
|
281 |
|
|
|
282 |
|
|
} elsif ($white_split[0] eq "AND") {
|
283 |
|
|
$protype_op_code = "0 0 0 1 0 RD RS1 RS2 0 0";
|
284 |
|
|
$xyzpp = "00010?????????00";
|
285 |
|
|
|
286 |
|
|
} elsif ($white_split[0] eq "OR") {
|
287 |
|
|
$protype_op_code = "0 0 0 1 0 RD RS1 RS2 1 0";
|
288 |
|
|
$xyzpp = "00010?????????10";
|
289 |
|
|
|
290 |
|
|
} elsif ($white_split[0] eq "XNOR") {
|
291 |
|
|
$protype_op_code = "0 0 0 1 0 RD RS1 RS2 1 1";
|
292 |
|
|
$xyzpp = "00010?????????11";
|
293 |
|
|
|
294 |
|
|
} elsif ($white_split[0] eq "SUB") {
|
295 |
|
|
$protype_op_code = "0 0 0 1 1 RD RS1 RS2 0 0";
|
296 |
|
|
$xyzpp = "00011?????????00";
|
297 |
|
|
|
298 |
|
|
} elsif ($white_split[0] eq "SBC") {
|
299 |
|
|
$protype_op_code = "0 0 0 1 1 RD RS1 RS2 0 1";
|
300 |
|
|
$xyzpp = "00011?????????01";
|
301 |
|
|
|
302 |
|
|
} elsif ($white_split[0] eq "ADD") {
|
303 |
|
|
$protype_op_code = "0 0 0 1 1 RD RS1 RS2 1 0";
|
304 |
|
|
$xyzpp = "00011?????????10";
|
305 |
|
|
|
306 |
|
|
} elsif ($white_split[0] eq "ADC") {
|
307 |
|
|
$protype_op_code = "0 0 0 1 1 RD RS1 RS2 1 1";
|
308 |
|
|
$xyzpp = "00011?????????11";
|
309 |
|
|
|
310 |
|
|
|
311 |
|
|
} elsif ($white_split[0] eq "BCC") {
|
312 |
|
|
$protype_op_code = "0 0 1 0 0 0 0 REL9";
|
313 |
|
|
$xyzpp = "0010000?????????";
|
314 |
|
|
|
315 |
|
|
} elsif ($white_split[0] eq "BCS") {
|
316 |
|
|
$protype_op_code = "0 0 1 0 0 0 1 REL9";
|
317 |
|
|
$xyzpp = "0010001?????????";
|
318 |
|
|
|
319 |
|
|
} elsif ($white_split[0] eq "BNE") {
|
320 |
|
|
$protype_op_code = "0 0 1 0 0 1 0 REL9";
|
321 |
|
|
$xyzpp = "0010010?????????";
|
322 |
|
|
|
323 |
|
|
} elsif ($white_split[0] eq "BEQ") {
|
324 |
|
|
$protype_op_code = "0 0 1 0 0 1 1 REL9";
|
325 |
|
|
$xyzpp = "0010011?????????";
|
326 |
|
|
|
327 |
|
|
} elsif ($white_split[0] eq "BPL") {
|
328 |
|
|
$protype_op_code = "0 0 1 0 1 0 0 REL9";
|
329 |
|
|
$xyzpp = "0010100?????????";
|
330 |
|
|
|
331 |
|
|
} elsif ($white_split[0] eq "BMI") {
|
332 |
|
|
$protype_op_code = "0 0 1 0 1 0 1 REL9";
|
333 |
|
|
$xyzpp = "0010101?????????";
|
334 |
|
|
|
335 |
|
|
} elsif ($white_split[0] eq "BVC") {
|
336 |
|
|
$protype_op_code = "0 0 1 0 1 1 0 REL9";
|
337 |
|
|
$xyzpp = "0010110?????????";
|
338 |
|
|
|
339 |
|
|
} elsif ($white_split[0] eq "BVS") {
|
340 |
|
|
$protype_op_code = "0 0 1 0 1 1 1 REL9";
|
341 |
|
|
$xyzpp = "0010111?????????";
|
342 |
|
|
|
343 |
|
|
} elsif ($white_split[0] eq "BHI") {
|
344 |
|
|
$protype_op_code = "0 0 1 1 0 0 0 REL9";
|
345 |
|
|
$xyzpp = "0011000?????????";
|
346 |
|
|
|
347 |
|
|
} elsif ($white_split[0] eq "BLS") {
|
348 |
|
|
$protype_op_code = "0 0 1 1 0 0 1 REL9";
|
349 |
|
|
$xyzpp = "0011001?????????";
|
350 |
|
|
|
351 |
|
|
} elsif ($white_split[0] eq "BGE") {
|
352 |
|
|
$protype_op_code = "0 0 1 1 0 1 0 REL9";
|
353 |
|
|
$xyzpp = "0011010?????????";
|
354 |
|
|
|
355 |
|
|
} elsif ($white_split[0] eq "BLT") {
|
356 |
|
|
$protype_op_code = "0 0 1 1 0 1 1 REL9";
|
357 |
|
|
$xyzpp = "0011011?????????";
|
358 |
|
|
|
359 |
|
|
} elsif ($white_split[0] eq "BGT") {
|
360 |
|
|
$protype_op_code = "0 0 1 1 1 0 0 REL9";
|
361 |
|
|
$xyzpp = "0011100?????????";
|
362 |
|
|
|
363 |
|
|
} elsif ($white_split[0] eq "BLE") {
|
364 |
|
|
$protype_op_code = "0 0 1 1 1 0 1 REL9";
|
365 |
|
|
$xyzpp = "0011101?????????";
|
366 |
|
|
|
367 |
|
|
} elsif ($white_split[0] eq "BRA") {
|
368 |
|
|
$protype_op_code = "0 0 1 1 1 1 REL10";
|
369 |
|
|
$xyzpp = "001111??????????";
|
370 |
|
|
|
371 |
|
|
|
372 |
|
|
} elsif ($white_split[0] eq "LDB") {
|
373 |
|
|
$_ = $white_space[3];
|
374 |
|
|
if (/\#/) {
|
375 |
|
|
$protype_op_code = "0 1 0 0 0 RD RB #OFFS5";
|
376 |
|
|
$xyzpp = "01000???????????";
|
377 |
|
|
}
|
378 |
|
|
$protype_op_code = "0 1 1 0 0 RD RB RI 0 0";
|
379 |
|
|
$xyzpp = "01100?????????00";
|
380 |
|
|
|
381 |
|
|
$protype_op_code = "0 1 1 0 0 RD RB RI+ 0 1";
|
382 |
|
|
$xyzpp = "01100?????????01";
|
383 |
|
|
|
384 |
|
|
$protype_op_code = "0 1 1 0 0 RD RB -RI 1 0";
|
385 |
|
|
$xyzpp = "01100?????????10";
|
386 |
|
|
|
387 |
|
|
} elsif ($white_split[0] eq "LDW") {
|
388 |
|
|
$protype_op_code = "0 1 0 0 1 RD RB #OFFS5";
|
389 |
|
|
$xyzpp = "01001???????????";
|
390 |
|
|
|
391 |
|
|
$protype_op_code = "0 1 1 0 1 RD RB RI 0 0";
|
392 |
|
|
$xyzpp = "01101?????????00";
|
393 |
|
|
|
394 |
|
|
$protype_op_code = "0 1 1 0 1 RD RB RI+ 0 1";
|
395 |
|
|
$xyzpp = "01101?????????01";
|
396 |
|
|
|
397 |
|
|
$protype_op_code = "0 1 1 0 1 RD RB -RI 1 0";
|
398 |
|
|
$xyzpp = "01101?????????10";
|
399 |
|
|
|
400 |
|
|
} elsif ($white_split[0] eq "STB") {
|
401 |
|
|
$protype_op_code = "0 1 0 1 0 RS RB #OFFS5";
|
402 |
|
|
$xyzpp = "01010???????????";
|
403 |
|
|
|
404 |
|
|
$protype_op_code = "0 1 1 1 0 RS RB RI 0 0";
|
405 |
|
|
$xyzpp = "01110?????????00";
|
406 |
|
|
|
407 |
|
|
$protype_op_code = "0 1 1 1 0 RS RB RI+ 0 1";
|
408 |
|
|
$xyzpp = "01110?????????01";
|
409 |
|
|
|
410 |
|
|
$protype_op_code = "0 1 1 1 0 RS RB -RI 1 0";
|
411 |
|
|
$xyzpp = "01110?????????10";
|
412 |
|
|
|
413 |
|
|
} elsif ($white_split[0] eq "STW") {
|
414 |
|
|
$protype_op_code = "0 1 0 1 1 RS RB #OFFS5";
|
415 |
|
|
$xyzpp = "01011???????????";
|
416 |
|
|
|
417 |
|
|
$protype_op_code = "0 1 1 1 1 RS RB RI 0 0";
|
418 |
|
|
$xyzpp = "01111?????????00";
|
419 |
|
|
|
420 |
|
|
$protype_op_code = "0 1 1 1 1 RS RB RI+ 0 1";
|
421 |
|
|
$xyzpp = "01111?????????01";
|
422 |
|
|
|
423 |
|
|
$protype_op_code = "0 1 1 1 1 RS RB -RI 1 0";
|
424 |
|
|
$xyzpp = "01111?????????10";
|
425 |
|
|
|
426 |
|
|
|
427 |
|
|
} elsif ($white_split[0] eq "BFEXT") {
|
428 |
|
|
$protype_op_code = "0 1 1 0 0 RD RS1 RS2 1 1";
|
429 |
|
|
$xyzpp = "01100?????????11";
|
430 |
|
|
|
431 |
|
|
} elsif ($white_split[0] eq "BFINS") {
|
432 |
|
|
$protype_op_code = "0 1 1 0 1 RD RS1 RS2 1 1";
|
433 |
|
|
$xyzpp = "01101?????????11";
|
434 |
|
|
|
435 |
|
|
} elsif ($white_split[0] eq "BFINSI") {
|
436 |
|
|
$protype_op_code = "0 1 1 1 0 RD RS1 RS2 1 1";
|
437 |
|
|
$xyzpp = "01110?????????11";
|
438 |
|
|
|
439 |
|
|
} elsif ($white_split[0] eq "BFINSX") {
|
440 |
|
|
$protype_op_code = "0 1 1 1 1 RD RS1 RS2 1 1";
|
441 |
|
|
$xyzpp = "01111?????????11";
|
442 |
|
|
|
443 |
|
|
|
444 |
|
|
} elsif ($white_split[0] eq "ANDL") {
|
445 |
|
|
$protype_op_code = "1 0 0 0 0 RD IMM8";
|
446 |
|
|
$xyzpp = "10000???????????";
|
447 |
|
|
|
448 |
|
|
} elsif ($white_split[0] eq "ANDH") {
|
449 |
|
|
$protype_op_code = "1 0 0 0 1 RD IMM8";
|
450 |
|
|
$xyzpp = "10001???????????";
|
451 |
|
|
|
452 |
|
|
} elsif ($white_split[0] eq "BITL") {
|
453 |
|
|
$protype_op_code = "1 0 0 1 0 RD IMM8";
|
454 |
|
|
$xyzpp = "10010???????????";
|
455 |
|
|
|
456 |
|
|
} elsif ($white_split[0] eq "BITH") {
|
457 |
|
|
$protype_op_code = "1 0 0 1 1 RD IMM8";
|
458 |
|
|
$xyzpp = "10011???????????";
|
459 |
|
|
|
460 |
|
|
} elsif ($white_split[0] eq "ORL") {
|
461 |
|
|
$protype_op_code = "1 0 1 0 0 RD IMM8";
|
462 |
|
|
$xyzpp = "10100???????????";
|
463 |
|
|
|
464 |
|
|
} elsif ($white_split[0] eq "ORH") {
|
465 |
|
|
$protype_op_code = "1 0 1 0 1 RD IMM8";
|
466 |
|
|
$xyzpp = "10101???????????";
|
467 |
|
|
|
468 |
|
|
} elsif ($white_split[0] eq "XNORL") {
|
469 |
|
|
$protype_op_code = "1 0 1 1 0 RD IMM8";
|
470 |
|
|
$xyzpp = "10110???????????";
|
471 |
|
|
|
472 |
|
|
} elsif ($white_split[0] eq "XNORH") {
|
473 |
|
|
$protype_op_code = "1 0 1 1 1 RD IMM8";
|
474 |
|
|
$xyzpp = "10111???????????";
|
475 |
|
|
|
476 |
|
|
|
477 |
|
|
} elsif ($white_split[0] eq "SUBL") {
|
478 |
|
|
$protype_op_code = "1 1 0 0 0 RD IMM8";
|
479 |
|
|
$xyzpp = "11000???????????";
|
480 |
|
|
|
481 |
|
|
} elsif ($white_split[0] eq "SUBH") {
|
482 |
|
|
$protype_op_code = "1 1 0 0 1 RD IMM8";
|
483 |
|
|
$xyzpp = "11001???????????";
|
484 |
|
|
|
485 |
|
|
} elsif ($white_split[0] eq "CMPL") {
|
486 |
|
|
$protype_op_code = "1 1 0 1 0 RS IMM8";
|
487 |
|
|
$xyzpp = "11010???????????";
|
488 |
|
|
|
489 |
|
|
} elsif ($white_split[0] eq "CPCH") {
|
490 |
|
|
$protype_op_code = "1 1 0 1 1 RS IMM8";
|
491 |
|
|
$xyzpp = "11011???????????";
|
492 |
|
|
|
493 |
|
|
} elsif ($white_split[0] eq "ADDL") {
|
494 |
|
|
$protype_op_code = "1 1 1 0 0 RD IMM8";
|
495 |
|
|
$xyzpp = "11100???????????";
|
496 |
|
|
|
497 |
|
|
} elsif ($white_split[0] eq "ADDH") {
|
498 |
|
|
$protype_op_code = "1 1 1 0 1 RD IMM8";
|
499 |
|
|
$xyzpp = "11101???????????";
|
500 |
|
|
|
501 |
|
|
} elsif ($white_split[0] eq "LDL") {
|
502 |
|
|
$protype_op_code = "1 1 1 1 0 RD IMM8";
|
503 |
|
|
$xyzpp = "11110???????????";
|
504 |
|
|
|
505 |
|
|
} elsif ($white_split[0] eq "LDH") {
|
506 |
|
|
$protype_op_code = "1 1 1 1 1 RD IMM8";
|
507 |
|
|
$xyzpp = "11111???????????";
|
508 |
|
|
}
|
509 |
|
|
|
510 |
|
|
$memory_image[$program_address] = $xyzpp;
|
511 |
|
|
$program_address = $program_address + 1;
|
512 |
|
|
}
|
513 |
|
|
|
514 |
|
|
################################################################################
|
515 |
|
|
# Main
|
516 |
|
|
################################################################################
|
517 |
|
|
|
518 |
|
|
if( @ARGV < 1 ) {
|
519 |
|
|
$progname = `basename $0`;
|
520 |
|
|
chomp($progname);
|
521 |
|
|
print "Syntax: $progname <Infile> <Outfile>\n";
|
522 |
|
|
die;
|
523 |
|
|
} elsif ( @ARGV < 2 ) {
|
524 |
|
|
print "Using default output file \"temp.v\"\n";
|
525 |
|
|
$Infile = shift @ARGV;
|
526 |
|
|
$Outfile = 'temp.v';
|
527 |
|
|
} else {
|
528 |
|
|
$Infile = shift @ARGV;
|
529 |
|
|
$Outfile = shift @ARGV;
|
530 |
|
|
}
|
531 |
|
|
|
532 |
|
|
open( source_file, "<$Infile" ) || die "Could not open Input file";
|
533 |
|
|
open( verilog_file, ">$Outfile" ) || die "Could not open Output file";
|
534 |
|
|
|
535 |
|
|
$source_line_number = 1;
|
536 |
|
|
$program_address = 0;
|
537 |
|
|
$cpu_type = "";
|
538 |
|
|
@memory_image = "";
|
539 |
|
|
@instruction_keyword_list = qw/ CPU ALIGN ORG EQU DW DB FCC /;
|
540 |
|
|
push @instruction_keyword_list, qw/ BRK NOP RTS SIF CSEM SSEM SEX PAR /;
|
541 |
|
|
push @instruction_keyword_list, qw/ JAL SIF TFR BFFO ASR CSL CSR LSL LSR /;
|
542 |
|
|
push @instruction_keyword_list, qw/ ROL ROR AND OR XNOR SUB SBC ADD BCC BCS /;
|
543 |
|
|
push @instruction_keyword_list, qw/ BNE BEQ BPL BMI BVC BVS BHI BLS BGE BLT /;
|
544 |
|
|
push @instruction_keyword_list, qw/ BGT BLE BRA LDB LDW STB STW BFEXT BFINS /;
|
545 |
|
|
push @instruction_keyword_list, qw/ BFINSI BFINSX ANDL ANDH BITL BITH ORL /;
|
546 |
|
|
push @instruction_keyword_list, qw/ ORH XNORL XNORH SUBL SUBH CMPL CPCH /;
|
547 |
|
|
push @instruction_keyword_list, qw/ ADDL ADDH LDL LDH /;
|
548 |
|
|
|
549 |
|
|
while (<source_file>) {
|
550 |
|
|
chomp;
|
551 |
|
|
s/;.*$//g; # get rid of everything after ;
|
552 |
|
|
s/ *$//g; # get rid of trailing blanks
|
553 |
|
|
s/^ *//g; # get rid of all leading blanks
|
554 |
|
|
if ($_) {
|
555 |
|
|
print "Instruction Line = $_ number = $source_line_number\n";
|
556 |
|
|
#@white_split = split; # Breakout fields on white space
|
557 |
|
|
@white_split = split /\s+|,/; # Breakout fields on white space or ,
|
558 |
|
|
$i = 0;
|
559 |
|
|
foreach (@white_split) {
|
560 |
|
|
s/\(R/R/; # Remove leading "(" if it is part of Register name
|
561 |
|
|
s/\)\)/\)/; # Take of one of ")" of double "))"
|
562 |
|
|
if (/^\$/) { # Take care of the simple case of a hex number
|
563 |
|
|
$white_split[$i] = &hex_to_num($white_split[$i]);
|
564 |
|
|
}
|
565 |
|
|
if (/^[0-9]/) { # Take care of the simple case of a dec number
|
566 |
|
|
$white_split[$i] = &dec_to_num($white_split[$i]);
|
567 |
|
|
}
|
568 |
|
|
$i++;
|
569 |
|
|
}
|
570 |
|
|
if (! &test_for_keyword($white_split[0])) { # Line starts with a symbol name
|
571 |
|
|
$current_symbol = $white_split[0];
|
572 |
|
|
if ($symbol_table{$current_symbol}) {
|
573 |
|
|
print "Error Reused Symbol - $current_symbol - Source Line Number $source_line_number\n";
|
574 |
|
|
} else {
|
575 |
|
|
$symbol_table{$current_symbol} = "XXX"; # initilize to junk
|
576 |
|
|
}
|
577 |
|
|
shift @white_split;
|
578 |
|
|
}
|
579 |
|
|
if (! @white_split) { # The only thing in the line was a symbol
|
580 |
|
|
$symbol_table{$current_symbol} = $program_address;
|
581 |
|
|
} else {
|
582 |
|
|
&do_compiler_command(@white_split);
|
583 |
|
|
&do_instruction;
|
584 |
|
|
}
|
585 |
|
|
}
|
586 |
|
|
$source_line_number++;
|
587 |
|
|
}
|
588 |
|
|
|
589 |
|
|
&print_symbol_table;
|
590 |
|
|
&print_memory_image;
|
591 |
|
|
|
592 |
|
|
close( source_file );
|
593 |
|
|
close( verilog_file );
|
594 |
|
|
|