Proteus C++ DLL's

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

Moderator: Shaos

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

Post by Lavr »

Lavr wrote:И, кстати говоря,...
HardWareMan wrote:SYNC i8080 выдает в каждом машинном цикле.
Ты своё памятное слово из трёх букв назад себе возьмёшь, или как?
Учитель танкистов... :wink:
Я прочитал, только то что написано, вместе со словом из трёх букв...
Видимо, торопясь написать это слово, ты в свои книжечки про
исключения из правил не посмотрел... :wink:
И попал пальцем в небо... :lol: Ладно, торопливый ты наш похабник...
HardWareMan wrote:Действительно. Команда DAD во время М2 и М3 шину не дергает.
Image
И, похоже, не только DAD.

А в какие ещё команды, кроме DAD, "во время М2 и М3 шину не дергают"?
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:Что-то не совсем понимаю в татировании 8080
между спадом Ф2 фронтом Ф1 есть пауза или нет? Когда первый
раз увидел такие диаграммы (Радио за 80-ый год) - там такт
был поделен на четыре части - первая четверть Ф1, потом 2
части - Ф2 и потом все одыхают.
Типовая диаграмма вот такая:

Image

Минимальная пауза даже по справочным данным может быть = 0.

Да - диаграмму из "Радио" мы здесь на форуме тоже привели:

Image

Хотя реальный ГФ24 паузу между Ф1 и Ф2 действительно вставляет...



Я немного озадачился по поводу сигнала RESET.
В оригиналах моделей Протезуса обычно реагируют просто на его наличие.

По справочным данным - у него есть минимальная длительность в тактах.
Мне кажется, при старте нашей модели эту минимальную длительность
надо отработать просто обязательно - не зависимо от уровня на самом входе RESET.

И второй вопрос: если в схеме так получается, что RESET установлен активным
постоянно - что должна делать наша модель в этом случае?
Тактовые сигналы Ф1 и Ф2 при этом ведь в модель поступают! :wink:
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

2 aav8: тут оффтоп подзавалил, про такты - я на предыдущей странице ответил.
aav8 wrote:И похожий вопрос про условные переходы - читаются - ли
байты адреса перехода? - я думаю в модели их можно будет
просто проскочить.
Этот вопрос не совсем понял... :oops:
Если ты про Jxx ADDR - то да ADDR_lo и ADDR_hi - должны по шине данных заскочить в WZ.
Конечно, если ты именно это имел в виду...
iLavr
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

Да - диаграмму из "Радио" мы здесь на форуме тоже привели
Отличная диаграмка - журнал к сожалению не
нашел - наверное на даче.
Сразу вопросик - SYNC и выдача слова состояния по времени
совпадают - передний фронт SYNC с данными, и аналогично
задний. У меня при аналогичной тактировки не захотелось писаться
в ОЗУ - Я поднимал WR в высокое состояние, и одновременно
ШД переключал в 3-е состояние. Сейчас сделал вот-так:

Code: Select all

/*** 04-12-2012 ****************** aav@lora.nsk.su [Алексеев А.В.] ***
 * Цикл записи                                                       *
 *********************************************************************/

void _stdcall mWrite3(bool F1,bool F2,x80* o) { // ****** такт 3 ... *
  if(F1) {
  } else {
	o->pinMREQ=true;
	o->pinWR  =true;
	o->tNxt=tNxtT;
  }
}  // *************************************************** ... такт 3 *
void _stdcall mWrite2(bool F1,bool F2,x80* o) { // ****** такт 2 ... *
  if(F1) {
  } else {
	o->pinWR=false;
	o->tNxt=mWrite3;
  }
} // **************************************************** ... такт 2 *
void _stdcall mWrite1(bool F1,bool F2,x80* o) { // ****** такт 1 ... *
  if(F1) {
    o->tNxt=mWrite1;
  } else {
	o->pinMREQ=false;
	o->busData=Data;
	o->tNxt=mWrite2;
  }
} // **************************************************** ... твкт 1 *
void _stdcall mWrite(bool F1,bool F2,x80* o,unsigned short A,unsigned char D,tagTx T) { // * запись ... *
  o->busAddr=A;
  Data=D;
  tNxtT=T;
  mWrite1(F1,F2,o);
//sh(o,"mWrite");
} // **************************************************** ... запись *

