Proteus C++ DLL's

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:Чтой-то не совсем понял - что это за такие префиксы?
Назначение префикса — модификация поведения следующей за префиксом команды.
Это байты типа DD, FD или ED и т.д.

Подробнее можешь прочитать здесь: [url=http://www.emuverse.ru/wiki/Zilog_Z80/Система_команд]Zilog Z80/Система команд[/url]

Префиксы позволяют при 8-битной шине данных иметь возможность выполнять более 256 кодов операций.
То есть: встреченный в программе префикс как бы переключает выполнение на "другую таблицу".
И процессор интерпретирует следующий байт совсем иначе, как если бы он его встретил в виде
этого же КОП-а, но без префикса...

В результате микропроцессор Z80 имеет 696 уникальных кодов операций (в отличие
от 244 кодов операций i8080).
Last edited by Lavr on 02 Dec 2012 09:43, edited 1 time in total.
iLavr
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Lavr wrote:И мы сами смотрим во все нужные таблички, читаем необходимые нам мануалы и гуглим в Интернете... нафига нам это постоянно напоминать-то?
Или ты думаешь, мы это всё сами из головы сочиняем?
Вывод 27 (М1) - активизируется при выполнении машинного цикла М1 и показывает, что проходящий машинный цикл обработки команды находится в состоянии “ввода кода операции” при выполнении некоторой команды. Сигнал М1 при выполнении двухбайтовой команды формируется при вызове каждого байта кода операции. Сигнал M1 появляется вместе с сигналом IORQ в цикле приема прерывания. Выборка инструкции требует, чтобы все три сигнала MI, MREQ и RD были активизированы.
Ну да, эти мануалы намного авторитетнее, оригиналов из далёких 80х.
Lavr wrote:И SYNC предназначен для строба STATUS, что всегда происходит только в цикле чтения КОП.
SYNC i8080 выдает в каждом машинном цикле. И подтверждение этому арбитры памяти в наших Специалистах-Орионах, использующие SYNC как сигнал необходимого обращения к памяти в следующем такте. Но именно то, что SYNC нам выдает и несет информацию, что хочет процессор: КОП (М1) или не КОП. И даже стэк или порт. Обсуждали же.
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

Сайт www . z80 . info вороде оттуда выкачивал User Manual
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:Lavr - для статьи про создание моделей в Proteus -
я нарисовал несколько классов в C++ для дерганья пинами.
В стиле pinX=true; pinY=false; Я думаю они пригодятся.
И в этом-же стиле для чтения состояния.
Есть аналогичное для 8 и 16 - бит шин.
Но к сожалению выложить это смогу только в понедельник.
Алё! :lol: Не забывай, что нам и хелпы неплохо пополнить! :wink:
Чтобы всех заинтересованных людей к проекту привлечь...

Я вобщем-то расписал уже в старте топика полностью, как DLL под Proteus создаётся, и что в ней к чему..
iLavr
User avatar
He3HauKo
Senior
Posts: 176
Joined: 09 Aug 2012 11:20
Location: 95.135.174.189

Post by He3HauKo »

А не в лень вам будет создать самую простою модель к ПРОТЭУС, к примеру инвертор(лог НЕ), и бросить сюда исходник?
Хочу стать всезнайкой ;-)
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

He3HauKo wrote:А не в лень вам будет создать самую простою модель к ПРОТЭУС, к примеру инвертор(лог НЕ), и бросить сюда исходник?
Ну тебе "в лень" что ли взять полные исходники в начале топика, подправить две строчки
и самому скомпилировать их? :o
Там инвертор в пол-пинка получается, вот их там два без задержки:

Code: Select all

Pin3->setstate(time, 1, Pin1->istate()); 
Pin4->setstate(time, 1, Pin2->istate());
И как задержку делать - я там расписал... самому же интереснее! :kruto:
Можешь инвертор, а можешь и что посложнее сделать...

Там премудрости то: "если входной Pin - в "0" - то сделаем так... а если входной Pin = "1",
то установим выходной Pin иначе...

Code: Select all

       Pin3->setstate(time, 1, SLO);
установить выходной Pin3 в "0"...

Code: Select all

       Pin4->setstate(time, 1, SHI);
установить выходной Pin4 в "1"...
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

K580BM80A

Post by Lavr »

Процесс потихонечку пошел... сделал отладочный стенд - дёргать
K580BM80A за ножки... :lol:

Image

Надо будет схему потактовой отладки приспособить. Хоть на генераторе можно
и любую низкую частоту выставить, но неудобно без статических состояний...

Похоже, удобнее будет, чтобы по фронтам и спадам С1, С2 происходила остановка.
iLavr
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

