aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core.go10
-rw-r--r--stack.go15
2 files changed, 13 insertions, 12 deletions
diff --git a/core.go b/core.go
index 32f37fb..9a82b36 100644
--- a/core.go
+++ b/core.go
@@ -118,26 +118,26 @@ func (c *Core) Eval(ins Instruction) {
c.st0 = c.d.pop()
case ALU:
if v.RtoPC {
- c.pc = c.r.get() >> 1
+ c.pc = c.r.peek() >> 1
}
if v.NtoAtT {
- c.writeAt(c.st0, c.d.get())
+ c.writeAt(c.st0, c.d.peek())
}
st0 := c.newST0(v.Opcode)
c.d.move(v.Ddir)
c.r.move(v.Rdir)
if v.TtoN {
- c.d.set(c.st0)
+ c.d.replace(c.st0)
}
if v.TtoR {
- c.r.set(c.st0)
+ c.r.replace(c.st0)
}
c.st0 = st0
}
}
func (c *Core) newST0(opcode uint16) uint16 {
- T, N, R := c.st0, c.d.get(), c.r.get()
+ T, N, R := c.st0, c.d.peek(), c.r.peek()
switch opcode {
case opT: // T
return T
diff --git a/stack.go b/stack.go
index aed4e6a..c116c5a 100644
--- a/stack.go
+++ b/stack.go
@@ -8,24 +8,25 @@ type stack struct {
}
func (s *stack) move(dir int8) {
- s.sp = (s.sp + dir + stackSize) % stackSize
+ s.sp = (s.sp + dir) & (stackSize - 1)
}
func (s *stack) push(v uint16) {
- s.move(1)
- s.set(v)
+ s.sp = (s.sp + 1) & (stackSize - 1)
+ s.data[s.sp] = v
}
func (s *stack) pop() uint16 {
- defer s.move(-1)
- return s.get()
+ v := s.data[s.sp]
+ s.sp = (s.sp - 1) & (stackSize - 1)
+ return v
}
-func (s *stack) get() uint16 {
+func (s *stack) peek() uint16 {
return s.data[s.sp]
}
-func (s *stack) set(v uint16) {
+func (s *stack) replace(v uint16) {
s.data[s.sp] = v
}