nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 23 Apr 2024 04:33



Reply to topic  [ 295 posts ]  Go to page Previous  1 ... 5, 6, 7, 8, 9, 10, 11 ... 20  Next
Proteus C++ DLL's 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
aav8 wrote:
Чтой-то не совсем понял - что это за такие префиксы?

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

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

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

В результате микропроцессор Z80 имеет 696 уникальных кодов операций (в отличие
от 244 кодов операций i8080).

_________________
iLavr


Last edited by Lavr on 02 Dec 2012 09:43, edited 1 time in total.



02 Dec 2012 09:34
Profile
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
Lavr wrote:
И мы сами смотрим во все нужные таблички, читаем необходимые нам мануалы и гуглим в Интернете... нафига нам это постоянно напоминать-то?
Или ты думаешь, мы это всё сами из головы сочиняем?
Quote:
Вывод 27 (М1) - активизируется при выполнении машинного цикла М1 и показывает, что проходящий машинный цикл обработки команды находится в состоянии “ввода кода операции” при выполнении некоторой команды. Сигнал М1 при выполнении двухбайтовой команды формируется при вызове каждого байта кода операции. Сигнал M1 появляется вместе с сигналом IORQ в цикле приема прерывания. Выборка инструкции требует, чтобы все три сигнала MI, MREQ и RD были активизированы.

Ну да, эти мануалы намного авторитетнее, оригиналов из далёких 80х.
Lavr wrote:
И SYNC предназначен для строба STATUS, что всегда происходит только в цикле чтения КОП.

SYNC i8080 выдает в каждом машинном цикле. И подтверждение этому арбитры памяти в наших Специалистах-Орионах, использующие SYNC как сигнал необходимого обращения к памяти в следующем такте. Но именно то, что SYNC нам выдает и несет информацию, что хочет процессор: КОП (М1) или не КОП. И даже стэк или порт. Обсуждали же.


02 Dec 2012 10:07
Profile
Maniac

Joined: 05 Nov 2008 19:47
Posts: 287
Location: 81.28.208.238
Reply with quote
Post 
Сайт www . z80 . info вороде оттуда выкачивал User Manual


02 Dec 2012 17:55
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
aav8 wrote:
Lavr - для статьи про создание моделей в Proteus -
я нарисовал несколько классов в C++ для дерганья пинами.
В стиле pinX=true; pinY=false; Я думаю они пригодятся.
И в этом-же стиле для чтения состояния.
Есть аналогичное для 8 и 16 - бит шин.
Но к сожалению выложить это смогу только в понедельник.

Алё! :lol: Не забывай, что нам и хелпы неплохо пополнить! :wink:
Чтобы всех заинтересованных людей к проекту привлечь...

Я вобщем-то расписал уже в старте топика полностью, как
DLL под Proteus создаётся
, и что в ней к чему..

_________________
iLavr


03 Dec 2012 01:59
Profile
Senior
User avatar

Joined: 09 Aug 2012 11:20
Posts: 176
Location: 95.135.174.189
Reply with quote
Post 
А не в лень вам будет создать самую простою модель к ПРОТЭУС, к примеру инвертор(лог НЕ), и бросить сюда исходник?

_________________
Хочу стать всезнайкой ;-)


03 Dec 2012 14:06
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
He3HauKo wrote:
А не в лень вам будет создать самую простою модель к ПРОТЭУС, к примеру инвертор(лог НЕ), и бросить сюда исходник?

Ну тебе "в лень" что ли взять полные исходники в начале топика, подправить две строчки
и самому скомпилировать их? :o
Там инвертор в пол-пинка получается, вот их там два без задержки:
Code:
Pin3->setstate(time, 1, Pin1->istate());
Pin4->setstate(time, 1, Pin2->istate());

И как задержку делать - я там расписал... самому же интереснее! :kruto:
Можешь инвертор, а можешь и что посложнее сделать...

Там премудрости то: "если входной Pin - в "0" - то сделаем так... а если входной Pin = "1",
то установим выходной Pin иначе...
Code:
       Pin3->setstate(time, 1, SLO);

установить выходной Pin3 в "0"...

Code:
       Pin4->setstate(time, 1, SHI);

установить выходной Pin4 в "1"...

_________________
iLavr


