-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtable.scala
63 lines (59 loc) · 2.6 KB
/
table.scala
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
@main def hello() = {
val table = Seq(
Seq("Opcode", "Function", "Description"),
Seq("add", "A = A + Rn", "Add register Rn to A"),
Seq("addi", "A = A + i", "Add immediate value i to A (sign extend i)"),
Seq("sub", "A = A - Rn", "Subtract register Rn from A"),
Seq("subi", "A = A - i", "Subtract immediate value i from A (sign extend i)"),
Seq("sra", "A = A >> 1", "Shift A arithmetic right"),
Seq("and", "A = A and Rn", "And register Rn with A"),
Seq("andi", "A = A and i", "And immediate value i with A"),
Seq("or", "A = A or Rn", "Or register Rn with A"),
Seq("ori", "A = A or i", "Or immediate value i with A"),
Seq("xor", "A = A xor Rn", "Xor register Rn with A"),
Seq("xori", "A = A xor i", "Xor immediate value i with A"),
Seq("load", "A = Rn", "Load register Rn into A"),
Seq("loadi", "A = i", "Load immediate value i into A (sign extend i)"),
Seq("loadhi", "A$_{31-8}$ = i", "Load immediate into second byte (sign extend i)"),
Seq("loadh2i", "A$_{31-16}$ = i ", "Load immediate into third byte (sign extend i)"),
Seq("loadh3i", "A$_{31-24}$ = i", "Load immediate into fourth byte (sign extend i)"),
Seq("store", "Rn = A", "Store A into register Rn"),
Seq("jal", "PC = A, Rn = PC + 2", "Jump to A and store return address in Rn"),
Seq("ldaddr", "AR = Rn", "Load address register AR with Rn"),
Seq("loadind", "A = mem[AR+(i << 2)]", "Load a word from memory into A"),
Seq("loadindb", "A = mem[AR+i]$_{7-0}$", "Load a byte signe extending from memory into A"),
Seq("storeind", "mem[AR+(i << 2)] = A", "Store A into memory"),
Seq("storeindb", "mem[AR+i]$_{7-0}$ = A", "Store a byte into memory"),
Seq("br", "PC = PC + o", "Branch"),
Seq("brz", "if A == 0 PC = PC + o", "Branch if A is zero"),
Seq("brnz", "if A != 0 PC = PC + o ", "Branch if A is not zero"),
Seq("brp", "if A >= 0 PC = PC + o", "Branch if A is positive"),
Seq("brn", "if A < 0 PC = PC + o", "Branch if A is negative"),
Seq("scall", "scall A", "System call (simulation hook)"),
)
// this is ugly
var l1 = List("")
var l2 = List("")
var l3 = List("")
for (row <- table) {
l1 = l1.appended(row(0))
l2 = l2.appended(row(1))
l3 = l3.appended(row(2))
}
val max = Array(l1.map(_.length).max, l2.map(_.length).max, l3.map(_.length).max)
for (row <- table) {
for (i <- 0 until row.length) {
print("| ")
print(row(i))
print(" " * (max(i) - row(i).length + 1))
}
println("|")
if (row == table(0)) {
for (i <- 0 until row.length) {
print("| ")
print("-" * (max(i)) + " ")
}
println("|")
}
}
}