From 3a9d49cd4efdb6aec41aa96c635ee43d47fc9d2f Mon Sep 17 00:00:00 2001
From: Jonas Franz <info@jonasfranz.software>
Date: Mon, 18 May 2020 20:55:47 +0200
Subject: [PATCH 1/3] Add IO

---
 hal/module.go | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/hal/module.go b/hal/module.go
index 09ded49..a218b1e 100644
--- a/hal/module.go
+++ b/hal/module.go
@@ -10,6 +10,7 @@ type Module struct {
 	Accumulator    float64
 	ProgramStorage Program
 	Register       []float64
+	IO             []float64
 	isStopped      bool
 }
 
@@ -40,12 +41,13 @@ func (h *Module) Run() error {
 	return nil
 }
 
-func NewHALModule(program Program, registerSize uint64) (*Module, error) {
+func NewHALModule(program Program, registerSize uint64, ioSize uint64) (*Module, error) {
 	if registerSize <= 10 {
 		return nil, fmt.Errorf("register size must be greater then 10 [ registerSize = %d ]", registerSize)
 	}
 	return &Module{
 		ProgramStorage: program,
 		Register:       make([]float64, registerSize),
+		IO:             make([]float64, ioSize),
 	}, nil
 }

From c94a6e02d80fdb259b4f391fef7f7d20012f2579 Mon Sep 17 00:00:00 2001
From: Jonas Franz <info@jonasfranz.software>
Date: Mon, 18 May 2020 20:56:54 +0200
Subject: [PATCH 2/3] Run module

---
 cmd/root.go | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/cmd/root.go b/cmd/root.go
index b732288..ec01c6d 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -50,6 +50,9 @@ func runRootCommand(cmd *cobra.Command, args []string) error {
 	if err != nil {
 		return err
 	}
-	hal.NewHALModule(program, 256)
-	return nil
+	module, err := hal.NewHALModule(program, 256, 2)
+	if err != nil {
+		return err
+	}
+	return module.Run()
 }

From 743ec2c0b572579fb0359e220971fbee3a5dde06 Mon Sep 17 00:00:00 2001
From: Jonas Franz <info@jonasfranz.software>
Date: Mon, 18 May 2020 20:58:58 +0200
Subject: [PATCH 3/3] Implement out instruction

---
 hal/instructions.go |  4 ++--
 hal/module.go       | 16 ++++++++--------
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/hal/instructions.go b/hal/instructions.go
index ceed661..3e43777 100644
--- a/hal/instructions.go
+++ b/hal/instructions.go
@@ -58,8 +58,8 @@ var InstructionStop = &Instruction{
 
 var InstructionOut = &Instruction{
 	Name: "OUT",
-	Execute: func(module *Module) {
-		// TODO implement
+	ExecuteWithOperand: func(module *Module, operand float64) {
+		module.IO[int64(operand)] = module.accumulator
 	},
 }
 
diff --git a/hal/module.go b/hal/module.go
index a218b1e..04b1db8 100644
--- a/hal/module.go
+++ b/hal/module.go
@@ -7,23 +7,23 @@ const maxInstructions = 1000
 type Program map[int64]*ProgrammedInstruction
 
 type Module struct {
-	Accumulator    float64
-	ProgramStorage Program
-	Register       []float64
+	accumulator    float64
+	programStorage Program
+	register       []float64
 	IO             []float64
 	isStopped      bool
 }
 
 func (h *Module) ProgramCounter() int64 {
-	return int64(h.Register[0])
+	return int64(h.register[0])
 }
 
 func (h *Module) increaseProgramCounter() {
-	h.Register[0]++
+	h.register[0]++
 }
 
 func (h *Module) Step() {
-	instruction := h.ProgramStorage[h.ProgramCounter()]
+	instruction := h.programStorage[h.ProgramCounter()]
 	h.increaseProgramCounter()
 	if instruction == nil {
 		return
@@ -46,8 +46,8 @@ func NewHALModule(program Program, registerSize uint64, ioSize uint64) (*Module,
 		return nil, fmt.Errorf("register size must be greater then 10 [ registerSize = %d ]", registerSize)
 	}
 	return &Module{
-		ProgramStorage: program,
-		Register:       make([]float64, registerSize),
+		programStorage: program,
+		register:       make([]float64, registerSize),
 		IO:             make([]float64, ioSize),
 	}, nil
 }