Reversed order of comparison and arithmetic operations
This commit is contained in:
parent
e342d9b254
commit
d7d5be6949
60
creature.go
60
creature.go
@ -90,42 +90,38 @@ func (machine *Machine[WORD]) Execute(offset WORD) (err error) {
|
|||||||
for int(machine.counter) < len(machine.Program) {
|
for int(machine.counter) < len(machine.Program) {
|
||||||
switch machine.instruction() {
|
switch machine.instruction() {
|
||||||
case PUSH:
|
case PUSH:
|
||||||
// push the next word in program memory onto the stack
|
|
||||||
machine.counter++
|
machine.counter++
|
||||||
machine.Push(machine.instruction())
|
machine.Push(machine.instruction())
|
||||||
|
|
||||||
case POP:
|
case POP:
|
||||||
// pop the top word off of the stack, and discard it
|
|
||||||
machine.Pop()
|
machine.Pop()
|
||||||
|
|
||||||
case PEEK:
|
case PEEK:
|
||||||
// push the word at an address onto the stack
|
|
||||||
machine.Push(machine.Peek(machine.Pop()))
|
machine.Push(machine.Peek(machine.Pop()))
|
||||||
|
|
||||||
case POKE:
|
case POKE:
|
||||||
// store a word at an address
|
|
||||||
address := machine.Pop()
|
address := machine.Pop()
|
||||||
word := machine.Pop()
|
word := machine.Pop()
|
||||||
machine.Poke(address, word)
|
machine.Poke(address, word)
|
||||||
|
|
||||||
case ADD:
|
case ADD:
|
||||||
// adds the last two words on the stack
|
right := machine.Pop()
|
||||||
machine.Push(machine.Pop() + machine.Pop())
|
left := machine.Pop()
|
||||||
|
machine.Push(left + right)
|
||||||
|
|
||||||
case SUB:
|
case SUB:
|
||||||
// subtracts the second to last word on the stack from
|
right := machine.Pop()
|
||||||
// the last word on the stack
|
left := machine.Pop()
|
||||||
machine.Push(machine.Pop() - machine.Pop())
|
machine.Push(left - right)
|
||||||
|
|
||||||
case MUL:
|
case MUL:
|
||||||
// multiplies the last two words on the stack
|
right := machine.Pop()
|
||||||
machine.Push(machine.Pop() * machine.Pop())
|
left := machine.Pop()
|
||||||
|
machine.Push(left * right)
|
||||||
|
|
||||||
case DIV:
|
case DIV:
|
||||||
// divides the last word on the stack by the second to
|
|
||||||
// last word on the stack
|
|
||||||
left := machine.Pop()
|
|
||||||
right := machine.Pop()
|
right := machine.Pop()
|
||||||
|
left := machine.Pop()
|
||||||
if right == 0 {
|
if right == 0 {
|
||||||
err = ErrorDivideByZero
|
err = ErrorDivideByZero
|
||||||
return
|
return
|
||||||
@ -133,62 +129,56 @@ func (machine *Machine[WORD]) Execute(offset WORD) (err error) {
|
|||||||
machine.Push(left / right)
|
machine.Push(left / right)
|
||||||
|
|
||||||
case EQ:
|
case EQ:
|
||||||
// checks if the last two words on the stack are equal
|
right := machine.Pop()
|
||||||
|
left := machine.Pop()
|
||||||
equal := 0
|
equal := 0
|
||||||
if machine.Pop() == machine.Pop() {
|
if left == right {
|
||||||
equal = 1
|
equal = 1
|
||||||
}
|
}
|
||||||
machine.Push(WORD(equal))
|
machine.Push(WORD(equal))
|
||||||
|
|
||||||
case GT:
|
case GT:
|
||||||
// checks if the last word on the stack is greater than
|
right := machine.Pop()
|
||||||
// the second to last word on the stack
|
left := machine.Pop()
|
||||||
greater := 0
|
greater := 0
|
||||||
if machine.Pop() > machine.Pop() {
|
if left > right {
|
||||||
greater = 1
|
greater = 1
|
||||||
}
|
}
|
||||||
machine.Push(WORD(greater))
|
machine.Push(WORD(greater))
|
||||||
|
|
||||||
case LT:
|
case LT:
|
||||||
// checks if the last word on the stack is less than the
|
right := machine.Pop()
|
||||||
// second to last word on the stack
|
left := machine.Pop()
|
||||||
less := 0
|
less := 0
|
||||||
if machine.Pop() < machine.Pop() {
|
if left < right {
|
||||||
less = 1
|
less = 1
|
||||||
}
|
}
|
||||||
machine.Push(WORD(less))
|
machine.Push(WORD(less))
|
||||||
|
|
||||||
case NEQ:
|
case NEQ:
|
||||||
// checks if the last two words on the stack are not
|
right := machine.Pop()
|
||||||
// equal
|
left := machine.Pop()
|
||||||
notEqual := 0
|
notEqual := 0
|
||||||
if machine.Pop() != machine.Pop() {
|
if left != right {
|
||||||
notEqual = 1
|
notEqual = 1
|
||||||
}
|
}
|
||||||
machine.Push(WORD(notEqual))
|
machine.Push(WORD(notEqual))
|
||||||
|
|
||||||
case MOD:
|
case MOD:
|
||||||
// performs a modulo operation of the second to last
|
right := machine.Pop()
|
||||||
// word on the stack to the last word on the stack
|
left := machine.Pop()
|
||||||
machine.Push(machine.Pop() % machine.Pop())
|
machine.Push(left % right)
|
||||||
|
|
||||||
case HALT:
|
case HALT:
|
||||||
// stops execution
|
|
||||||
return
|
return
|
||||||
|
|
||||||
case JMP:
|
case JMP:
|
||||||
// jump to the address specified by the last word on the
|
|
||||||
// stack if the second to last word on the stack is
|
|
||||||
// nonzero
|
|
||||||
jumpTo := machine.Pop()
|
jumpTo := machine.Pop()
|
||||||
if machine.Pop() != 0 {
|
if machine.Pop() != 0 {
|
||||||
machine.counter = jumpTo - 1
|
machine.counter = jumpTo - 1
|
||||||
}
|
}
|
||||||
|
|
||||||
case CAL:
|
case CAL:
|
||||||
// call an implementation-defined subroutine, with the
|
|
||||||
// id specified by the last word on the stack. this may
|
|
||||||
// push and pop various things from the stack
|
|
||||||
id := machine.Pop()
|
id := machine.Pop()
|
||||||
if machine.functions == nil {
|
if machine.functions == nil {
|
||||||
break
|
break
|
||||||
|
@ -41,24 +41,24 @@ func TestPush(test *testing.T) {
|
|||||||
|
|
||||||
func TestArithmetic(test *testing.T) {
|
func TestArithmetic(test *testing.T) {
|
||||||
machine := runMachineTest([]int {
|
machine := runMachineTest([]int {
|
||||||
PUSH, 2,
|
|
||||||
PUSH, 3,
|
PUSH, 3,
|
||||||
|
PUSH, 2,
|
||||||
ADD,
|
ADD,
|
||||||
|
|
||||||
PUSH, 4,
|
|
||||||
PUSH, 10,
|
PUSH, 10,
|
||||||
|
PUSH, 4,
|
||||||
SUB,
|
SUB,
|
||||||
|
|
||||||
PUSH, 7,
|
|
||||||
PUSH, 2,
|
PUSH, 2,
|
||||||
|
PUSH, 7,
|
||||||
MUL,
|
MUL,
|
||||||
|
|
||||||
PUSH, 3,
|
|
||||||
PUSH, 12,
|
PUSH, 12,
|
||||||
|
PUSH, 3,
|
||||||
DIV,
|
DIV,
|
||||||
|
|
||||||
PUSH, 6,
|
|
||||||
PUSH, 8,
|
PUSH, 8,
|
||||||
|
PUSH, 6,
|
||||||
MOD,
|
MOD,
|
||||||
}, nil, test)
|
}, nil, test)
|
||||||
|
|
||||||
@ -106,16 +106,16 @@ func TestComparison(test *testing.T) {
|
|||||||
PUSH, 6,
|
PUSH, 6,
|
||||||
EQ,
|
EQ,
|
||||||
|
|
||||||
PUSH, 4,
|
|
||||||
PUSH, 324,
|
PUSH, 324,
|
||||||
|
PUSH, 4,
|
||||||
GT,
|
GT,
|
||||||
|
|
||||||
PUSH, 324,
|
|
||||||
PUSH, 4,
|
PUSH, 4,
|
||||||
|
PUSH, 324,
|
||||||
LT,
|
LT,
|
||||||
|
|
||||||
PUSH, 6,
|
|
||||||
PUSH, 54,
|
PUSH, 54,
|
||||||
|
PUSH, 6,
|
||||||
NEQ,
|
NEQ,
|
||||||
|
|
||||||
}, nil, test)
|
}, nil, test)
|
||||||
|
Loading…
Reference in New Issue
Block a user