Z80 Cpu Simulator For Proteus
Я страстный любитель того, что может приносить пользу, а так же свято верю, что развитие людей зависит от того на сколько мы друг с другом делимся.
Вот как-то я столкнулся с PROTEUS'ом… И вроде так классно, симуляторы внутри всякие… А ткнёшься сделать что-то нужное, то деньгу плати, причём заоблачную, то просто нет того, что надо. Я, конечно, понимаю, что большинство уж давно ушли от Z80, но всё же он остался.
Очень часто я видел, что люди постоянно интересуются где можно взять модель Z80, и вообще как её сделать. Вот так и я искал-искал, плюнул и решил написать сам. Оказалось всё очень просто, простой проект в VisualStudio, на выходе DLL, и её записываем в модели PROTEUS'а.
Итак, мой проект генерирует DLLку для PROTEUS'а, со всякими классами. Максимальную частоту, которую я достиг это 100 кГц, выше PROTEUS начинает захлёбываться… Начал грешить на то, что эмулятор сделал хреново, решил сгенерить вторую DLLку без всяких там классов, подцепил её к делфи, не делал вообще никаких оптимизаций, простой цикл внутри которого проверяется значения ног процессора и выдаётся ему значение памяти, ну или запись. В итоге получил на своём компе 2.4 гГц жа 40 скоростей ZX-Spectrum'ов… То есть это получается примерно 140 мегагерц симуляции тактовой. Вообщем, не знаю что там делает PROTEUS, но он скорость его оставляет желать лучшего.
Проект сырой, поэтому есть много недочётов. Например нет реакции на RESET и WAIT. Симуляция должна быть точной, учтены все влияния на флаги.
Вообщем пользуйтесь, кому надо. И главное, деньги тут не участвуют!!! Сссори, крик души, а то уже совсем помешались на деньгах, требовать за симуляцию компонента 100000 долларов. когда в реальности задача компонента уровня школы курса информатики.
Вот собственно DLL'ка для PROTEUS'а и модель
Вот весь проект
Вот как-то я столкнулся с PROTEUS'ом… И вроде так классно, симуляторы внутри всякие… А ткнёшься сделать что-то нужное, то деньгу плати, причём заоблачную, то просто нет того, что надо. Я, конечно, понимаю, что большинство уж давно ушли от Z80, но всё же он остался.
Очень часто я видел, что люди постоянно интересуются где можно взять модель Z80, и вообще как её сделать. Вот так и я искал-искал, плюнул и решил написать сам. Оказалось всё очень просто, простой проект в VisualStudio, на выходе DLL, и её записываем в модели PROTEUS'а.


Итак, мой проект генерирует DLLку для PROTEUS'а, со всякими классами. Максимальную частоту, которую я достиг это 100 кГц, выше PROTEUS начинает захлёбываться… Начал грешить на то, что эмулятор сделал хреново, решил сгенерить вторую DLLку без всяких там классов, подцепил её к делфи, не делал вообще никаких оптимизаций, простой цикл внутри которого проверяется значения ног процессора и выдаётся ему значение памяти, ну или запись. В итоге получил на своём компе 2.4 гГц жа 40 скоростей ZX-Spectrum'ов… То есть это получается примерно 140 мегагерц симуляции тактовой. Вообщем, не знаю что там делает PROTEUS, но он скорость его оставляет желать лучшего.
Проект сырой, поэтому есть много недочётов. Например нет реакции на RESET и WAIT. Симуляция должна быть точной, учтены все влияния на флаги.
Вообщем пользуйтесь, кому надо. И главное, деньги тут не участвуют!!! Сссори, крик души, а то уже совсем помешались на деньгах, требовать за симуляцию компонента 100000 долларов. когда в реальности задача компонента уровня школы курса информатики.
Вот собственно DLL'ка для PROTEUS'а и модель
Вот весь проект
19 комментариев
Большая просьба расширить статью под кат с хотя-бы небольшими поверхностными разъяснениями по коду и о том как догадались, что можно писать собственные компоненты.
И что это за прога милькнула в начале видео синяя такая вся… я такого не помню в протеусе вообще. Если это стандартная, то как её вызывать?
Так вот, они тогда были по 1.5грн у фирмы Филур Электрик в Киеве и говорили, что у них их еще Очень много.
Не могу записать в ОЗУ переменную.
LD A,55H
LD (2010H),A
Пробовал также
LD HL,2010H
LD (HL),55H
Конструкция не работает.
Вернее работает но при записи в озу на шине данных выставляется 0x00.
A12 = -WE
A13 = -OE
A14 = -CEROM
A15 = -CERAM
На скрине видно, что при активации записи ОЗУ (A15=0 A12=0) на шине данных 0
Вроде проверил только что запись, отлично всё пишет…
Такой вопрос, а шина данных через резисторы подтянута к VCC?
Сейчас попробую проверить именно вашу модель с заведением адреса на выборку памяти. Хотя лучше получить ваш проект, что бы было уже всё идентично.
Сначала подтягивал (как в оригинальной схеме), а потом убрал.
Когда подтягиваю, вообще ничего не работает. Зависает на адресе 01Н.
Управляющие не выбраны.
Может дело в версии шпротеуса?
В итоге выяснилось, что неправильно работает компиляция SDCC или настройки не подходят (я изначально писал под С). А когда написал простые инструкции под Asm и добавил резисторы (кстати для ускорения модель можно выбрать =Digital). Всё заработало.
Спасибо автору за помощь. Теперь буду копать SDCC.
Хотел бы добавить что на моём компе 4х3.3ГГц работает 1МГц (хотя Протеус не поддерживает мультиядра пока)
От себя скажу, что, вероятно, пользовались бы большой популярностью в протеусе модели 1801ВМ1/ВМ2 и 1806ВМ2. Если автору интересно, мог бы посодействовать в написании оных (есть уже написанные и работающие ядрышки на С).
Если кому интересно, как я победил SDCC для Z80. Пишите сюда, выложу материалы.
Не работает у меня ни NMI ни INT, может где опять резистор надо?
Код вроде легальный:
по адресу 66H вызываю функцию прерывания (если NMI) завершаю всё RETN.
.org 0x66
push af
call _nmi_isr
pop af
retn