nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 18 Dec 2018 16:54



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

Joined: 21 Oct 2009 09: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 1129 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 39 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 1129 times ]

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

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


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

_________________
iLavr


18 Jul 2018 01:45
Profile
Supreme God
User avatar

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

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

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

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

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

_________________
iLavr


21 Jul 2018 18:13
Profile
Supreme God
User avatar

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

Здесь вариант модели 6502, прошедший полностью 6502_Klaus Dormann_test за
исключением операций десятичной арифметики.
Attachment:
6502_8.zip [212.93 KiB]
Downloaded 36 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 07:48
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09: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 845 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 40 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 845 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 17:59
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 4 posts ] 

Who is online

Users browsing this forum: No registered users and 1 guest


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.