Я немного озадачился по поводу сигнала RESET.
В оригиналах моделей Протезуса обычно реагируют просто на его наличие.

По справочным данным - у него есть минимальная длительность в тактах.
Мне кажется, при старте нашей модели эту минимальную длительность
надо отработать просто обязательно - не зависимо от уровня на самом входе RESET.

И второй вопрос: если в схеме так получается, что RESET установлен активным
постоянно - что должна делать наша модель в этом случае?
Тактовые сигналы Ф1 и Ф2 при этом ведь в модель поступают!
Сейчас примерно так:

Code: Select all

/*** 27-11-2012 ***************** aav@lora.nsk.su [Алексеев А.В.] ***
 * Симуляция                                                        *
 ********************************************************************/

VOID x80model::simulate (ABSTIME time,DSIMMODES mode) {

  Digital::time=time;

  if(!time) { // **************************** запуск симулятора ... *
	Reset();
	oldCLK=false;
	return;
  } // ************************************** ... запуск симулятора *

  if(!pinReset) Reset(); // сброс

  bool CLK=pinCLK;           // состояние CLK
  if(CLK == oldCLK) return;  // CLK не изменился
  oldCLK=CLK;
    
  Exec(CLK,0);

}
Т.е. если Reset активен - все остальное игнорируется.
А сама модель обрабатывает его вот так:

Code: Select all

/*** 28-11-2012 ***************** aav@lora.nsk.su [Алексеев А.В.] ***
 * Сброс                                                            *
 ********************************************************************/

unsigned long _stdcall x80::Reset(void) {

  tNxt=m1t1; // первый такт первый цикл

  busAddr=PC=0;
  busData.Z();

  pinMREQ=true;
  pinRD  =true;
  pinWR  =true;
  pinM1  =true;
  pinRFSH=true;

  return 0;

}
По поводу минимальной длительности - надо будет подумать.
Этот вопрос не совсем понял...
Если ты про Jxx ADDR - то да ADDR_lo и ADDR_hi - должны по шине данных заскочить в WZ.
Конечно, если ты именно это имел в виду...
Да - именно это имел в виду - буду читать все байты, а потом
принимать решение.
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

Ну вот - модель в первом приближении работает.
Надо к ней как-то подключить 8250 и запустить тест.
В и-нете пока нашел только как ее программировать
а про подключение - что-то глухо.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:Сразу вопросик - SYNC и выдача слова состояния по времени
совпадают - передний фронт SYNC с данными, и аналогично
задний. У меня при аналогичной тактировки не захотелось писаться
в ОЗУ - Я поднимал WR в высокое состояние, и одновременно
ШД переключал в 3-е состояние.
Посмотри вот эту диаграмку - на ней задержки учтены и хорошо виден интересующий
тебя процесс, как мне кажется...

Image
aav8 wrote:
Lavr wrote:Я немного озадачился по поводу сигнала RESET.
В оригиналах моделей Протезуса обычно реагируют просто на его наличие.

По справочным данным - у него есть минимальная длительность в тактах.
Мне кажется, при старте нашей модели эту минимальную длительность
надо отработать просто обязательно - не зависимо от уровня на самом входе RESET.

И второй вопрос: если в схеме так получается, что RESET установлен активным
постоянно - что должна делать наша модель в этом случае?
Тактовые сигналы Ф1 и Ф2 при этом ведь в модель поступают!
Т.е. если Reset активен - все остальное игнорируется.
По поводу минимальной длительности - надо будет подумать.
По всем справочным данным:
Сигнал Reset (Сброс) должен длиться не менее трёх периодов тактовой частоты.
Я предлагаю при старте модели его по умолчанию отрабатывать, потому как
задающую RC-цепь Сброса в Протеусе не ставят обычно, поэтому при старте
модели или при любом Сбросе надо хотя бы эти три такта точно отработать,
а для этого модель должна "слушать" Ф1 и Ф2 - вот я о чём.

