nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 19 Sep 2018 13:15



Reply to topic  [ 39 posts ]  Go to page Previous  1, 2, 3
Эмуляторы и аналоги 6502 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Поскольку модель 6502 работоспособна, решил проверить её на чем-то серьёзном,
чтобы можно было ощутимо увидеть результат.

Поэтому убрал из схемы все излишества от Commodore 64, изменил карту памяти и
собрал схему, аналогичную OSI Computer в упрощенном варианте от Grant Searle,
добавив в схему этот самый пресловутый ACIA MC6850.
Attachment:
6502_POKE.gif
6502_POKE.gif [ 23.4 KiB | Viewed 599 times ]
Результат превзошел все ожидания - OSI 6502 MICROSOFT BASIC работает! :kruto:

 Grant Searle Sin(A)
Attachment:
6502_SinA.gif
6502_SinA.gif [ 9.38 KiB | Viewed 599 times ]

Attachment:
6502_SPdec.gif
6502_SPdec.gif [ 6.21 KiB | Viewed 599 times ]
Я сразу сделал карту памяти УВВ, соответствующую "Специалисту_МХ" - 32 байта
по адресам 0FFE0...0FFFF дешифруются по 4 байта причем верхние 8 байт из-за
специфики 6502 работают сложнее: на чтение - это байты из ПЗУ, у 6502 здесь
основные вектора запуска и прерываний:
Code:
.segment "VECTS"
.org $FFF8
  .word  $AA55    ;
  .word  Reset    ; NMI
  .word  Reset    ; RESET
  .word  Reset    ; IRQ

На запись эти ячейки работают в порты вывода - у "Специалиста_МХ" здесь
переключатель страниц, работает только на запись. Сюда же можно перекинуть
и другие порты "только на запись".

На первом скриншоте видно, как оператором BASIC POKE 65535,85 в порт 0FFFH
записано число 55Н.

_________________
iLavr


12 Jul 2018 12:26
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Если у кого есть желание поиграть в OSI 6502 MICROSOFT BASIC на процессоре
6502 из логики - прилагаю файлы проекта:
Attachment:
6502_BAS.zip [112.84 KiB]
Downloaded 12 times


Скорость работы BASIC даже на моём дохлом по нынешним меркам ноутбуке PII - 366 MHz
ПРИЕМЛЕМАЯ! Скорость работы ассемблерных программ - хорошая...

Прилагаю также мануал по OSI 6502 MICROSOFT BASIC:
Attachment:
8K-OSI-BASIC.pdf [597.89 KiB]
Downloaded 9 times

Как всё раньше было просто - ВСЕГО 16 станиц :o - и всё понятно! :wink:

_________________
iLavr


12 Jul 2018 12:31
Profile
Fanat

Joined: 20 Sep 2015 03:50
Posts: 58
Reply with quote
Доброго времени суток.
Написал эмулятор 6502 на микроконтроллере.
Подключил "ROM" как раз "OSI 6502 MICROSOFT BASIC", код взял с сайта "Grand"
Что то пошло не так. Результат работы эмулятора всегда один.
"?0M ERROR"
"MEMORY SIZE?"

Свои программки эмулируются вполне правильно.
Для этого пришлось написать потоковый Дисассемблер.
Исполняемый код соответствует дисассемлерному листингу.
Скорей всего ошибка в моей логиге интрепретации команды 6502.
Как выловить ошибку я не пойму.
Может есть у кого тест всех команд 6502 на асме.

На фото листинг потокового дисассембела.
Attachment:
DisAsm_Code_6502.jpg
DisAsm_Code_6502.jpg [ 91.92 KiB | Viewed 594 times ]



Lavr: О том, как найти нужное на форуме, перенёс сюда: ПОИСК ПО ФОРУМУ


12 Jul 2018 13:49
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
И вот еще один момент может повлиять на поведение этого BASICА.
В исходниках от Grant Searle стартовый код вот такой:
Code:
; STARTUP AND SERIAL I/O ROUTINES ===========================================================
; BY G. SEARLE 2013 =========================================================================
ACIA := $A000
ACIAControl := ACIA+0
ACIAStatus := ACIA+0
ACIAData := ACIA+1

.segment "IOHANDLER"
 .org $FF00
Reset:
  LDX     #STACK_TOP
  TXS