Что-то совсем занимать времени не было.
Как обещал - немного текста
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;
Обнаружил, что после выдачи информации на шину данных
читается что попало...
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:Что-то совсем занимать времени не было.
Как обещал - немного текста
...
Гуд! :kruto:
А то вон видишь выше - заказ поступил... NOT в цифровую модель запихать,
а мы всё никак "такую ерунду, как процессор" не доделаем... :lol:
aav8 wrote:Обнаружил, что после выдачи информации на шину данных
читается что попало...
Не совсем понял этот момент... может у тебя на шину данных никто не подаёт логических уровней?

Это же симуляция - емкостей шин здесь нет! :wink: Ты хотя бы pull-up резисторами притяни
шину данных к Vcc=+5V...

В отличие от реальных цифровых схем - в Протезусе "висящий вход" не определён логически.
Если у тебя включена анимация логики, как у меня - на картинке выше, то неподключенный
вход Протезус обозначит серым...

Я пока до чтения с шины не дошел. Выдаю разные сигнатуры и смотрю, как лучше реализовать
фронты и разные ситуации по реакции на входные сигналы...



PS. Ты не гонись сильно... это я такой "резвый" потому, что месяц назад, три недели
посвятил этому Протезусу в связи с моделями ламп. Сутками сидел, не вылезая из хелпов
и компьютера... Но разобрался немного... А сейчас - мы никуда особо-то не торопимся....
iLavr
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

Не совсем понял этот момент... может у тебя на шину данных никто не подаёт логических уровней?
Сообразил - надо переводить в Z-состояние.
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

По - порцу - сегодня немного удалось позаниматься.
Сделал отдельный набор функий которые занимаются
первым циклом и по набору для чтения и записи в память.
По коду операции в таблице определяю что это
это за команда.
На данный момент работают коды с 0x00 до 0x03 и их анвлоги.
Дольше я думаю пойдет быстрее (без учета времени).
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Proteus VSM for 8086

Post by Lavr »

Кстати говоря, господа из Labcenter Electronics освоили микропроцессор i8086...

Image

Обращаю наше внимание - они по своей традиции не используют внешний CLK!

Мне кажется, что это завязано на возможность пошаговой отладки.
Когда вся времянка формируется внутри модели процессора, то видимо,
просто перевести модель в пошаговый режим.
Внешнему генератору изнутри CPU DLL не скомандуешь - тормознуть! :wink:

Глядя на эту картинку вспоминается диалог из фильма "Коммандо"... :-?

Image
- Знаешь, что мне нравится больше всего?
...
- Цена!
Proteus VSM for 8086 - £295.00 :lol:

Да и на остальные продукты - цены совсем не децкие... :(
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Lavr wrote:
aav8 wrote:
Lavr wrote:MessageBox - он очень утомляет...
Это пока только для отладки самой модели.
Но люди как-то пользуются же отсылкой сообщений в окно отладки, как раз именно
для отладки самой модели под Протезусом?!...
Да у нас прямо под носом пример Debug-log окна! :o И куда я только смотрю... :oops:

В функции setup

Code: Select all

VOID MyDsimModel::setup (IINSTANCE *instance, IDSIMCKT *dsimckt)
{
  inst = instance;
  ckt = dsimckt;

//... тут привязка и инициализация пинов

// а теперь откроем Debug-log окно:
  CREATEPOPUPSTRUCT *cps = new CREATEPOPUPSTRUCT;
  cps->caption = "CPU Debug Log"; // Заголовок окна
  cps->flags = PWF_VISIBLE;       // Видимое окно
  cps->type = PWT_DEBUG;          // Тип окна - DEBUG
  cps->height = 500;              // Высота окна
  cps->width = 300;               // Ширина окна
  cps->id = 123;                  // Идентификатор окна

  dbPopup = (IDEBUGPOPUP *)instance->createpopup(cps);
// занести в хедер-файл:    IDEBUGPOPUP *dbPopup;    
}
Окно отладки сразу открывается, после чего валим в него, что хотим, вот так:

Code: Select all

 dbPopup->print("\n> Start !");
синтаксис, как у printf(...).

Image
iLavr
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

Окно отладки сразу открывается, после чего валим в него, что хотим
Тоже присобачил ISTATUSPOPUP - показывает
внутреннее состояние.
Только почемуто на F10,F11 не реагирует.
А так очень все удобно.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

А ты не пробовал юзать вот такую функцию из VSM API?

Code: Select all

data = (BYTE)databus->getbusvalue(); //--- чтение данных

По идее сразу сворачивает состояние шины данных в байт.

И я ещё реакцию на фронты заюзал:

Code: Select all

if(pinC2->isposedge())
На спады - тоже есть аналог:

Code: Select all

if(pinC2->isnegedge())
iLavr