Skip to content

Commit c0a9f3f

Browse files
committed
Add function to print registers
1 parent 3bf6254 commit c0a9f3f

File tree

2 files changed

+67
-7
lines changed

2 files changed

+67
-7
lines changed

Memory/DataMemory.go

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,78 @@
11
package memory
22

3-
import "sync"
3+
import (
4+
tablewriter "github.com/olekukonko/tablewriter"
5+
color "github.com/fatih/color"
6+
"os"
7+
"sync"
8+
"strconv"
9+
)
410

511
type DataMemory struct {
612
sync.RWMutex
713
Memory []int32
814
}
915

10-
var registers [32]int64
16+
var registers, buffer [32]int64
1117

1218
var flagNegative, flagZero, flagOverflow, flagCarry bool
1319

1420
/*
1521
* method to initiate register values
1622
*/
1723

18-
func InitRegisters() {
19-
registers[XZR] = 0
20-
registers[SP] = MEMORY_SIZE * 4
21-
}
24+
func InitRegisters() {
25+
registers[XZR] = 0
26+
registers[SP] = MEMORY_SIZE * 4
27+
}
28+
29+
/*
30+
* function to store register values in a buffer
31+
*/
32+
33+
func SaveRegisters() {
34+
var i int
35+
for i = 0; i < 32; i++ {
36+
buffer[i] = registers[i]
37+
}
38+
}
39+
40+
/*
41+
* function to show register values
42+
*/
43+
44+
func ShowRegisters(showAll bool) {
45+
var i int
46+
var registerNum, prevRegisterVal, newRegisterVal string
47+
table := tablewriter.NewWriter(os.Stdout)
48+
if showAll == true {
49+
table.SetHeader([]string{"Register", "Value"})
50+
51+
for i = 0; i < 32; i++ {
52+
registerNum = strconv.Itoa(i)
53+
newRegisterVal = strconv.FormatInt(getRegisterValue(uint(i)), 10)
54+
if getRegisterValue(uint(i)) != buffer[i] {
55+
table.Append([]string{color.CyanString("R"+registerNum), color.CyanString(newRegisterVal)})
56+
} else {
57+
table.Append([]string{"R"+registerNum, newRegisterVal})
58+
}
59+
}
60+
} else {
61+
table.SetHeader([]string{"Register", "Previous Value", "New Value"})
62+
63+
for i = 0; i < 32; i++ {
64+
if getRegisterValue(uint(i)) != buffer[i] {
65+
registerNum = strconv.Itoa(i)
66+
prevRegisterVal = strconv.FormatInt(buffer[i], 10)
67+
newRegisterVal = strconv.FormatInt(getRegisterValue(uint(i)), 10)
68+
table.Append([]string{color.CyanString("R"+registerNum), color.RedString(prevRegisterVal), color.GreenString(newRegisterVal)})
69+
}
70+
}
71+
}
72+
73+
74+
table.Render()
75+
}
2276

2377
/*
2478
* Method to read data from memory

arm.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,18 @@ var helpString = `ARMed version 1.0
1515
Author : https://github.com/coderick14
1616
1717
ARMed is a very basic emulator of the 64-bit LEGv8 architecture written in Golang
18-
USAGE : ARMed [--help] SOURCE_FILE
18+
USAGE : ARMed [--all] SOURCE_FILE
19+
20+
The --all flag will show all register values after an instruction, with updated ones in color.
21+
In absence of this flag, it will show only updated registers.
1922
2023
Found a bug? Feel free to raise an issue on https://github.com/coderick14/ARMed
2124
Contributions welcome :)`
2225

2326
func main() {
2427
var err error
2528
helpPtr := flag.Bool("help", false, "Display help")
29+
allPtr := flag.Bool("all", false, "Display all registers")
2630

2731
flag.Parse()
2832

@@ -63,11 +67,13 @@ func main() {
6367
Memory.InitRegisters()
6468

6569
for _, _ = range Memory.InstructionMem.Instructions {
70+
Memory.SaveRegisters()
6671
err = Memory.InstructionMem.ValidateAndExecuteInstruction()
6772
if err != nil {
6873
fmt.Println(err)
6974
return
7075
}
76+
Memory.ShowRegisters(*allPtr)
7177
}
7278

7379
}

0 commit comments

Comments
 (0)