
class spu:
  def __init__(self):
    self.code = [0]*32
    self.stack = [0]*8
    self.sp = 0
    self.ip = 0
    self.io = [False]*8

  def nextinstruction(self):
    instruction = self.code[self.ip]
    self.ip+=1
    if self.ip>=32:
      self.ip=0
    return instruction

  def push(self,value):
    if not isinstance( value, int )
      return
    if self.sp >= 8:
      return
    self.stack[self.sp] = value & 0x7
    self.sp += 1

  def pop(self):
    if self.sp == 0:
      return 0;
    value = self.stack[self.sp]
    self.stack[self.sp] = 0
    self.sp -= 1
    return value
  
  def toggle(self,io,value):
    """
    io as pin number, 0-7
    value as boolean
    """
    if not isinstance( io, int )
      return
    if not isinstance( value, bool )
      return
    self.io[value&7] = value

  def read(self,io):
    if not isinstance( io, int )
      return
    return self.io[value&7]