// rev 1.03
#pragma once
#include "defmacros.h"
#include "CommonBus.h"

//input-output
struct QBUSDEV_IO
{
	uint16_t pin_ad;        //inout[15:0]   // inverted address/data bus
	bool pin_sync;      //input         // address strobe
	bool pin_din;       //input         // data input strobe
	bool pin_dout;      //input         // data output strobe
	bool pin_wtbt;      //input         // write/byte status
	bool pin_init;      //input
	bool pin_virq;      //output сигнал запроса прерывания
	bool pin_iaki;      //input сигнал разрешения прерывания
	bool pin_iako;      //output сигнал трансляции разрешения прерывания, если прерывание запрашивало не данное устройство
	//транслируется не на ОШ, а следующему устройству в цепочке.
	void clear()
	{
		memset(this, 0, sizeof(QBUSDEV_IO));
	};
};

class QBUS_Device
{
	protected:
		enum QBUSDEV_STATE : int
		{
			MPI_WAIT_SYNC_SET = 0,
			MPI_WAIT_DIN_CLR,
			MPI_WAIT_DOUT_CLR,
			MPI_WAIT_SYNC_CLR,
			MPI_WAIT_SYNC_CLR_DIN,
			MPI_WAIT_SYNC_CLR_DOUT,
			MPI_WAIT_DIN_DOUT,
		};

		CCommonBus *m_pCMNB;

		//внутренние переменные
		QBUSDEV_STATE   m_nState;       //номер состояния конечного автомата
		uint16_t            m_nAddr;        //адрес с шины МПИ
		bool            m_bAdOut_Ena;    //разрешение вывода данных на шину
		bool            m_bRplyOut_Ena;  //разрешение вывода подтверждения на шину
		bool            bAddr_OK;

		//IOPINS
		CCommonBus::CMNB_DATASET m_PIN_nAD;
		CCommonBus::CMNB_LINESET m_PIN_nRPLY;

		int             m_nRplyDelay;
		virtual void setMPI(); //присваисваем значения Mem -> MPI
		virtual void getMPI(); //присваисваем значения MPI -> Mem
		void IO_FSM();  //конечный автомат цикла ввода вывода на шине МПИ

		/* дешифрация адреса
		выход:  true - адрес принадлежит устройству
		        false - не принадлежит
		*/
		virtual bool DecodeAddr() = NULL;
		virtual bool WriteOp() = NULL; //операция производимая при операции записи
		virtual bool ReadOp() = NULL; //операция производимая при операции чтения
		virtual bool InitOp() = NULL; //операция инициализации

	public:
		QBUSDEV_IO m_IOPins;    //линии ввода-вывода памяти.

		QBUS_Device();
		virtual ~QBUS_Device();
		virtual void eval();
		virtual void RegisterDevice(CCommonBus *pCMNB);

};

