6502 Proteus model

MOS Technology / Commodore / Apple II / NES etc.

Moderator: Lavr

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

6502 Proteus model

Post by Lavr »

Итак, моя третья попытка по созданию схемотехнической модели 6502 в среде моделирования
Proteus увенчалась успехом. Процессор получился где-то на 4+ по пятибалльно системе... :mrgreen:

Почему всё же схемотехническая модель, а не DLL-библиотека? Из-за таймингов: я так и
не нашел нигде полную информацию, как 6502 выполняет свои инструкции в привязке к его
хитрозадуманным тактовым импульсам Ф1 и Ф2. А без этой информации написание DLL-ки,
как, впрочем, и разработка схемы 6502 превращается в гадание на кофейной гуще.
Собственно, большинство проектов так и сделаны, насколько я их рассмотрел - создается
свой процесор, как можно более похожий на оригинальный 6502, согласно его распространенным
блок-схемам.

Но иметь модель 6502 в Proteus мне давно хотелось - всё же среда моделирования позволяет
довольно оперативно исследовать различные проекты, поэтому я решил создать модель на
основе какой либо успешной схемы 6502 на основе ТТЛ-логики или микроконтроллера.

Первый вариант я начинал ещё на PIC, но он так и не заработал толком, хотя
у меня уже была успешная попытка разработки процесора на микроконтроллере,
но не пошло. :osad:
Вторая попытка была более удачной: проект 6502 на ATMega16 заработал, но использовать
его в качестве Proteus-модели 6502 было бы опрометчиво - он слишком медленный в симуляции,
и автор приделал к 6502 много лишнего, на мой взгляд.

Ну и третья попытка заключалась в том, что я рассмотрел несколько проектов 6502, выполненных
на 74-й логике и выбрал самый простой и шустренький, на мой взгляд. Хотя скажу, что проекты
были похожи друг на друга, как близнецы-братья, так что схемотехнически все решения в них
довольно близки, но проект с АЛУ, выполненном на ПЗУ более компактен еще и по той причине,
что из ПЗУ в нужный момент можно извлечь необходимые данные, которых в стандартом АЛУ типа
74181 попросту нет. :lol:
Не зря же мы говорили, что микропроцессор 6502 активно использует путь данных через АЛУ!
И это действительно так. :o

Что же получилось в итоге? В итоге получилась модель, которая очень близка к 6502 и позволяет
моделировать микропроцессорные системы на его основе, причем, скорость работы очень и очень
хороша!
6502_0.gif
Из негативной стороны: модель, конечно же, полностью не идентична реальному 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.zip
В архиве два проекта, первый - тот, что на картинке выше: 6502_0.DSN - ЦПУ выполняет NOP по
шине данных, перебирая адреса на ША. Этот проект можно считать базовым и при желании к нему
можно присоединять то, что нужно - я специально выбрал большой лист.
У модели нет никаких библиотек и никаких лишних файлов, она никуда не прописывается, что
тоже в некотором роде плюс! :wink:

Второй проект - 6502_5.DSN практически копия схемы Grant Searle, но я изменил дешифрацию,
чтобы добавить тестовый порт вывода, в него ($BF00) забрасывается статус ACIA 6850, и если
он показывает 02 - то всё верно!
6502_5.gif
В этом же проекте можно проверить всю функциональность: NMI - работает всегда, IRQ - только
после ответа "С" на первый запрос о "холодном/тёплом" старте. Я там вставил CLI в код.
И здесь же прицеплен логический анализатор - можно посмотреть все сигналы на шинах.

И, кстати, программировать на 6502 - легко! :roll: Я уже почти забыл его коды, но довольно быстро
вспомнил всё заново... Желаю удачи в освоении легендарного 6502! :D


P.S. Баги, наверное, есть... :wink: полный тест функциональности не проводил - он долгий,
и я забыл, должен он работать в ОЗУ или в ПЗУ. Но - разберусь позже.
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: 6502 Proteus model

Post by Lavr »

Lavr wrote:Баги, наверное, есть...
Ошибку, найденную тестом Klausа Dormanа, и которую обсуждали здесь - исправил на уровне схемотехники.
Исправленную версию модели 6502 прилагаю:
6502_Test.zip
Тест находится в ПЗУ и перегружается из него в ОЗУ на адрес 0800Н.
Процесс переноса - довольно долгий, минуты 3... :osad:
Lavr wrote:...и я забыл, должен он работать в ОЗУ или в ПЗУ.
Попробовал сегодня запускать тест прямо из ПЗУ, для чего исправил схему вот так:
6502_Test.gif
Чтобы ПЗУ было в верхней четверти, для векторов и начального старта, и оно же зеркалилось
в нижнюю четверть, кроме адресов 0000...07FFH - только там немного ОЗУ в 2048 Байт.

