Итак, моя третья попытка по созданию схемотехнической модели
6502 в среде моделирования
Proteus увенчалась успехом. Процессор получился где-то на
4+ по пятибалльно системе...
Почему всё же схемотехническая модель, а не
DLL-библиотека? Из-за таймингов: я так и
не нашел нигде полную информацию, как
6502 выполняет свои инструкции в привязке к его
хитрозадуманным тактовым импульсам
Ф1 и
Ф2. А без этой информации написание
DLL-ки,
как, впрочем, и разработка схемы
6502 превращается в гадание на кофейной гуще.
Собственно, большинство проектов так и сделаны, насколько я их рассмотрел - создается
свой процесор, как можно более похожий на оригинальный
6502, согласно его распространенным
блок-схемам.
Но иметь модель
6502 в
Proteus мне давно хотелось - всё же среда моделирования позволяет
довольно оперативно исследовать различные проекты, поэтому я решил создать модель на
основе какой либо успешной схемы
6502 на основе ТТЛ-логики или микроконтроллера.
Первый вариант я начинал ещё на
PIC, но он так и не заработал толком, хотя
у меня уже
была успешная попытка разработки процесора на микроконтроллере, но не пошло.
Вторая попытка была более удачной: проект
6502 на ATMega16 заработал, но использовать
его в качестве
Proteus-модели 6502 было бы опрометчиво - он слишком медленный в симуляции,
и автор приделал к
6502 много лишнего, на мой взгляд.
Ну и третья попытка заключалась в том, что я рассмотрел
несколько проектов 6502, выполненных
на 74-й логике и выбрал самый простой и шустренький, на мой взгляд. Хотя скажу, что проекты
были похожи друг на друга, как близнецы-братья, так что схемотехнически все решения в них
довольно близки, но проект с АЛУ, выполненном на ПЗУ более компактен еще и по той причине,
что из ПЗУ в нужный момент можно извлечь необходимые данные, которых в стандартом АЛУ типа
74181 попросту нет.
Не зря же мы говорили, что микропроцессор
6502 активно использует путь данных через АЛУ!
И это действительно так.
Что же получилось в итоге? В итоге получилась модель, которая очень близка к
6502 и позволяет
моделировать микропроцессорные системы на его основе, причем, скорость работы очень и очень
хороша!
Из негативной стороны: модель, конечно же, полностью не идентична реальному
6502.
И разночтения следующие:
- модель работает медленнее реального 6502 на той же частоте;
- растактовка команд не во всём совпадает, хотя цикл максимально приближен к 6502,
что позволяет использовать совместимые с его шиной БИС, я использовал ACIA 6850.
- Такты Ф1 и Ф2 примерно соответствуют 6502: по фронту Ф1 выставляется адрес, примерно
за 100 nS до спада Ф2 данные установлены, но из-за несовпадения растактовок такты
Ф1 и Ф2 представляют собой непериодическую последовательность.
- Механизм шины, опирающийся на сигналы R/W и Ф2 весьма критичен по времени для микросхем
памяти поэтому я вывел на 2 выхода NC (NC0 и NCI), соответственно, раздельные сигналы
/WRITE (NC0ut) и /READ (NCIn), как в z80 и i8080, они менее критичны по времени, и с ними
проще что-то быстро смоделировать, если не требуется полной идентичности.
На выход NC я вывел сигнал обращения к шинам BUS - он имелся в 6501, но в 6502 его заменил
SYNC. Но для анализа работы шины этот сигнал весьма удобен.
- сигнал SYNC в модели несколько короче чем в оригинале.
- Вход S.O., который практически не используют по нзначению, я использовал для вывода шин из
высокоимпедансного состояния при остановке по сигналу READY. Модель работает как 65C02,
и в этом режиме переводит шины в высокоимпедансное состояние, для работы ПДП, если он
используется, но для пошаговой отладки это неудобно. Поэтому в состоянии НЕготовности
логический 0 на S0 "открывает" шины.
- IRQ и NMI срабатывают на один и тот же адрес (адрес IRQ).Вот, пожалуй, и все недочеты...
О достоинствах: всяк, кто что-либо соображает в схемотехнике, сможет в любой момент залезть
микропроцессору "под капот", посмотреть, что там и как и при необходимости допилить то, что
нужно по-своему.
И второе - модель весьма быстрая, сравнивать с
DLL-моделями
z80 и
i8080 некорректно, так как
сами микропроцессоры сложнее, но в программах ассемблера скорость примерно близка.
Архив с проектами 6502:
В архиве два проекта, первый - тот, что на картинке выше:
6502_0.DSN - ЦПУ выполняет
NOP по
шине данных, перебирая адреса на ША. Этот проект можно считать базовым и при желании к нему
можно присоединять то, что нужно - я специально выбрал большой лист.
У модели нет никаких библиотек и никаких лишних файлов, она никуда не прописывается, что
тоже в некотором роде плюс!
Второй проект -
6502_5.DSN практически копия
схемы Grant Searle, но я изменил дешифрацию,
чтобы добавить тестовый порт вывода, в него (
$BF00) забрасывается статус
ACIA 6850, и если
он показывает
02 - то всё верно!
В этом же проекте можно проверить всю функциональность:
NMI - работает всегда,
IRQ - только
после ответа "
С" на первый запрос о "холодном/тёплом" старте. Я там вставил
CLI в код.
И здесь же прицеплен логический анализатор - можно посмотреть все сигналы на шинах.
И, кстати, программировать на
6502 - легко!
Я уже почти забыл его коды, но довольно быстро
вспомнил всё заново... Желаю удачи в освоении легендарного
6502!
P.S. Баги, наверное, есть... полный тест функциональности не проводил - он долгий,
и я забыл, должен он работать в ОЗУ или в ПЗУ. Но - разберусь позже.