Z80 Cpu Simulator For Proteus

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

Вот как-то я столкнулся с PROTEUS'ом… И вроде так классно, симуляторы внутри всякие… А ткнёшься сделать что-то нужное, то деньгу плати, причём заоблачную, то просто нет того, что надо. Я, конечно, понимаю, что большинство уж давно ушли от Z80, но всё же он остался.

Очень часто я видел, что люди постоянно интересуются где можно взять модель Z80, и вообще как её сделать. Вот так и я искал-искал, плюнул и решил написать сам. Оказалось всё очень просто, простой проект в VisualStudio, на выходе DLL, и её записываем в модели PROTEUS'а.



Итак, мой проект генерирует DLLку для PROTEUS'а, со всякими классами. Максимальную частоту, которую я достиг это 100 кГц, выше PROTEUS начинает захлёбываться… Начал грешить на то, что эмулятор сделал хреново, решил сгенерить вторую DLLку без всяких там классов, подцепил её к делфи, не делал вообще никаких оптимизаций, простой цикл внутри которого проверяется значения ног процессора и выдаётся ему значение памяти, ну или запись. В итоге получил на своём компе 2.4 гГц жа 40 скоростей ZX-Spectrum'ов… То есть это получается примерно 140 мегагерц симуляции тактовой. Вообщем, не знаю что там делает PROTEUS, но он скорость его оставляет желать лучшего.

Проект сырой, поэтому есть много недочётов. Например нет реакции на RESET и WAIT. Симуляция должна быть точной, учтены все влияния на флаги.

Вообщем пользуйтесь, кому надо. И главное, деньги тут не участвуют!!! Сссори, крик души, а то уже совсем помешались на деньгах, требовать за симуляцию компонента 100000 долларов. когда в реальности задача компонента уровня школы курса информатики.

Вот собственно DLL'ка для PROTEUS'а и модель: yadi.sk/d/LMHvCD70DNJmh
Вот весь проект: yadi.sk/d/L5N0JjEwDJ2uh

17 комментариев

avatar
Шикарно!
Большая просьба расширить статью под кат с хотя-бы небольшими поверхностными разъяснениями по коду и о том как догадались, что можно писать собственные компоненты.
avatar
Спасибо… С ужасом думал, как накинутся, что занимаюсь ерундой никому не нужной. Разъяснения по коду обязательно сделаю завтра утром. Там не так просто, использовано несколько нестандартных инструментов для достижения высокой скорости симуляции. Так же распишу как делать симуляцию. Схема очень проста. Но я боюсь, что я что-то не-до-разгадал из-за чего я не могу получить нормальную скорость. Поскольку тормоза в 40 раз это очень уж странно. Надеюсь, что опубликованную статью можно дополнять… =)
Комментарий отредактирован 2013-11-27 00:50:33 пользователем Robus
avatar
Классно, но осталась не раскрыта тема как вы создавали DLL итд, это ж самое интересное ))
И что это за прога милькнула в начале видео синяя такая вся… я такого не помню в протеусе вообще. Если это стандартная, то как её вызывать?
Комментарий отредактирован 2013-11-29 08:21:32 пользователем idea
avatar
модтрекер какойта с ностальгией по аудиопроцессору
avatar
Кстати искал в студенческие годы Z80 и успешно нашел, но к сожалению так курсовую на нем и не реализовал(а и не требовалось).
Так вот, они тогда были по 1.5грн у фирмы Филур Электрик в Киеве и говорили, что у них их еще Очень много.
Комментарий отредактирован 2013-11-27 00:42:46 пользователем tomatniy
avatar
Очень готичное видео! А вообще, дейстивтельно, хотелось бы побольше узнать про то, как пишутся компоненты для протеуса (я им не пользуюсь, но очень много подобных прозьб слышал).
avatar
А чем тогда пользуешься, если не секрет?
avatar
Здрасьте, походу нашёл глюк.
Не могу записать в ОЗУ переменную.

LD A,55H
LD (2010H),A

Пробовал также

LD HL,2010H
LD (HL),55H

Конструкция не работает.
Вернее работает но при записи в озу на шине данных выставляется 0x00.
Z80P

A12 = -WE
A13 = -OE
A14 = -CEROM
A15 = -CERAM

На скрине видно, что при активации записи ОЗУ (A15=0 A12=0) на шине данных 0
Комментарий отредактирован 2014-12-04 16:20:01 пользователем cls
avatar
Привет.
Вроде проверил только что запись, отлично всё пишет…
Такой вопрос, а шина данных через резисторы подтянута к VCC?
Сейчас попробую проверить именно вашу модель с заведением адреса на выборку памяти. Хотя лучше получить ваш проект, что бы было уже всё идентично.
avatar
Hi.
Сначала подтягивал (как в оригинальной схеме), а потом убрал.
Когда подтягиваю, вообще ничего не работает. Зависает на адресе 01Н.
Управляющие не выбраны.
Может дело в версии шпротеуса?

Z801
Комментарий отредактирован 2014-12-05 09:24:17 пользователем cls
avatar
Итак. Проблема решилась.

В итоге выяснилось, что неправильно работает компиляция SDCC или настройки не подходят (я изначально писал под С). А когда написал простые инструкции под Asm и добавил резисторы (кстати для ускорения модель можно выбрать =Digital). Всё заработало.

Спасибо автору за помощь. Теперь буду копать SDCC.

Z802

Хотел бы добавить что на моём компе 4х3.3ГГц работает 1МГц (хотя Протеус не поддерживает мультиядра пока)

От себя скажу, что, вероятно, пользовались бы большой популярностью в протеусе модели 1801ВМ1/ВМ2 и 1806ВМ2. Если автору интересно, мог бы посодействовать в написании оных (есть уже написанные и работающие ядрышки на С).
Комментарий отредактирован 2014-12-05 10:03:18 пользователем cls
avatar
Даешь эмуляцию Спектрума в Протеусе!
avatar
Пока не выйдет в реальном времени! Ждём протеус №8 с поддержкой мультиядерности.
avatar
Так есть уже ж. Правда у меня он вываливался из-за лицензии.
avatar
Подождём свежайших релизов.
Если кому интересно, как я победил SDCC для Z80. Пишите сюда, выложу материалы.
avatar
Дошёл до прерываний, и снова есть вопрос к автору.
Не работает у меня ни NMI ни INT, может где опять резистор надо?

Код вроде легальный:
по адресу 66H вызываю функцию прерывания (если NMI) завершаю всё RETN.

.org 0x66
push af
call _nmi_isr
pop af
retn
Комментарий отредактирован 2015-01-08 11:07:05 пользователем cls
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.