Если длительность Reset задана извне нормально, то надо его отслеживать,
а как он закончился - начинать работу модели чётко с ближайшего фронта Ф1.
Это таже причина, по которой надо "слушать" Ф1 и Ф2 во время Reset.

Я Ф1 и Ф2 немного иначе, похоже, "слушаю", чем ты...

Code: Select all

  if(pinC1->isposedge())  //--- если фронт сигнала на выводе C1
    {
     dbPopup->print("\n> Front C1");
...
     return;
    }
//   else //------------------- если спад сигнала на выводе C1:
  if(pinC1->isnegedge())
    {
     dbPopup->print("\n> Spad_ C1");
...
     return;
    }

  if(pinC2->isposedge())  //--- если фронт сигнала на выводе C2
    {
     dbPopup->print("\n> Front C2");
...
     return;
    }
//   else //------------------- если спад сигнала на выводе C2:
  if(pinC2->isnegedge())
    {
     dbPopup->print("\n> Spad_ C2");
...
     return;
    }
Потому что по всем мануалам всё привязано к фронтам и спадам - по этим "точкам"
приявязывается анализ остальных сигналов.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:Надо к ней как-то подключить 8250 и запустить тест.
В и-нете пока нашел только как ее программировать
а про подключение - что-то глухо.
Вот тебе пример подключения более продвинутого аналога 8250 - 16550:

Image

Соответствие с 8250 у них следующее:

Image

Ну и вроде как оригинальная 8250 именно так и включается:

Image

По программированию - ты сказал - материал у тебя есть. Да и я взглянул -
в Инете его много...



PS. Я не знаю - работает ли у тебя прерывание, но 8250 можно обслуживать
и по опросу, я так делал...
iLavr
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

Если длительность Reset задана извне нормально, то надо его отслеживать,
а как он закончился - начинать работу модели чётко с ближайшего фронта Ф1
Вот это конечно не учел, да и сброс пока не подключал -
проц сбрасывается при старте симуляции.
Quote:
Сигнал Reset (Сброс) должен длиться не менее трёх периодов тактовой частоты.
То, что ДОЛЖЕН длиться для надежжного сброса проца.
Если он длится меньше - сброс может быть не полный.
В модели можно все сбросить за 0 пикосекунд - поэтому не вижу
необходимости считать эти 3 такта.
Вот тебе пример подключения более продвинутого аналога 8250 - 16550:
Спасибо за схемку. Как раз именно то-что нужно.
В протеусе есть модель 8250A - я думаю практически все
должно подойти.
Прерывания пока не обрабатываются.
И пока нет ввода/вывода.
Буду рисовать схему...
PS:
А в диаграмке обнаружил отключение ША. А уменя она всегда
включена...
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:
Сигнал Reset (Сброс) должен длиться не менее трёх периодов тактовой частоты.
То, что ДОЛЖЕН длиться для надежжного сброса проца.
Если он длится меньше - сброс может быть не полный.
В модели можно все сбросить за 0 пикосекунд - поэтому не вижу
необходимости считать эти 3 такта.
Мне всё же хочется придержаться правильных времянок, фронтов и др. мелочей.
Раз уж мы учли, что работаем от внешней синхронизации...