03 Dec 2012 15:02
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Процесс потихонечку пошел... сделал отладочный стенд - дёргать
K580BM80A за ножки... :lol:

Image

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

Похоже, удобнее будет, чтобы по фронтам и спадам С1, С2 происходила остановка.

_________________
iLavr


03 Dec 2012 18:19
Profile
Maniac

Joined: 05 Nov 2008 19:47
Posts: 287
Location: 81.28.208.238
Reply with quote
Post 
Что-то совсем занимать времени не было.
Как обещал - немного текста
Digital.H
Code:
/*** 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:
*** 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:
VOID x80model::simulate (ABSTIME time,DSIMMODES mode) {

  Digital::time=time;

Так подключаться к выводам
Code:
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:
  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;

Обнаружил, что после выдачи информации на шину данных
читается что попало...


03 Dec 2012 18:20
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
aav8 wrote:
Что-то совсем занимать времени не было.
Как обещал - немного текста
...

Гуд! :kruto:
А то вон видишь выше - заказ поступил... NOT в цифровую модель запихать,
а мы всё никак "такую ерунду, как процессор" не доделаем... :lol:

aav8 wrote:
Обнаружил, что после выдачи информации на шину данных
читается что попало...

Не совсем понял этот момент... может у тебя на шину данных никто не подаёт логических уровней?

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

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

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



PS. Ты не гонись сильно... это я такой "резвый" потому, что месяц назад, три недели
посвятил этому Протезусу в связи с моделями ламп. Сутками сидел, не вылезая из хелпов
и компьютера... Но разобрался немного... А сейчас - мы никуда особо-то не торопимся....

_________________
iLavr


03 Dec 2012 18:50
Profile
Maniac

Joined: 05 Nov 2008 19:47
Posts: 287
Location: 81.28.208.238
Reply with quote
Post 
Quote:
Не совсем понял этот момент... может у тебя на шину данных никто не подаёт логических уровней?

Сообразил - надо переводить в Z-состояние.


04 Dec 2012 01:39
Profile
Maniac

Joined: 05 Nov 2008 19:47
Posts: 287
Location: 81.28.208.238
Reply with quote
Post 
По - порцу - сегодня немного удалось позаниматься.
Сделал отдельный набор функий которые занимаются
первым циклом и по набору для чтения и записи в память.
По коду операции в таблице определяю что это
это за команда.
На данный момент работают коды с 0x00 до 0x03 и их анвлоги.
Дольше я думаю пойдет быстрее (без учета времени).


04 Dec 2012 08:01
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Кстати говоря, господа из Labcenter Electronics освоили микропроцессор i8086...

Image

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

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

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

Image

Quote:
- Знаешь, что мне нравится больше всего?
...
- Цена!


Proteus VSM for 8086 - £295.00 :lol:

Да и на остальные продукты - цены совсем не децкие... :(

_________________
iLavr


04 Dec 2012 13:03
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Lavr wrote:
aav8 wrote:
Lavr wrote:
MessageBox - он очень утомляет...

Это пока только для отладки самой модели.

Но люди как-то пользуются же отсылкой сообщений в окно отладки, как раз именно
для отладки самой модели под Протезусом?!...

Да у нас прямо под носом пример Debug-log окна! :o И куда я только смотрю... :oops:

В функции setup
Code:
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:
 dbPopup->print("\n> Start !");

синтаксис, как у printf(...).

Image

_________________
iLavr


04 Dec 2012 17:08
Profile
Maniac

Joined: 05 Nov 2008 19:47
Posts: 287
Location: 81.28.208.238
Reply with quote
Post 
Quote:
Окно отладки сразу открывается, после чего валим в него, что хотим

Тоже присобачил ISTATUSPOPUP - показывает
внутреннее состояние.
Только почемуто на F10,F11 не реагирует.
А так очень все удобно.


05 Dec 2012 23:33
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
А ты не пробовал юзать вот такую функцию из VSM API?
Code:
data = (BYTE)databus->getbusvalue(); //--- чтение данных

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

И я ещё реакцию на фронты заюзал:
Code:
if(pinC2->isposedge())

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

_________________
iLavr


06 Dec 2012 07:40
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 295 posts ]  Go to page Previous  1 ... 5, 6, 7, 8, 9, 10, 11 ... 20  Next

Who is online

Users browsing this forum: No registered users and 26 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.