From b4a27cafd3f10ad1634d20cb1dd89505e27a4764 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Sat, 20 Nov 2021 09:46:51 -1000 Subject: [PATCH] Make Operands an array --- asm/assemble.go | 19 +++----- asm/disassemble.go | 9 +++- vm/instruction.go | 3 +- vm/ophandler.go | 108 ++++++++++++++++++++++----------------------- 4 files changed, 67 insertions(+), 72 deletions(-) diff --git a/asm/assemble.go b/asm/assemble.go index 081a7a8..1d3d26e 100644 --- a/asm/assemble.go +++ b/asm/assemble.go @@ -70,30 +70,21 @@ func assembleInstruction(in instruction) (*vm.Instruction, error) { return nil, fmt.Errorf("Incorrect number of operands: expected %d, found %d\n", len(pattern), len(operands)) } - if len(operands) >= 1 { - op1, err := assembleOperand(operands[0], pattern[0]) + for i, t := range pattern { + op, err := assembleOperand(operands[i], t) if err != nil { return nil, errors.Wrapf(err, "In first operand") } - instr.Operand1 = op1 - } - - if len(operands) >= 2 { - op2, err := assembleOperand(operands[1], pattern[1]) - if err != nil { - return nil, errors.Wrapf(err, "In second operand") - } - - instr.Operand2 = op2 + instr.Operands[i] = op } return instr, nil } -func assembleOperand(op string, t operandType) (vm.Operand, error) { +func assembleOperand(op string, t operandType) (*vm.Operand, error) { op = strings.ToLower(op) - ret := vm.Operand{} + ret := &vm.Operand{} numStr := "" switch { diff --git a/asm/disassemble.go b/asm/disassemble.go index 1c30f61..358b60b 100644 --- a/asm/disassemble.go +++ b/asm/disassemble.go @@ -1,6 +1,7 @@ package asm import "fmt" +import "strings" import "github.com/firestuff/subcoding/vm" import "github.com/pkg/errors" @@ -28,7 +29,11 @@ func disassembleFunction(fnc *vm.Function) ([]byte, error) { } func disassembleInstruction(in *vm.Instruction) ([]byte, error) { - fmt.Printf("%s\n", nameByOpCode[in.OpCode]) + parts := []string{ + nameByOpCode[in.OpCode], + } - return nil, nil + encoded := fmt.Sprintf("[%s]", strings.Join(parts, ", ")) + + return []byte(encoded), nil } diff --git a/vm/instruction.go b/vm/instruction.go index ff472b2..3d6129f 100644 --- a/vm/instruction.go +++ b/vm/instruction.go @@ -3,8 +3,7 @@ package vm type Instruction struct { OpCode OpCodeType Reserved [4]byte - Operand1 Operand - Operand2 Operand + Operands [2]*Operand opHandler opHandler `struc:"skip"` } diff --git a/vm/ophandler.go b/vm/ophandler.go index e75a573..fe78d12 100644 --- a/vm/ophandler.go +++ b/vm/ophandler.go @@ -48,131 +48,131 @@ func (state *State) handleNoOp(instr *Instruction) { } func (state *State) handleMove(instr *Instruction) { - in := state.readUnsigned(&instr.Operand2) - state.writeUnsigned(&instr.Operand1, in) + in := state.readUnsigned(instr.Operands[1]) + state.writeUnsigned(instr.Operands[0], in) } func (state *State) handleAdd(instr *Instruction) { - in1 := state.readUnsigned(&instr.Operand1) - in2 := state.readUnsigned(&instr.Operand2) - state.writeUnsigned(&instr.Operand1, in1+in2) + in1 := state.readUnsigned(instr.Operands[0]) + in2 := state.readUnsigned(instr.Operands[1]) + state.writeUnsigned(instr.Operands[0], in1+in2) } func (state *State) handleSubtract(instr *Instruction) { - in1 := state.readUnsigned(&instr.Operand1) - in2 := state.readUnsigned(&instr.Operand2) - state.writeUnsigned(&instr.Operand1, in1-in2) + in1 := state.readUnsigned(instr.Operands[0]) + in2 := state.readUnsigned(instr.Operands[1]) + state.writeUnsigned(instr.Operands[0], in1-in2) } func (state *State) handleMultiply(instr *Instruction) { - in1 := state.readUnsigned(&instr.Operand1) - in2 := state.readUnsigned(&instr.Operand2) - state.writeUnsigned(&instr.Operand1, in1*in2) + in1 := state.readUnsigned(instr.Operands[0]) + in2 := state.readUnsigned(instr.Operands[1]) + state.writeUnsigned(instr.Operands[0], in1*in2) } func (state *State) handleDivideUnsigned(instr *Instruction) { - in1 := state.readUnsigned(&instr.Operand1) - in2 := state.readUnsigned(&instr.Operand2) - state.writeUnsigned(&instr.Operand1, in1/in2) + in1 := state.readUnsigned(instr.Operands[0]) + in2 := state.readUnsigned(instr.Operands[1]) + state.writeUnsigned(instr.Operands[0], in1/in2) } func (state *State) handleDivideSigned(instr *Instruction) { - in1 := state.readSigned(&instr.Operand1) - in2 := state.readSigned(&instr.Operand2) - state.writeSigned(&instr.Operand1, in1/in2) + in1 := state.readSigned(instr.Operands[0]) + in2 := state.readSigned(instr.Operands[1]) + state.writeSigned(instr.Operands[0], in1/in2) } func (state *State) handleNot(instr *Instruction) { - in := state.readUnsigned(&instr.Operand1) - state.writeUnsigned(&instr.Operand1, ^in) + in := state.readUnsigned(instr.Operands[0]) + state.writeUnsigned(instr.Operands[0], ^in) } func (state *State) handleAnd(instr *Instruction) { - in1 := state.readUnsigned(&instr.Operand1) - in2 := state.readUnsigned(&instr.Operand2) - state.writeUnsigned(&instr.Operand1, in1&in2) + in1 := state.readUnsigned(instr.Operands[0]) + in2 := state.readUnsigned(instr.Operands[1]) + state.writeUnsigned(instr.Operands[0], in1&in2) } func (state *State) handleOr(instr *Instruction) { - in1 := state.readUnsigned(&instr.Operand1) - in2 := state.readUnsigned(&instr.Operand2) - state.writeUnsigned(&instr.Operand1, in1|in2) + in1 := state.readUnsigned(instr.Operands[0]) + in2 := state.readUnsigned(instr.Operands[1]) + state.writeUnsigned(instr.Operands[0], in1|in2) } func (state *State) handleXor(instr *Instruction) { - in1 := state.readUnsigned(&instr.Operand1) - in2 := state.readUnsigned(&instr.Operand2) - state.writeUnsigned(&instr.Operand1, in1^in2) + in1 := state.readUnsigned(instr.Operands[0]) + in2 := state.readUnsigned(instr.Operands[1]) + state.writeUnsigned(instr.Operands[0], in1^in2) } func (state *State) handleShiftRight(instr *Instruction) { - in1 := state.readUnsigned(&instr.Operand1) - in2 := state.readUnsigned(&instr.Operand2) - state.writeUnsigned(&instr.Operand1, in1>>in2) + in1 := state.readUnsigned(instr.Operands[0]) + in2 := state.readUnsigned(instr.Operands[1]) + state.writeUnsigned(instr.Operands[0], in1>>in2) } func (state *State) handleShiftLeft(instr *Instruction) { - in1 := state.readUnsigned(&instr.Operand1) - in2 := state.readUnsigned(&instr.Operand2) - state.writeUnsigned(&instr.Operand1, in1< in2) } func (state *State) handleIsGreaterThanSigned(instr *Instruction) { - in1 := state.readSigned(&instr.Operand1) - in2 := state.readSigned(&instr.Operand2) + in1 := state.readSigned(instr.Operands[0]) + in2 := state.readSigned(instr.Operands[1]) state.comparisonResult = (in1 > in2) } func (state *State) handleIsLessThanOrEqualUnsigned(instr *Instruction) { - in1 := state.readUnsigned(&instr.Operand1) - in2 := state.readUnsigned(&instr.Operand2) + in1 := state.readUnsigned(instr.Operands[0]) + in2 := state.readUnsigned(instr.Operands[1]) state.comparisonResult = (in1 <= in2) } func (state *State) handleIsLessThanOrEqualSigned(instr *Instruction) { - in1 := state.readSigned(&instr.Operand1) - in2 := state.readSigned(&instr.Operand2) + in1 := state.readSigned(instr.Operands[0]) + in2 := state.readSigned(instr.Operands[1]) state.comparisonResult = (in1 <= in2) } func (state *State) handleIsGreaterThanOrEqualUnsigned(instr *Instruction) { - in1 := state.readUnsigned(&instr.Operand1) - in2 := state.readUnsigned(&instr.Operand2) + in1 := state.readUnsigned(instr.Operands[0]) + in2 := state.readUnsigned(instr.Operands[1]) state.comparisonResult = (in1 >= in2) } func (state *State) handleIsGreaterThanOrEqualSigned(instr *Instruction) { - in1 := state.readSigned(&instr.Operand1) - in2 := state.readSigned(&instr.Operand2) + in1 := state.readSigned(instr.Operands[0]) + in2 := state.readSigned(instr.Operands[1]) state.comparisonResult = (in1 >= in2) } func (state *State) handleJump(instr *Instruction) { - in := state.readSigned(&instr.Operand1) + in := state.readSigned(instr.Operands[0]) state.jump(in) } @@ -189,7 +189,7 @@ func (state *State) handleJumpIfFalse(instr *Instruction) { } func (state *State) handleCall(instr *Instruction) { - in := state.readSigned(&instr.Operand1) + in := state.readSigned(instr.Operands[0]) state.call(in) }