about summary refs log tree commit diff
path: root/src/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.go')
-rw-r--r--src/main.go94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/main.go b/src/main.go
new file mode 100644
index 0000000..b11ea45
--- /dev/null
+++ b/src/main.go
@@ -0,0 +1,94 @@
+package main
+
+import (
+	"fmt"
+	"log"
+	"strings"
+	"time"
+)
+
+var (
+	verbose *bool
+)
+
+func main() {
+
+	log.Println("---")
+	log.Println("[i] Parse the config")
+	config := parseConfig()
+
+	// build the bots
+	log.Println("---")
+	log.Println("[i] Build the bots")
+
+	for i := 0; i < 2; i++ {
+		bot := buildBot(config, "bots/warrior.asm")
+		config.Bots = append(config.Bots, bot)
+	}
+	// bot2 := buildBot(config, "bots/warrior.asm")
+	// config.Bots = append(config.Bots, bot2)
+	// bot3 := buildBot(config, "bots/warrior.asm")
+	// config.Bots = append(config.Bots, bot3)
+
+	// initialize the arena
+	log.Println("---")
+	log.Println("[i] Initialize the Arena")
+	r2p := initArena(config)
+
+	randomOffsets := getRandomOffsets(config)
+
+	// place each bot in the arena
+	log.Println("---")
+	log.Println("[i] Place the bots")
+	for bot := 0; bot < len(config.Bots); bot++ {
+		// Place the bot in the arena
+		log.Printf("[i] Placing bot %d", bot)
+		address := randomOffsets[bot]
+		placeBot(r2p, config.Bots[bot], address)
+
+		// store the initial address of the bot int the struct field
+		config.Bots[bot].Addr = address
+
+		// define the instruction point and the stack pointer
+		log.Printf("[i] setting up the PC and SP for bot %d", bot)
+		_ = r2cmd(r2p, fmt.Sprintf("aer PC=%d", address))
+		_ = r2cmd(r2p, fmt.Sprintf("aer SP=SP+%d", address))
+
+		// dump the registers of the user for being able to switch inbetween them
+		initialRegisers := strings.Replace(r2cmd(r2p, "aerR"), "\n", ";", -1)
+		config.Bots[bot].Regs = initialRegisers
+
+		// print the instruction point and the stack pointer
+		botStackPointer := r2cmd(r2p, "aerR~esp[2]")
+		log.Printf("[i] bot %d esp = %s", bot, botStackPointer)
+		botInstructionPointer := r2cmd(r2p, "aerR~eip[2]")
+		log.Printf("[i] bot %d eip = %s", bot, botInstructionPointer)
+	}
+
+	// handle errors in esil
+	_ = r2cmd(r2p, "e cmd.esil.todo=f theend=1")
+	_ = r2cmd(r2p, "e cmd.esil.trap=f theend=1")
+	_ = r2cmd(r2p, "e cmd.esil.intr=f theend=1")
+	_ = r2cmd(r2p, "e cmd.esil.ioer=f theend=1")
+	_ = r2cmd(r2p, "f theend=0")
+
+	fmt.Println(r2cmd(r2p, fmt.Sprintf("b %d", config.Memsize)))
+
+	// start the competition
+	i := 0
+	for true {
+
+		// Step, then print the users registers
+		registers := stepIn(r2p)
+		config.Bots[i].Regs = registers
+		fmt.Println(user(r2p, i, registers, config))
+
+		// switch players
+		i = switchPlayer(r2p, i, config)
+
+		// sleepti
+		time.Sleep(100 * time.Millisecond)
+	}
+
+	r2p.Close()
+}