Интересно, что M$ OSI Basic от Билла это понял правильно, я при старте не сказал сколько ОЗУ,
а просто нажал Enter - Basic при этом проверяет ОЗУ сам, так он определил всё верно! :roll:
Интересно, что обычно быстрый тест ОЗУ делают, записывая и читая коды 0AAH, 55H.
Basic от Билла проверяет ОЗУ, записывая в него " $ " ! :lol:

А вот, тест от Klausа Dormanа в такой конфигурации не заработал - видимо, расточен под ОЗУ. :-?

Нашел тестом следующий баг - неверно выставляется флаг N в операции EOR.
Это уже придется исправлять на уровне микрокода АЛУ, сделанного таблицей на 2-х ПЗУ...
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: 6502 Proteus model

Post by Lavr »

С загрузкой 6502_Klaus Dormann_test через примитивный контроллер DMA процесс
тестирования пошел значительно быстрее, и большинство ошибок я вычистил.
6502_8_.gif
Здесь вариант модели 6502, прошедший полностью 6502_Klaus Dormann_test за
исключением операций десятичной арифметики.
6502_8.zip
Тест очень долгий. Что неудивительно. Он проверяет все операции по всем возможным
значениям флагов, аргументов и режимов адресации.
На реальном 6502 Klaus Dormann_test проходит примерно за час, на этой модели
тест крутился ДВОЕ СУТОК! :o (Учтём, что это на PII, 366 MHz)

Основные ошибки следующие:

1. Не везде корректно выставлялся флаг N. Но это, как говорится, "ещё цветочки"... :wink:
2. Основные траблы были в "хитрых" режимах адресации 6502: (ZP,X) и (ZP),Y.
Самое смешное, что автор исходника, который я допиливаю, саму суть этих режимов
понимал правильно, но сыграл человеческий фактор.
Большинство операций 6502 проходят по практически одинаковому шаблону, на этом
и случился баг: после вычисления "хитрого" адреса (ZP,X) и (ZP),Y автор "забыл"
втащить аргумент в АЛУ. :wink:
Интересно, что когда я сам это сделал правильно, в двух случаях не хватило тактов.
Пришлось подправить растактовку.
Автор считает, что у него 4 тика опорной частоты на 1 такт реального 6502 - все равно
реальные тайминги не получаются, а в пределах цикла я их выправил аппаратно.

С реализацией самих операций BCD arithmetic проблем особых нет. Грубо говоря, при
взведенном флаге D процессор 6502 выполняет сложение и вычитание, как z80 с операцией
DAA, то есть, результат в АЛУ закодировать нетрудно.

Но вот с флагами начинается полная пляска с бубнами... :osad:

К примеру: в BCD-mode $01 - $01 = 0 выставит флаг Z, а вот $99 + $01 = $1_00 флаг Z
не выставит.
Тут вот целый "дайджест" есть на эту тему: 6502.org Tutorials: Decimal Mode 8)

Считается, что в BCD-mode у 6502 достоверный только флаг переноса C.
Но остальные флаги как-то должны выставляться в соответствии с нелогичной логикой 6502
в BCD-mode...
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: 6502 Proteus model

Post by Lavr »

Lavr wrote:С реализацией самих операций BCD arithmetic проблем особых нет.
Я добавил в АЛУ инструкции десятичного сложения/вычитания, и модель успешно
преодолела Klaus Dormann Functional Test for the NMOS 6502! :kruto:

Тест запускался на ноутбуке с Intel ATOM 1.8 ГГц и длился с 6.35 утра примерно до 22.40 вечера
(побыстрее всё же, нежели предыдущий раз - двое суток... :D ).

Вот так он, этот тест, собственно, и заканчивается в случае успеха:
TestRedy.gif

Code: Select all

                        ; S U C C E S S ************************************************
                        ; -------------
                                success         ;if you get here everything went well
3819 : 4c1938          >        jmp *           ;test passed, no errors
                        ; -------------
                        ; S U C C E S S ************************************************
Тест зацикливается длинным jmp на адресе 3819H, перебирая также ячейки 381AH
и 381BH, считывая их содержимое: $4c, $19, $38.

Следовательно, данная модель полноценно и безошибочно выполняет систему команд NMOS 6502.
_6502_9.zip
Ограничения модели следующие:
- Все несуществующие команды исполняют инструкцию NOP.
- Модель примерно в 4 раза "медленнее" реального NMOS 6502 на той же тактовой частоте,
(4 тика на такт 6502), хотя предвыборку следующей команды модель выполняет.
- К сожалению, сигналы Ф1 и Ф2 непериодичны, а значит растактовка команд 6502 несколько
иная, но на интервале одного цикла все сигналы примерно соответствуют реальному 6502.
- Вектор NMI передает управление туда же, куда и IRQ, хотя оба прерывния работают верно.
- Сигнал SO - выходной и выдаёт цикл обращения к памяти, как SO - он не работает.
- В модели сделаны выходы, аналогчные /RD и /WR i8080 - для простоты моделирования cхем
в Proteus, т.к. в нём нет практически ИС, совместимых по протоколу обмена с 6502.
Но рекомендуемая для такого случая схема, обрабатывающая сигналы Ф2 и R/W, работает корректно.
rd_wrCircuit.jpg
При реализации десятичной арифметики я пошел на некоторый компромисс.
В реальном NMOS 6502 сначала выполняется бинарное сложение/вычитание и по нему выставляются
все флаги, затем бинарный результат корректируется до десятичного, по которому выставляется
правильное значение флага переноса C.
Поэтому флаги N, V, Z в BCD-mode NMOS 6502 считаются недействительными, и об этом написано
в самОм исходнике теста:

