Эмуляторы и аналоги 6502

MOS Technology / Commodore / Apple II / NES etc.

Moderator: Lavr

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

Re: Эмуляторы и аналоги 6502

Post by Lavr »

Поскольку модель 6502 работоспособна, решил проверить её на чем-то серьёзном,
чтобы можно было ощутимо увидеть результат.

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

 Grant Searle Sin(A)
6502_SinA.gif

6502_SPdec.gif
Я сразу сделал карту памяти УВВ, соответствующую "Специалисту_МХ" - 32 байта
по адресам 0FFE0...0FFFF дешифруются по 4 байта причем верхние 8 байт из-за
специфики 6502 работают сложнее: на чтение - это байты из ПЗУ, у 6502 здесь
основные вектора запуска и прерываний:

Code: Select all

.segment "VECTS"
.org $FFF8
  .word  $AA55    ;
  .word  Reset    ; NMI
  .word  Reset    ; RESET
  .word  Reset    ; IRQ
На запись эти ячейки работают в порты вывода - у "Специалиста_МХ" здесь
переключатель страниц, работает только на запись. Сюда же можно перекинуть
и другие порты "только на запись".

На первом скриншоте видно, как оператором BASIC POKE 65535,85 в порт 0FFFH
записано число 55Н.
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

Post by Lavr »

Если у кого есть желание поиграть в OSI 6502 MICROSOFT BASIC на процессоре
6502 из логики - прилагаю файлы проекта:
6502_BAS.zip
Скорость работы BASIC даже на моём дохлом по нынешним меркам ноутбуке PII - 366 MHz
ПРИЕМЛЕМАЯ! Скорость работы ассемблерных программ - хорошая...

Прилагаю также мануал по OSI 6502 MICROSOFT BASIC:
8K-OSI-BASIC.pdf
Как всё раньше было просто - ВСЕГО 16 станиц :o - и всё понятно! :wink:
You do not have the required permissions to view the files attached to this post.
iLavr
kuber
Fanat
Posts: 85
Joined: 20 Sep 2015 02:50

Re: Эмуляторы и аналоги 6502

Post by kuber »

Доброго времени суток.
Написал эмулятор 6502 на микроконтроллере.
Подключил "ROM" как раз "OSI 6502 MICROSOFT BASIC", код взял с сайта "Grand"
Что то пошло не так. Результат работы эмулятора всегда один.
"?0M ERROR"
"MEMORY SIZE?"

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

На фото листинг потокового дисассембела.
DisAsm_Code_6502.jpg

Lavr: О том, как найти нужное на форуме, перенёс сюда: ПОИСК ПО ФОРУМУ
You do not have the required permissions to view the files attached to this post.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Эмуляторы и аналоги 6502

Post by Lavr »

И вот еще один момент может повлиять на поведение этого BASICА.
В исходниках от Grant Searle стартовый код вот такой:

Code: Select all

; 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: Select all

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

Так что стартовый код BASICА у меня теперь вот такой:

Code: Select all

; 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
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Эмуляторы и аналоги 6502

Post by Lavr »

kuber wrote:Скорей всего ошибка в моей логиге интрепретации команды 6502.
Как выловить ошибку я не пойму.
Может есть у кого тест всех команд 6502 на асме.
Lavr wrote:Есть такой тест прямо в этой ветке - называется Functional Test for the NMOS 6502.
...
я забыл, должен он работать в ОЗУ или в ПЗУ. Но - разберусь позже.
Разобрался, поскольку как раз тестирую свою модель 6502 под Proteus.

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

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

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

Я для себя сделал вот такую конструкцию:
Test6502.gif
Отслеживаю текущий адрес, байт на запись и байт на чтение.

У себя я одну ошибку уже нашел, хотя и некритичную, но смешно, что ту же самую, что и в прошлый
раз - её допускают многие: поведение одного из флагов не такое, как обычно представляется.
Надо будет посмотреть... этот Klaus Dorman мне тогда всё объяснил.
You do not have the required permissions to view the files attached to this post.
iLavr
kuber
Fanat
Posts: 85
Joined: 20 Sep 2015 02:50

Re: Эмуляторы и аналоги 6502

Post by kuber »

Доброго времени суток.
В моём эмуляторе используется внешняя "RAM" 64Kb, в которую я копирую исполнительный "rom" и
начинаю эмуляцию "6502" по адресу ресет - 0xFFFC
Я правильно понимаю, что адрес точки входа в тест "Functional Test for the NMOS 6502" - 0x0800.???
У меня по второму "UART" в режиме теста выводится потоковый дисассемблер.
Если идёт зацикливания - то там значит и есть проблема?.
А если нет ошибки то как должен завершится тест? или он бесконечен.
Проверить смогу только на следующей недели.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Эмуляторы и аналоги 6502

Post by Lavr »

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: 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 *************************************
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Эмуляторы и аналоги 6502

Post by Lavr »

Lavr wrote:У себя я одну ошибку уже нашел, хотя и некритичную, но смешно, что ту же самую, что и в прошлый
раз - её допускают многие: поведение одного из флагов не такое, как обычно представляется.
Во! Вспомнил всё! Totall Recall ! :mrgreen:
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
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Эмуляторы и аналоги 6502

Post by Lavr »

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

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

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

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

Тест не привязан к какой-либо ОС и при ошибке зацикливается в месте ошибки. В чем состоит ошибка
следует смотреть по листингу теста.
Выкладываю здесь также файл листинга с моим прохождением теста для Proteus модели 6502:
6502_functional_test.txt
Найденные ошибки я помечал как %%%% - % иначе не встречается. :wink:

Code: Select all

3644 : d0fe            >        bne *           ;failed not equal (non zero)
%%%%                   >                        ; CHECKED !!!
К сожалению, Functional Test for the NMOS 6502 нельзя выполять с произвольной точки вхождения, :osad:
каждый раз приходится начинать либо сначала, либо с большого раздела, поскольку тест самомодифицирующийся
и тест использует результаты предыдущих вычислений.

Поэтому для оперативного тестирования аппаратного прохождения отдельных микрокодов ПЗУ микрокоманд
пришлось организовать вот такой "полигон", где исполнение отдельной микрокоманды можно рассмотерь
в пошаговом режиме.
6502_tst.gif
В загруженном выше архиве - это проект: 6502_tst.DSN
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 emulator in JavaScript

Post by Lavr »

Shaos wrote:
Lavr wrote:6502 compatible assembler and emulator in JavaScript

6502 - с компилятором ASM и эмулятором на JavaScript.
...
Забавно! Весьма забавно! И работает! :o

Image
а дебиане теперь есть скринсейвер, написанный с этого эмулятора (он просто по кругу гоняет все приложения, написанные под него) - теперь только он у меня и крутится :)
Игрушку эту еще и на Андроид перенесли, в Гугл Плэй её можно найти вот так:
Learn-6502.PNG
Функционал практически полностью аналогичный.
Learn 6502.PNG
Вот только программировать на смартфоне почему-то очень уныло и не кайф... :-?
У меня и на кнопочном телефоне был неплохой эмулятор MOS 6502, но и там программировать как-то неудобно было... :(


P.S. Вот только размер этой забавы под Андроид стал 12.3 МБайт - афигеть! :o
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
shiny
Maniac
Posts: 324
Joined: 14 Oct 2023 06:59

Re: Эмуляторы и аналоги 6502

Post by shiny »

Emul816or - эмулятор 65816. Жаль, что на х64