nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 10:16



Reply to topic  [ 9 posts ] 
6502 Proteus model 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Итак, моя третья попытка по созданию схемотехнической модели 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 и позволяет
моделировать микропроцессорные системы на его основе, причем, скорость работы очень и очень
хороша!
Attachment:
6502_0.gif
6502_0.gif [ 16.92 KiB | Viewed 21159 times ]

Из негативной стороны: модель, конечно же, полностью не идентична реальному 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:
Attachment:
6502.zip [271.49 KiB]
Downloaded 724 times

В архиве два проекта, первый - тот, что на картинке выше: 6502_0.DSN - ЦПУ выполняет NOP по
шине данных, перебирая адреса на ША. Этот проект можно считать базовым и при желании к нему
можно присоединять то, что нужно - я специально выбрал большой лист.
У модели нет никаких библиотек и никаких лишних файлов, она никуда не прописывается, что
тоже в некотором роде плюс! :wink:

Второй проект - 6502_5.DSN практически копия схемы Grant Searle, но я изменил дешифрацию,
чтобы добавить тестовый порт вывода, в него ($BF00) забрасывается статус ACIA 6850, и если
он показывает 02 - то всё верно!
Attachment:
6502_5.gif
6502_5.gif [ 21.89 KiB | Viewed 21159 times ]

В этом же проекте можно проверить всю функциональность: NMI - работает всегда, IRQ - только
после ответа "С" на первый запрос о "холодном/тёплом" старте. Я там вставил CLI в код.
И здесь же прицеплен логический анализатор - можно посмотреть все сигналы на шинах.

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


P.S. Баги, наверное, есть... :wink: полный тест функциональности не проводил - он долгий,
и я забыл, должен он работать в ОЗУ или в ПЗУ. Но - разберусь позже.

_________________
iLavr


18 Jul 2018 00:45
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
Баги, наверное, есть...
Ошибку, найденную тестом Klausа Dormanа, и которую обсуждали здесь - исправил на уровне схемотехники.
Исправленную версию модели 6502 прилагаю:
Attachment:
6502_Test.zip [183.38 KiB]
Downloaded 552 times

Тест находится в ПЗУ и перегружается из него в ОЗУ на адрес 0800Н.
Процесс переноса - довольно долгий, минуты 3... :osad:
Lavr wrote:
...и я забыл, должен он работать в ОЗУ или в ПЗУ.
Попробовал сегодня запускать тест прямо из ПЗУ, для чего исправил схему вот так:
Attachment:
6502_Test.gif
6502_Test.gif [ 25.89 KiB | Viewed 21067 times ]
Чтобы ПЗУ было в верхней четверти, для векторов и начального старта, и оно же зеркалилось
в нижнюю четверть, кроме адресов 0000...07FFH - только там немного ОЗУ в 2048 Байт.

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

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

Нашел тестом следующий баг - неверно выставляется флаг N в операции EOR.
Это уже придется исправлять на уровне микрокода АЛУ, сделанного таблицей на 2-х ПЗУ...

_________________
iLavr


21 Jul 2018 17:13
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
С загрузкой 6502_Klaus Dormann_test через примитивный контроллер DMA процесс
тестирования пошел значительно быстрее, и большинство ошибок я вычистил.
Attachment:
6502_8_.gif
6502_8_.gif [ 42.55 KiB | Viewed 20919 times ]

Здесь вариант модели 6502, прошедший полностью 6502_Klaus Dormann_test за
исключением операций десятичной арифметики.
Attachment:
6502_8.zip [212.93 KiB]
Downloaded 578 times


Тест очень долгий. Что неудивительно. Он проверяет все операции по всем возможным
значениям флагов, аргументов и режимов адресации.
На реальном 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...

_________________
iLavr


06 Aug 2018 06:48
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
С реализацией самих операций BCD arithmetic проблем особых нет.

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

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

Вот так он, этот тест, собственно, и заканчивается в случае успеха:
Attachment:
TestRedy.gif
TestRedy.gif [ 29.59 KiB | Viewed 20875 times ]
Code:
                        ; 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.
Attachment:
_6502_9.zip [316.58 KiB]
Downloaded 627 times

Ограничения модели следующие:
- Все несуществующие команды исполняют инструкцию NOP.
- Модель примерно в 4 раза "медленнее" реального NMOS 6502 на той же тактовой частоте,
(4 тика на такт 6502), хотя предвыборку следующей команды модель выполняет.
- К сожалению, сигналы Ф1 и Ф2 непериодичны, а значит растактовка команд 6502 несколько
иная, но на интервале одного цикла все сигналы примерно соответствуют реальному 6502.
- Вектор NMI передает управление туда же, куда и IRQ, хотя оба прерывния работают верно.
- Сигнал SO - выходной и выдаёт цикл обращения к памяти, как SO - он не работает.
- В модели сделаны выходы, аналогчные /RD и /WR i8080 - для простоты моделирования cхем
в Proteus, т.к. в нём нет практически ИС, совместимых по протоколу обмена с 6502.
Но рекомендуемая для такого случая схема, обрабатывающая сигналы Ф2 и R/W, работает корректно.
Attachment:
rd_wrCircuit.jpg
rd_wrCircuit.jpg [ 34.13 KiB | Viewed 20875 times ]

При реализации десятичной арифметики я пошел на некоторый компромисс.
В реальном NMOS 6502 сначала выполняется бинарное сложение/вычитание и по нему выставляются
все флаги, затем бинарный результат корректируется до десятичного, по которому выставляется
правильное значение флага переноса C.
Поэтому флаги N, V, Z в BCD-mode NMOS 6502 считаются недействительными, и об этом написано
в самОм исходнике теста:
Code:
  ; 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.

_________________
iLavr


09 Aug 2018 16:59
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
Второй проект - 6502_5.DSN практически копия схемы Grant Searle, но я изменил дешифрацию,

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

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

http://www.searle.wales/

_________________
iLavr


16 Nov 2020 14:32
Profile
Junior

Joined: 22 Dec 2022 10:28
Posts: 2
Reply with quote
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


22 Dec 2022 10:48
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
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.
Attachment:
74s.PNG
74s.PNG [ 104.06 KiB | Viewed 8300 times ]

With best wishes.

_________________
iLavr


30 Dec 2022 06:39
Profile
Junior

Joined: 22 Dec 2022 10:28
Posts: 2
Reply with quote
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.
Attachment:
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.


23 Feb 2023 13:43
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
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


23 Feb 2023 13:52
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 9 posts ] 

Who is online

Users browsing this forum: No registered users and 4 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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.