Поскольку я менял адрес ACIA := $A000 на ACIA := $FFF4, я этот BASIC перекомпилировал,
ну и поскольку глюки при старте у меня редко, но случались, я добавил в самое начало кода
две строчки, которые обычно есть почти всегда, но почему их вставляют, мне никто не сказал... :wink:
Code:
        SEI                     ; Запрет маск. прерываний INT
        CLD                     ; Сброс десятичного режима 

Не знаю, насколько это серьёзно - с одной стороны, прерываний вроде нет. С другой стороны -
процессоры-то самодельные, может что-то ненароком "отлавливают".

Так что стартовый код BASICА у меня теперь вот такой:
Code:
; STARTUP AND SERIAL I/O ROUTINES ===========================================================
; BY G. SEARLE 2013 =========================================================================
ACIA := $FFF4
ACIAControl := ACIA+0
ACIAStatus := ACIA+0
ACIAData := ACIA+1

.segment "IOHANDLER"
 .org $FF00
Reset:
  SEI        ; disable IRQs
  CLD        ; disable decimal mode

  LDX     #STACK_TOP
  TXS


P.S. Да, и коды ошибок есть в мануале BASICА, который я выложил постом выше.
Но
"?0M ERROR" какая-то нехарактерная ошибка, если в памяти ещё нет программы... :-?

_________________
iLavr


12 Jul 2018 17:02
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
kuber wrote:
Скорей всего ошибка в моей логиге интрепретации команды 6502.
Как выловить ошибку я не пойму.
Может есть у кого тест всех команд 6502 на асме.
Lavr wrote:
Есть такой тест прямо в этой ветке - называется Functional Test for the NMOS 6502.
...
я забыл, должен он работать в ОЗУ или в ПЗУ. Но - разберусь позже.

Разобрался, поскольку как раз тестирую свою модель 6502 под Proteus.

Тест, проверенный на работоспособность, здесь в архиве:
Attachment:
6502_func_test.zip [66.04 KiB]
Downloaded 11 times

В нем 2 файла: 6502_func.bin - бинарный код самогО теста и 6502_functional_test.lst - листинг
теста, по которому находим ошибку.

6502_func.bin - должен находиться по адресу $800, так он скомпилирован.
Использует ячейки ОЗУ в zeropage с адреса $0A и с адреса $0600.
Вектора IRQ и NMI должны указывать на адрес $0600.

Тест ничего никуда не выводит, он просто зацикливается на месте при ошибке, поэтому надо
следить за шиной адреса: когда она "завертелась" надолго на одном адресе - это ошибка.
Характер ошибки находим в 6502_functional_test.lst по адресу зацикливания.

Я для себя сделал вот такую конструкцию:
Attachment:
Test6502.gif
Test6502.gif [ 23.69 KiB | Viewed 486 times ]
Отслеживаю текущий адрес, байт на запись и байт на чтение.

У себя я одну ошибку уже нашел, хотя и некритичную, но смешно, что ту же самую, что и в прошлый
раз - её допускают многие: поведение одного из флагов не такое, как обычно представляется.
Надо будет посмотреть... этот Klaus Dorman мне тогда всё объяснил.

_________________
iLavr


19 Jul 2018 11:55
Profile
Fanat

Joined: 20 Sep 2015 03:50
Posts: 58
Reply with quote
Доброго времени суток.
В моём эмуляторе используется внешняя "RAM" 64Kb, в которую я копирую исполнительный "rom" и
начинаю эмуляцию "6502" по адресу ресет - 0xFFFC
Я правильно понимаю, что адрес точки входа в тест "Functional Test for the NMOS 6502" - 0x0800.???
У меня по второму "UART" в режиме теста выводится потоковый дисассемблер.
Если идёт зацикливания - то там значит и есть проблема?.
А если нет ошибки то как должен завершится тест? или он бесконечен.
Проверить смогу только на следующей недели.


19 Jul 2018 13:12
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
kuber wrote:
В моём эмуляторе используется внешняя "RAM" 64Kb, в которую я копирую исполнительный "rom" и
начинаю эмуляцию "6502" по адресу ресет - 0xFFFC
По адресу "ресет" - 0xFFFC и должно быть 0x0800 в нотации ассемблеров 6502 - $800.
kuber wrote:
Я правильно понимаю, что адрес точки входа в тест "Functional Test for the NMOS 6502" - 0x0800.???
Правильно.
kuber wrote:
Если идёт зацикливания - то там значит и есть проблема?.
Верно! :wink:
kuber wrote:
А если нет ошибки то как должен завершится тест?
Ну вы хоть загляните сначала в то, что вам выложили,
там же ясно написано: :lol:
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 *************************************