Code: Select all

  ; decimal add/subtract test
  ; *** WARNING - tests documented behavior only! ***
  ;   only valid BCD operands are tested, N V Z flags are ignored
  ; iterates through all valid combinations of operands and carry input
Но как-то весьма дико наблюдать в аккумуляторе "$00", а флаг Z - не установлен... :o
Поэтому я сделал модель ближе к 65С02 - флаги N, Z выставляются по BCD-значению в аккумуляторе,
всё равно он его далее понимает как HEX-значение...
А вот флаг V я оставил вычисленным по принципу NMOS 6502, поскольку применять его к BCD-значениям
несколько бестолково по самой его сути, и сильно всё усложнит без какого-либо профита.

Ну что ж... модель окончательно проверена строгим тестом - можно что-либо и сделать на ней! :wink:


P.S. Забавно, что OSI-BASIC от Билли Г. работал на этой конструкции при большом количестве
ошибок в кодах операции! Оргвывод такой, что, видимо Билли Г., перенося свой М$ Basic на
платформу 6502, сильно лукаво не мудрствовал, и заведомо не влезал в "хитрые" режимы 6502.
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: 6502 Proteus model

Post by Lavr »

Lavr wrote:Второй проект - 6502_5.DSN практически копия схемы Grant Searle, но я изменил дешифрацию,
Сегодня долго искал по форуму ссылку на сайт Grant Searle (Грант Сирл),
поскольку все бывшие здесь раньше ссылки благополучно померли... :-?

Правильную ссылку на новый сайт Гранта Сирла дал Shaos:

http://www.searle.wales/
iLavr
6502User
Junior
Posts: 2
Joined: 22 Dec 2022 10:28

Re: 6502 Proteus model

Post by 6502User »

Hi Lavr.

Я нашел этот интересный пост, и хотя он датируется 2018 годом, я хотел бы знать, можете ли вы помочь мне реализовать его в proteus, даже если это самый простой пример.
При попытке импортировать файл 6502_1.dsn из Proteus V 8.12 я получаю на экране один лист схемы с отключенными линиями 6502. Это сбой импорта?Какой версией Протеуса он сделан? И еще вопрос, я кажется понимаю, что эмулятор 6502 построен на основе ТТЛ, где схема этого компонента?

The above is a Google translation, the following is the English text.

I have found this interesting post and although it dates from 2018, I would like to know if you could help me implement it in proteus, even if it is the most basic example.
When trying to import the 6502_1.dsn file from Proteus V 8.12, I get a single sheet schematic on screen, with the 6502 lines disconnected. Is it a failure of the import? What version of Proteus is it made with? And another question, I think I understand that the 6502 emulator is built based on TTL, where is the schematic for this component?

I thank you in advance. Regards.

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

Re: 6502 Proteus model

Post by Lavr »

This project was made with Proteus 6.7 Pro, and later tested with Proteus 7.7 Pro.
I have no Proteus V 8.12, so I have nothing to say in this situation… :(

The 6502 emulator was really built based on TTL, it is 74-series digital logic integrated circuits.
74s.PNG
With best wishes.
You do not have the required permissions to view the files attached to this post.
iLavr
6502User
Junior
Posts: 2
Joined: 22 Dec 2022 10:28

Re: 6502 Proteus model

Post by 6502User »

Lavr wrote:This project was made with Proteus 6.7 Pro, and later tested with Proteus 7.7 Pro.
I have no Proteus V 8.12, so I have nothing to say in this situation… :(

The 6502 emulator was really built based on TTL, it is 74-series digital logic integrated circuits.
74s.PNG
With best wishes.
Hi Lavr,

I had not visited this forum again and I had not seen your reply to my post.
During that time I was able to import and run the 6502_5.DSN file to simulate your Grant Searle's circuit version on my Proteus V 8.12, successfully.
I have even incorporated an Intel 8255A PPI and I have been able to control it with your Osi_BasC version on the ROM and POKEs and PEEKs executed from the virtual terminal.
The next step would be to introduce a 6522 VIA, and a 6520/6821 PIA, but I don't have an emulator for these chips on Proteus. If you have, I would be very grateful if you could send it to me.

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

Re: 6502 Proteus model

Post by Lavr »

6502User wrote:The next step would be to introduce a 6522 VIA, and a 6520/6821 PIA, but I don't have an emulator for these chips on Proteus. If you have, I would be very grateful if you could send it to me.
Sorry, I have no 6522 VIA, and a 6520/6821 PIA Proteus models.

With best wishes.
iLavr