-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbin_coder.cpp
73 lines (70 loc) · 2.05 KB
/
bin_coder.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "bin_coder.h"
#include <assert.h>
struct command decode_bin_com(int bin_com) {
struct command com;
if((bin_com >> 7) == 0x0) {
com.opcode = MOV;
com.instr.data = bin_com & 0x7F;
}
else if((bin_com >> 4) == 0x8) {
com.opcode = ADD;
com.instr.ops.rd = (enum reg_t) ((bin_com >> 2) & 0x3);
com.instr.ops.rs = (enum reg_t) (bin_com & 0x3);
}
else if((bin_com >> 4) == 0x9) {
com.opcode = SUB;
com.instr.ops.rd = (enum reg_t) ((bin_com >> 2) & 0x3);
com.instr.ops.rs = (enum reg_t) (bin_com & 0x3);
}
else if((bin_com >> 4) == 0xA) {
com.opcode = MUL;
com.instr.ops.rd = (enum reg_t) ((bin_com >> 2) & 0x3);
com.instr.ops.rs = (enum reg_t) (bin_com & 0x3);
}
else if((bin_com >> 4) == 0xB) {
com.opcode = DIV;
com.instr.ops.rd = (enum reg_t) ((bin_com >> 2) & 0x3);
com.instr.ops.rs = (enum reg_t) (bin_com & 0x3);
}
else if((bin_com >> 2) == 0x30) {
com.opcode = IN;
com.instr.rop = (enum reg_t) (bin_com & 0x3);
}
else if((bin_com >> 2) == 0x31) {
com.opcode = OUT;
com.instr.rop = (enum reg_t) (bin_com & 0x3);
}
else {
assert(0 && "Wrong command code");
}
return com;
}
int code_bin_com(struct command com) {
switch (com.opcode) {
case MOV: {
assert((com.instr.data <= 0x7F) && (com.instr.data >= 0) && "wrong num");
return ((0x0 << 7) | (com.instr.data));
}
case ADD: {
return ((0x8 << 4) | (com.instr.ops.rd << 2) | (com.instr.ops.rs));
}
case SUB: {
return ((0x9 << 4) | (com.instr.ops.rd << 2) | (com.instr.ops.rs));
}
case MUL: {
return ((0xA << 4) | (com.instr.ops.rd << 2) | (com.instr.ops.rs));
}
case DIV: {
return ((0xB << 4) | (com.instr.ops.rd << 2) | (com.instr.ops.rs));
}
case IN: {
return ((0x30 << 2) | (com.instr.rop));
}
case OUT: {
return ((0x31 << 2) | (com.instr.rop));
}
default: {
assert(0);
}
}
}