Я привёл тут страницу назад пример i8086 от Labcenter - у них опять все растактовки внутри.
Я так понимаю, это проще - у них процессор "ведущий" для всей схемы.
А у нас - "ведомый" внешним генератором...
Но ты меня "уговорил" на это, т.к. без этого трудно смоделировать "Специалисты" и "Спектрумы"... :wink:
aav8 wrote:Прерывания пока не обрабатываются.
И пока нет ввода/вывода.
Ну лучше введи один вектор по типу RST_N. Это не трудно, мне кажется,
а по опросу - довольно нудно программировать... :-?
А нет ввода/вывода - ну мы в "Специалисте" привыкли делать всё через LDA/STA
и другие операции с памятью... :wink:
aav8 wrote:А в диаграмке обнаружил отключение ША. А уменя она всегда
включена...
Не - во всех справочниках точно указано, когда она выключается...

Я поседею наверно, читая эти справочники! Ну такие древние процессоры,
а в справочниках - разнобой бывает... :(

Но бывают и очень интересные вещи! Я никогда ранее не видел вот такой подробной
"блок-схемы" нашего процессора-прадедушки! :o

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

Post by aav8 »

Сумел все-таки подключить 8250 - информация довольно
запутанная - в одном месте тактовая частота указана
1.19Мгц, в другом 1.8 с копейками, а делители одинаковые
для одинаковых скоростей. Да еще повозился с подключением
к шине отдельных проводников.
По поводу отладки - функция модели runctrl принимает
параметр RUNMODES - режим работы - в случае
значения suspend я устанавливаю внутренний флаг
отладки, и в начале первого машинного цикла
вызыаю функцию suspend протеуса - получается пошаговая
отладка - видны все регистры и все такое.
Так-же такой вызов вставил в HLT.
После подключения 8250 - у нее есть внутренняя трассировка -
нашлись кое - какие косяки. Но эхо заработало.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:Сумел все-таки подключить 8250 - информация довольно
запутанная - в одном месте тактовая частота указана
1.19Мгц, в другом 1.8 с копейками, а делители одинаковые
для одинаковых скоростей.
1.19Мгц - это, наверное, CLK задействовали как задающий...

Впрочем, даже если и "1.8 с копейками" то при делении до рабочей частоты,
и с учётом асинхронного характера обмена, ошибка не будет слишком большой
на длине кадра передачи, как мне кажется...
iLavr
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

Ну вот, наконец добрался до тестов.
Сообразил как это дело скомпилить.
Вылетает на DAA - ну я ее и не реализовывал.
И сдвиги - в User Manual что-то не все понятно - в одном
месте стрелок нет, а в другом смотрят друг на друга.
Буду читать в другом месте.
И с 8250 пришлось повозиться - двоила символы,
пришлось строборовать запись тактированием.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

aav8 wrote:И сдвиги - в User Manual что-то не все понятно - в одном
месте стрелок нет, а в другом смотрят друг на друга.
Какие сдвиги-то? RAL, RAR, RRC, RRC что ли?
Или я не понял вопроса?
iLavr
aav8
Maniac
Posts: 287
Joined: 05 Nov 2008 19:47
Location: 81.28.208.238

Post by aav8 »

Какие сдвиги-то? RAL, RAR, RRC, RRC что ли?
Да, они.
И вопросик - у меня не проходит такой тест:

Code: Select all

 STC
 MVI A,042h
 RLC
 CC  err      
 RLC
 CNC err
 CPI 0009h    ;? 1
 CNZ err      ;? 2
 RRC
 CNC err
 RRC
 CPI 042h
 CNZ err
В строке, помеченной "? 1" у меня получается 00Ah
Если сравнивать с 00Ah - сбрасывается CY
и не проходять стоки после стоки "? 2"
При старте тестс выдает информацию:
MICROCOSM ASSOCIATES 8080/8085 CPU DIAGNOSTIC VERSION 1.0 (C) 1980
b2m
Devil
Posts: 905
Joined: 26 May 2003 06:57

Post by b2m »

aav8 wrote:В строке, помеченной "? 1" у меня получается 00Ah
0100 0010 CY=1
RLC
1000 0100 CY=0
RLC
0000 1001 CY=1

0100 0010 CY=1
RAL
1000 0101 CY=0
RAL
0000 1010 CY=1

Ты ничего не напутал? :)
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/