|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Да вот и нам как-то твой паскаль без надобности... хотя - спасибо за исходники,
может быть кому и пригодятся...
Хотя я сам предпочитаю делать конкретный проект заново, а не ковыряться в
устаревшей " пасквилятине".
Все предпочитают воплощать свои идеи, а не копошиться в потёмках чужих...
_________________ iLavr
|
28 Nov 2012 07:48 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Значит что я конкретно по проекту сейчас предполагаю: вот такие конструкции
для выводов сделать индексными:
чтобы в цикле операцией сдвига получать байт кода операции и байты данных. Адреса также выставлять по ножкам в цикле используя сдвиг. Внешние запросы слушать вот здесь: | | | | Code: VOID FFDEVICE::simulate (ABSTIME time, DSIMMODES mode) { //--- заставим нашу модель читать состояние её входных линий (istate()), //--- и отображать реакцию на него в симуляции: Pin3->setstate(time, 1, Pin1->istate()); Pin4->setstate(time, 1, Pin2->istate()); //--- мы читаем значения состояния входов Pin1 и Pin2, и через 1 "тик" часов //---(1 пикосекунда) относительно текущего времени (time) мы устанавливаем //--- это же состояние на соответствующих выходах Pin3 и Pin4. //--- в действительности таких быстрых устройства просто нет, так, что необходимо //--- назначать большие значения задержек. Ещё лучшее, если величины задержек //--- назначаются через константу. И ещё лучше, если они передаются в программу //--- как параметры модели. } | | | | |
Реагировать на все события согласно точным временным интервалам примерно вот так: | | | | Code: ckt->setcallback(100000000, this, 0x25); //--- для этого назначим, что через 1 секунду (время, измеряется в пикосекундах) //--- после того, как прозойдёт пуск будет вызвана функция возврата (callback) //--- с кодом события (event) 0x25. //--- реакцию на событие с кодом 0x25 добавим в FFDEVICE::callback (time, eventid) //--- в виде: if (eventid == 0x25){ ... };
VOID FFDEVICE::callback (ABSTIME time, EVENTID eventid) { if(eventid == 0x25) { if(ishigh(Pin3->istate())) { Pin3->setstate(time, 1, SLO); Pin4->setstate(time, 1, SHI); } else { Pin3->setstate(time, 1, SHI); Pin4->setstate(time, 1, SLO); //----- если наш случай вызван, мы изменяем состояние выхода на противоположное, //----- и запускаем таймер снова на 1 секунду, после чего снова будет вызвана //----- функция возврата (callback). } ckt->setcallback(time + 100000000, this, 0x25); } | | | | |
Это только работающие прикидки из чужой модели...
И я ещё планирую посмотреть, как реализовали свою модель Z80 авторы CEDAR Logic Simulator.
Источник
Я хотя и скачал их исходники:
http://cedarlogic.svn.sourceforge.net/viewvc/cedarlogic/trunk/Z80/
но почитать, как я тут обещал, времени так и не нашел...
А принцип у них тот-же... симуляция логических состояних выходов при малых шагах по времени.
И последнее: если ты беспокоишься, что этого размера времени нам не хватит
" тип для времени определен как _int64", то симуляторы реально поступают так:
пишут результаты расчета в файловый буфер, а когда буфер переполнен, выводят запрос:
" Очистить буфер и продолжить расчет? или закончить расчет?"
Если " Очистить...", то последние значения принимаются за начальные условия, время обнуляется
и длинный цикл начинается сначала.
PS. Потихоньку подобрался к компиляции библиотеки и созданию графической модели i8080 из Z80...
_________________ iLavr
|
28 Nov 2012 08:14 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Я примерно так сделал: описание: подключение: | | | | Code: { // *** Подключение к выводам ... ********************************
pinCLK=instance->getdsimpin("CLK",true); // тактирование
char s[100]; int i;
for(i=0;i<8;i++) { // ******************* связать с данными ... * wsprintf(s,"D%lu",i); pinData[i] = instance->getdsimpin(s,true); } // *********************************** ... связать с данными *
for(i=0;i<16;i++) { // ***************** связать с адресами ... * wsprintf(s,"A%lu",i); pinAddr[i] = instance->getdsimpin(s,true); } // ********************************** ... связать с адресами *
pinReset=instance->getdsimpin("$RESET$",true); // Reset pinM1 =instance->getdsimpin("$M1$", true); // M1 pinBusRq=instance->getdsimpin("$BUSRQ$",true); // BUSQ
} // *** ... Подключение к выводам ********************************
| | | | |
установка:
Я думаю достаточно будет привязаться просто к CLK или внутреннему генератору модели - все равно внутри все происходит синхронно.
|
28 Nov 2012 18:26 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Приятно, что похоже мыслим в одном направлении... Ну у меня дальше план такой: получаем в цикле, вот как ты нарисовал, КОП, и, по аналогии с имеющимися эмуляторами, находим подпрограмму его реализации. И вот здесь придётся вместо привычных действий реализовать " дрыгание ножками" по характерным диаграммам. Ничего не поделаешь - трудоёмко... У меня ещё как назло книжка Z80 CPU с таймингами куда-то делась... Надо скачать - где-то на форуме была ссылка. Я думал вот так: получив вызов изменения значения на выводе - мы смотрим, что надо сделать и задаём характерную задержку по фронту или спаду TimeDelay (ну там что-то 15нс ... 25нс)
И когда она отработает - то вызовет нас в callback-функцию, где мы начинаем
выполнение...
Поправь меня, если что-то я задумал не так...
PS. Закончил про компиляцию графической модели в библиотеку Proteus...
_________________ iLavr
|
29 Nov 2012 14:56 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Примерно такие мысли:
Определяем, что CLK изменился и вызываем собственно
процессор, с текущим состоянием CLK.
Процессор у себя внутри помнит в каком он состоянии
и чегой-то делает.
В самом процессоре есть таблица 256*20. В таблице хранятся
адреса функций для каждой команды и каждого такта.
А проц. чисто тупо перебирает эту таблицу, и вызывает
функции, обеспечивающие каждый такт.
Плюсы такого подхода:
- все наглядно
- при необходимости все это легко подправить/изменить.
- если таблицу сделать трехмерной, модель будет поддерживать и
все остальные подобные процессоры (i8080,8085 ...)
Минусы:
- большой объем и много писанины ~20кБ на проц.
- не совсем точная модель - события привязаны к тикам, хотя
для дерганья ножками можно указать задержку.
Насчет callback - ов я тоже сначала думал, но в этом деле
думаю очень просто заблудиться.
УРА! - нашел User Manual на Z80 family
|
29 Nov 2012 18:27 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Подумаю... с разбегу не осознал плюсы и минусы...Кинь ссылочку... я Z80 CPU - так и не нашел пока...
И два вопроса принципиальных:
Если делаем Z80, - будем реализовывать регенерацию ОЗУ по адресной шине?
Если делаем i8080, - как будем учитывать, что C1 и C2 амплитудой 12В ?
А также, что у процессора три питания?
Для схемотехники устройств - это важно в принципе, а уж если вспомнить о разводке
плат, то просто безусловно...
Или ограничимся недо- Z80 и недо- i8080 с некоторыми условностями?
И я пока ничего не нашел по передаче параметров в модель из текстового скрипта...
Тебе попалось что-нибуть в VSM SDK на этот повод?
_________________ iLavr
|
30 Nov 2012 04:08 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
!! практически заработало !!
Сейчас ест-но NOP, и еще какаято команда с кодом 0x01
Для этой команды подобие микрокода тоже самое что и для NOP
Тайминги чисто тупо переписывал из мануала - одну ножку ноль
другую в 1...
Показать к сожалению не могу - все осталось на работе - иногда
удается позанимать этой штукой.
Начал вписывать в таблицу кое-какие команды - и столкнулся
с проблемой - что у Z80 есть 2-х байтовые команды...
Только в понедельник - все там... Я думаю с этим никаких проблем не встанет У нас цифровая модель - поэтому можно подавать любое напряжение больше, наверное 0В.
Не совсем понятно.
*****************************************
Теперь у меня вопросы/ответы:
В какой момент увеличивать/увеличивается счетчк косанд?
- я думаю в первом такте первого цикла.
Проверка прерываний происходит тамже или где-то
в последнем такте команды?
Захват шины (ПДП) - явление синхронное или несинхронное?
- наверное синхронное, но возможно в любом цикле или такте.
*****************************************
Чиркните несколько строчек кода на ассеблере
для i8080 которым можно будет протестировать хотя-бы
часть команд.
|
30 Nov 2012 05:11 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
И 3-х байтовые - тоже есть... Сразу после выдачи адреса на шину... Это точно написано в мануале, для z80 - я просто не помню... Асинхронное, но через регистры привязывают к Ф2, а вот когда точно проверяют - на диаграмме в описании обычно показывают...
А как ты будешь убеждаться, что они правильно работают?
В принципе - могу выложить asm-программу, где есть все команды i8080, я использовал
её как тест ядра эмулятора...
Тебе в asm-виде или сразу в bin?
Кладу в бинарнике: TEST8080.BIN
Там программы нет как таковой, коды нарастают от 0 до 255, учтены неопубликованные.
В 2-х и 3-байтных командах 2-й и 3-й байты = 00Н.
На asm это вот что:
| | | | Code: NOP LXI B,0000H STAX B INX B INR B DCR B MVI B,00H RLC NOP DAD B LDAX B DCX B INR C DCR C MVI C,00H RRC NOP LXI D,0000H STAX D INX D INR D DCR D MVI D,00H RAL NOP DAD D LDAX D DCX D INR E DCR E MVI E,00H RAR NOP LXI H,0000H SHLD 0000H INX H INR H DCR H MVI H,00H DAA NOP DAD H LHLD 0000H DCX H INR L DCR L MVI L,00H CMA NOP LXI SP,0000H STA 0000H INX SP INR M DCR M MVI M,00H STC NOP DAD SP LDA 0000H DCX SP INR A DCR A MVI A,00H CMC MOV B,B MOV B,C MOV B,D MOV B,E MOV B,H MOV B,L MOV B,M MOV B,A MOV C,B MOV C,C MOV C,D MOV C,E MOV C,H MOV C,L MOV C,M MOV C,A MOV D,B MOV D,C MOV D,D MOV D,E MOV D,H MOV D,L MOV D,M MOV D,A MOV E,B MOV E,C MOV E,D MOV E,E MOV E,H MOV E,L MOV E,M MOV E,A MOV H,B MOV H,C MOV H,D MOV H,E MOV H,H MOV H,L MOV H,M MOV H,A MOV L,B MOV L,C MOV L,D MOV L,E MOV L,H MOV L,L MOV L,M MOV L,A MOV M,B MOV M,C MOV M,D MOV M,E MOV M,H MOV M,L HLT MOV M,A MOV A,B MOV A,C MOV A,D MOV A,E MOV A,H MOV A,L MOV A,M MOV A,A ADD B ADD C ADD D ADD E ADD H ADD L ADD M ADD A ADC B ADC C ADC D ADC E ADC H ADC L ADC M ADC A SUB B SUB C SUB D SUB E SUB H SUB L SUB M SUB A SBB B SBB C SBB D SBB E SBB H SBB L SBB M SBB A ANA B ANA C ANA D ANA E ANA H ANA L ANA M ANA A XRA B XRA C XRA D XRA E XRA H XRA L XRA M XRA A ORA B ORA C ORA D ORA E ORA H ORA L ORA M ORA A CMP B CMP C CMP D CMP E CMP H CMP L CMP M CMP A RNZ POP B JNZ 0000H JMP 0000H CNZ 0000H PUSH B ADI 00H RST 0 RZ RET JZ 0000H JMP 0EE11H CZ 0000H CALL 0AA55H ACI 00H RST 1 RNC POP D JNC 0000H OUT 00H CNC 0000H PUSH D SUI 00H RST 2 RC RET JC 0000H IN 00H CC 0000H CALL 0BB44H SBI 00H RST 3 RPO POP H JPO 0000H XTHL CPO 0000H PUSH H ANI 00H RST 4 RPE PCHL JPE 0000H XCHG CPE 0000H CALL 0CC33H XRI 00H RST 5 RP POP PSW JP 0000H DI CP 0000H PUSH PSW ORI 00H RST 6 RM SPHL JM 0000H EI CM 0000H CALL 0DD22H CPI 00H RST 7 | | | | |
PS. Кое-где нули во 2-м и 3-м байтах я заменял, оказывется, в тестовых целях... Это не ошибки.
_________________ iLavr
|
30 Nov 2012 05:23 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Может я тебе закину куда-нибуть дистрибутив VC++ 5.0?
Он маленький - всего 83 Метра, но к нашей задаче подходит...
Я вот на работе практически не имею времени позаниматься нашей затеей,
поэтому поставил VC++ 5.0 дома.
Только скажи - куда закинуть, а то я не пользовался всякими " рапидшарами"...
_________________ iLavr
|
30 Nov 2012 06:18 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Это уже интересней... Ну я думаю в последнем такте части команды подменять код на что-то больше 256 и проходить таблицу еше раз. А потом еще раз... Таблица уже будет примерно на 270 строк. И туда-же всунуть обработку прерываний. Подойдет
Пока не знаю. Надо реализовать все команды хотя-бы i8080
а потом попробовать напустить на все это дело тест, про который
говорилось в соседней теме.
|
30 Nov 2012 06:27 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Lavr - для статьи про создание моделей в Proteus -
я нарисовал несколько классов в C++ для дерганья пинами.
В стиле pinX=true; pinY=false; Я думаю они пригодятся.
И в этом-же стиле для чтения состояния.
Есть аналогичное для 8 и 16 - бит шин.
Но к сожалению выложить это смогу только в понедельник.
|
30 Nov 2012 08:14 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я тебе под " все команды i8080" приготовил достойный корпусок!
Файл проекта
Библиотека теперь будет: RU_CPU
Файлы из папки LIBRARY проекта - положить в папку LIBRARY Proteus.
Из папки SAMPLES переложить проект K580BM80 в SAMPLES Proteus.
И она сразу в Proteus объявится...
Выводы питания +12В, и -5В - ввёл, но временно обозначил неактивными...
Тактовые сигналы С1, С2 поэтому будем временно признавать - амплитуды ТТЛ.
Ну а когда решим точно - там исправить недолго...
Файл динамической библиотеки - по умолчанию там: K580BM80.DLL, ( символы все латиница!)
если захочешь поменять название - ну ты знаешь, как это делается...
Модель с корпусом, хелпом и всеми необходимыми прибамбасами... как говорит Хардыч, -
" с блэкджэком и феньками..."
Вот заодно и проверим, - не напортачил ли я где чего... но проверял довольно тщательно...
PS. Да, вот ещё - я ввел задержки распространения - как параметр. Их можно будет менять извне. Если щёлкнешь по выделенной модели - ты их увидишь: по 30nS - так справочник обещает... Но вот пока не раскопал, как передать значение параметра внутрь модели. Ну я уже говорил это ранее здесь...
_________________ iLavr
Last edited by Lavr on 30 Nov 2012 09:26, edited 2 times in total.
|
30 Nov 2012 08:54 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ага - это хорошо! Кстати, я так подгадал там в начале топика - твой пост второй,
и если есть настроение, - можешь в начале своего поста листинги выложить...
Я немного тормознулся - всё-же хочу сделать задержки через callback-функцию,
т.к. самим считать не надо, она - сама отрабатывает задержку.
Я заодно сделал перевод хелпа по используемым при создании модели функциям.
Чтобы прокомментировать свои исходники...
Я хочу, чтобы у кого есть желание - тоже могли подключится к созданию моделей.
Сложного-то ничего нет, а вот в хелпах копаться муторно...
Но раз уж я прокопался - постараюсь расписать процесс популярно для всех.
PS. Ну и я не очень быстрый писатель на С++... так - любитель...
_________________ iLavr
|
30 Nov 2012 09:03 |
|
|
aav8
Maniac
Joined: 05 Nov 2008 19:47 Posts: 287 Location: 81.28.208.238
|
Круто - и очень здорово.
У меня DLL называется x80.DLL - в том смысле, что должна подойти
для похожих процов. Конкретный тип вроде передается
в DLL и на основе этого устанавливает внутренние флаги и
подключение к выводам.
В идеале должно работать как Z80 и можно добавить как
один из режимов i8085 (если кого-то будет интересовать).
В случае i8080 непонятные команды исполняются как NOP.
До задержек и прочего - на будующее.
Я прикидываю, что почти неделя уйдет на вбивание
тайминга команд. Буду пока все делать внутри корпуса Z80,
но система команд от i8080 - на данном этапе оно проще.
Для начального тестирования думаю нарисовать
схемку с двумя портами (вход/выход), 8 кнопок и столькоже
светодиодов, 2764 и чегой-то пробовать.
***************
Относительно i8080 -
Придется обрабатывать оба тактовых сигнала - по Ф1 начинается
машинный такт.
Блин а него-же еще и SYNС...
***************
.. чтой-то мне уже захотелось еще и модель 589ИК и 580ВВ51...
|
30 Nov 2012 09:55 |
|
|
HardWareMan
Banned
Joined: 20 Mar 2005 13:41 Posts: 2141 Location: От туда
|
По непонятным командам ВМ80 я тут таблицу сводил уже. Так как никто тут не собирается рисовать печатку в протеусе, можно сократить Ф1 оставив только Ф2. Или как вариант вживление ГФ24 в модель ВМ80 (по типовой схеме и с/без делителя на 9).
|
30 Nov 2012 10:13 |
|
|
Who is online |
Users browsing this forum: No registered users and 16 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
|
|