_________________
iLavr


19 Jul 2018 13:29
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
У себя я одну ошибку уже нашел, хотя и некритичную, но смешно, что ту же самую, что и в прошлый
раз - её допускают многие: поведение одного из флагов не такое, как обычно представляется.

Во! Вспомнил всё! Totall Recall ! :mrgreen:
Quote:
The flags are copied to memory in this arrangement:

Bit 7: Negative
Bit 6: Overflow
Bit 5: Always set
Bit 4: Clear if interrupt vectoring, set if BRK or PHP
Bit 3: Decimal mode (exists for compatibility, does not function on the Famicom/NES's 2A03/2A07)
Bit 2: Interrupt disable
Bit 1: Zero
Bit 0: Carry

Note bits 4 and 5. This means that the following will put $30 into A, not 0:
LDA #$00
PHA ; pushes $00 on stack
PLP ; clears all 6 status flags
PHP ; pushes $30 on stack
PLA ; pops the $30 off the stack

На этом попадаются все начинающие эмуляторщики обычно! :lol:

Если мы забросим в стек 00Н и прочитаем его из стека в регистр флагов,
то регистр флагов не будет = 00Н, а будет равен 30Н !!!

Это противоречит обычной логике, но bits 4 and 5 так сбросить нельзя! :o
Просто регистр флагов - это не совсем обычный регистр в 6502... :wink:

Нормальной работе процессора это не мешает практически, но тест from
Klaus Dorman
- это очень скурпулёзный тест 6502! 8)

_________________
iLavr


19 Jul 2018 16:37
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
...но тест from Klaus Dorman - это очень скурпулёзный тест 6502! 8)

Я сам уже несколько подзабыл особенности этого теста, поскольку сам я его тогда совсем не знал,
а г-н Klaus Dorman помог мне в тот момент и скомпилировал свой тест под ту задачу, котрой
я тогда занимался - эмулятор 6502 на JS.

Поэтому пришлось разобраться с этим тестом заново и правильный, рабочий вариант находится
в этом архиве:
Attachment:
6502_8.zip [212.93 KiB]
Downloaded 6 times
Это файл 6502_0000.bin. Он должен быть загружен с адреса 0000H в ОЗУ тестируемой системы.
Стартовый адрес теста - 800H, вектора прерываний должны указывать на адрес 600H.

ТЕСТ РАБОТАЕТ В ОЗУ И ТОЛЬКО В ОЗУ, ПОСКОЛЬКУ В НЁМ САМОМОДИФИЦИРУЮЩИЙСЯ КОД!
Поэтому мне пришлось применить простой контроллер ПДП для его загрузки.

В области ZERO PAGE у теста расположены паттерны для различных проверок, я их сначала некорректно
отрезал, в надежде, что тест возобновляет их сам - это оказалось не так. :-?

Тест не привязан к какой-либо ОС и при ошибке зацикливается в месте ошибки. В чем состоит ошибка
следует смотреть по листингу теста.
Выкладываю здесь также файл листинга с моим прохождением теста для Proteus модели 6502:
Attachment:
6502_functional_test.txt [678.83 KiB]
Downloaded 23 times

Найденные ошибки я помечал как %%%% - % иначе не встречается. :wink:
Code:
3644 : d0fe            >        bne *           ;failed not equal (non zero)
%%%%                   >                        ; CHECKED !!!


К сожалению, Functional Test for the NMOS 6502 нельзя выполять с произвольной точки вхождения, :osad:
каждый раз приходится начинать либо сначала, либо с большого раздела, поскольку тест самомодифицирующийся
и тест использует результаты предыдущих вычислений.

Поэтому для оперативного тестирования аппаратного прохождения отдельных микрокодов ПЗУ микрокоманд
пришлось организовать вот такой "полигон", где исполнение отдельной микрокоманды можно рассмотерь
в пошаговом режиме.
Attachment:
6502_tst.gif
6502_tst.gif [ 33.92 KiB | Viewed 311 times ]

В загруженном выше архиве - это проект: 6502_tst.DSN

_________________
iLavr


06 Aug 2018 08:28
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 39 posts ]  Go to page Previous  1, 2, 3

Who is online

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