Что-то совсем занимать времени не было.
Как обещал - немного текста
Digital.H
Code: Select all
/*** 29-11-2012 ***************** aav@lora.nsk.su [Алексеев А.В.] ***
* Для цифровых моделей. *
********************************************************************/
#ifndef _Digital_H_
/********************************************************************/
/*** 30-11-2012 ***************** aav@lora.nsk.su [Алексеев А.В.] ***
* Общий класс. *
********************************************************************/
class Digital {
public:
static ABSTIME time;
};
/*** 30-11-2012 ***************** aav@lora.nsk.su [Алексеев А.В.] ***
* Одна ножка *
********************************************************************/
class Pin : public Digital {
public:
virtual void _stdcall operator = (bool); // установить состояние
virtual _stdcall operator bool (void); // получить состояние
virtual void _stdcall operator = (IDSIMPIN*); // привязать пин
protected:
IDSIMPIN* SimPin;
};
/*** 30-11-2012 ***************** aav@lora.nsk.su [Алексеев А.В.] ***
* Шина *
********************************************************************/
class Bus : public Digital {
public:
void _stdcall Connect(IDSIMPIN** PinS,int i,IDSIMPIN* Pin) { PinS[i]=Pin; } // привязать пин
protected:
void _stdcall Set(IDSIMPIN** PinS,int n,unsigned long D);
unsigned long _stdcall Get(IDSIMPIN** PinS,int n);
void _stdcall Z(IDSIMPIN** PinS,int n);
};
/*** 30-11-2012 ***************** aav@lora.nsk.su [Алексеев А.В.] ***
* Шина 16 бит *
********************************************************************/
class Bus16 : public Bus {
public:
virtual void _stdcall operator = (unsigned short); // установить состояние
virtual _stdcall operator unsigned short (void); // получить состояние
virtual void _stdcall Z(void) { Bus::Z(SimPinS,16); } // 3 - состояние
void _stdcall Connect(int N,IDSIMPIN* Pin) { Bus::Connect(SimPinS,N,Pin); } // привязать пин
protected:
IDSIMPIN* SimPinS[16];
};
/*** 30-11-2012 ***************** aav@lora.nsk.su [Алексеев А.В.] ***
* Шина 8 бит *
********************************************************************/
class Bus8 : public Bus {
public:
virtual void _stdcall operator = (unsigned char); // установить состояние
virtual _stdcall operator unsigned char (void); // получить состояние
virtual void _stdcall Z(void) { Bus::Z(SimPinS,8); } // 3 - состояние
void _stdcall Connect(int N,IDSIMPIN* Pin) { Bus::Connect(SimPinS,N,Pin); } // привязать пин
// protected:
IDSIMPIN* SimPinS[8];
};
Digital.CPP
Code: Select all
*** 29-11-2012 ****************** aav@lora.nsk.su [Алексеев А.В.] ***
* Для цифровых моделей. *
*********************************************************************/
#include <Windows.h>
#include <vsm.HPP>
#include "Digital.H"
/********************************************************************/
ABSTIME Digital::time;
/*** 30-11-2012 ***************** aav@lora.nsk.su [Алексеев А.В.] ***
* Одна ножка *
********************************************************************/
void _stdcall Pin::operator = (bool V) { // * установить состояние ... *
if(V) SimPin->setstate(time,0,SHI);
else SimPin->setstate(time,0,SLO);
} // ************************************* ... установить состояние *
_stdcall Pin::operator bool (void) { // ***** получить состояние ... *
if(ishigh(SimPin->istate())) return true;
return false;
} // *************************************** ... получить состояние *
void _stdcall Pin::operator = (IDSIMPIN* V) { // * привязать пин ... *
SimPin=V;
} // ******************************************** ... привязать пин *
/*** 30-11-2012 ***************** aav@lora.nsk.su [Алексеев А.В.] ***
* Шина *
********************************************************************/
void _stdcall Bus::Set(IDSIMPIN** PinS,int n,unsigned long D) { // * установить данные ... *
int i;
unsigned long v=D;
for(i=0;i < n;i++) {
if(v & 1) PinS[i]->setstate(time,0,SHI);
else PinS[i]->setstate(time,0,SLO);
v=v>>1; // след. бит
}
} // **************************************** ... установить данные *
unsigned long _stdcall Bus::Get(IDSIMPIN** PinS,int n) { // * получить данные ... *
int i;
unsigned long v=0;
int Bit;
for(i=n-1;i >= 0;i--) {
v=v << 1; // место для след. бит
Bit=0; if(ishigh(PinS[i]->istate())) Bit=1;
v|=Bit;
}
return v;
} // ****************************************** ... получить данные *
void _stdcall Bus::Z(IDSIMPIN** PinS,int n) { // * 3 - состояние ... *
int i;
unsigned long v=0;
int Bit;
for(i=0;i < n;i++) {
if(v & 1) PinS[i]->setstate(time,0,FLT);
}
} // ****************************************** ... 3- состояние *
/*** 30-11-2012 ***************** aav@lora.nsk.su [Алексеев А.В.] ***
* Шина 16 бит *
********************************************************************/
void _stdcall Bus16::operator = (unsigned short V) { // * установить состояние ... *
Set(SimPinS,16,V);
} // ************************************* ... установить состояние *
_stdcall Bus16::operator unsigned short (void) { // ***** получить состояние ... *
return (unsigned short)Get(SimPinS,16);
} // *************************************** ... получить состояние *
/*** 30-11-2012 ***************** aav@lora.nsk.su [Алексеев А.В.] ***
* Шина 8 бит *
********************************************************************/
void _stdcall Bus8::operator = (unsigned char V) { // * установить состояние ... *
Set(SimPinS,8,V);
} // ************************************* ... установить состояние *
_stdcall Bus8::operator unsigned char (void) { // ***** получить состояние ... *
return (unsigned char)Get(SimPinS,8);
} // *************************************** ... получить состояние *
В начале симуляции вставить такую строчку
Code: Select all
VOID x80model::simulate (ABSTIME time,DSIMMODES mode) {
Digital::time=time;
Так подключаться к выводам
Code: Select all
VOID x80model::setup(IINSTANCE* inst, IDSIMCKT* dsimckt) {
instance = inst;
ckt = dsimckt;
{ // *** Подключение к выводам ... ********************************
pinReset=instance->getdsimpin("$RESET$",true); // сброс
pinCLK =instance->getdsimpin("CLK", true); // тактирование
pinRD =instance->getdsimpin("$RD$", true); // чтение
pinWR =instance->getdsimpin("$WR$", true); // запись
pinM1 =instance->getdsimpin("$M1$", true); // M1
pinMREQ =instance->getdsimpin("$MREQ$", true); // обращение к памяти
А вот так можно использовать:
Code: Select all
bool CLK=pinCLK; // состояние CLK
busAddr=PC=0;
pinMREQ=true;
pinRD =true;
pinWR =true;
pinM1 =true;
pinRFSH=true;
Cmd=busData; // код команды с ШД
pinRD =true;
pinM1 =true;
pinRFSH=false;
Обнаружил, что после выдачи информации на шину данных
читается что попало...