Download | Plain Text | Line Numbers


/**
 * @module cinstruction
 * @author Guenther Neuwirth (0626638), Manuel Mausz (0728348)
 * @brief  Abstract class for displays
 * @date   13.05.2009
 */
 
#ifndef CINSTRUCTION_H
#define CINSTRUCTION_H 1
 
#include <iostream>
#include <list>
 
/* forward declare CCPU */
class CCPU;
 
/**
 * @class CInstruction
 *
 * Abstract class for displays
 */
class CInstruction
{
  public:
    /**
     * @method CInstruction
     * @brief  Default ctor
     * @param  name  name of instruction
     * @return -
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    CInstruction(std::string name)
      : m_name(name)
    {}
 
    /**
     * @method ~CInstruction
     * @brief  Default dtor
     * @param  -
     * @return -
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    virtual ~CInstruction()
    {}
 
    /**
     * @method operator==
     * @brief  implementation of operator ==
     * @param  name reference to std::string
     * @return true if instructionname is name
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    virtual bool operator==(std::string& name)
    {
      return name == m_name;
    }
 
    /**
     * @method operator()
     * @brief  implementation of operator (CCPU)
     * @param  cpu  pointer to cpu
     * @return -
     * @globalvars none
     * @exception  std::runtime_error
     * @conditions none
     */
    virtual CInstruction& operator()(CCPU *cpu)
    {
      execute(cpu);
      return *this;
    }
 
    /**
     * @method getName
     * @brief  returns instruction name
     * @param  -
     * @return name of instruction
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    virtual const std::string& getName()
    {
      return m_name;
    }
 
    /**
     * @method dump
     * @brief  dumps information about instruction to outputstream
     * @param  stream  outputstream
     * @return reference to outputstream
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    virtual std::ostream& dump(std::ostream& stream)
    {
      stream << m_name;
      return stream;
    }
 
    /**
     * @method operator<<
     * @brief  Shift/output operator for outputstream
     * @param  stream  reference to outputstream
     * @param  instr   object which will be printed to stream
     * @return reference to outputstream
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    friend std::ostream& operator<<(std::ostream& stream, CInstruction& instr)
    {
      return instr.dump(stream);
    }
 
    /**
     * @method parseRegister
     * @brief  parses register syntax Rx (e.g. "R1")
     * @param  str  register in assembler syntax
     * @return registernumber
     * @globalvars none
     * @exception  std::runtime_error
     * @conditions none
     */
    virtual const unsigned parseRegister(const std::string& str);
 
    /**
     * @method checkRegister
     * @brief  performs a register boundary check
     *         does the register exist in cpu?
     * @param  cpu     pointer to cpu
     * @param  regidx  registernumber
     * @return -
     * @globalvars none
     * @exception  std::runtime_error
     * @conditions none
     */
    virtual void checkRegister(CCPU *cpu, const unsigned regidx);
 
    /**
     * @method factory
     * @brief  creates a new instance of this instruction
     * @param  -
     * @return new instruction instance
     * @globalvars none
     * @exception  none
     * @conditions none
     */
    virtual CInstruction *factory() = 0;
 
    /**
     * @method compile
     * @brief  parses instruction parameters and prepares the
     *         instruction for executing
     * @param  params  list of parameters of this instruction
     * @return -
     * @globalvars none
     * @exception  std::runtime_error
     * @conditions none
     */
    virtual void compile(std::list<std::string>& params) = 0;
 
    /**
     * @method execute
     * @brief  executes the instruction
     * @param  cpu  pointer to cpu
     * @return -
     * @globalvars none
     * @exception  std::runtime_error
     * @conditions none
     */
    virtual void execute(CCPU *cpu) = 0;
 
  protected:
    /* members */
    /** name of instruction */
    std::string m_name;
};
 
#endif
 
/* vim: set et sw=2 ts=2: */