1 Отредактировано USR (26-03-2018 01:09)

Тема: Ошибки в эмуляторах

Идеала не бывает. Это понятно. Но случаются и вполне исправимые ошибки. И не только у меня))

Вот одна. В эмуляторе Олега Одинцова, есть возможность подключить альтернативный модуль эмуляции процессора. М6502 называется (авторы Marat Fayzullin и Alex Krasivsky). Там ошибка счета в двоично-десятичном режиме.

если запустить такой код:
---
SED
LDA#$99
CLC
ADC#$01
----

В аккумуляторе будет вовсе не ноль. И перенос не возникает. Критично наверное для бейсика...

Post's attachments

t9.png, 22.04 kb, 516 x 516
t9.png 22.04 kb, 21 downloads since 2018-03-25 

2 Отредактировано Voldemar0 (26-03-2018 07:02)

Re: Ошибки в эмуляторах

Насколько я помню, в этом эмуляторе и в дефолтном процессоре есть ошибки DEC.
Что-то в тонкостях управления флагами.
Я писал Олегу, об этом, давно, но ответа не получил.

Где-то у эпловодов встречал написанную на асме прогу, которая проверяет все фичи проца на предмет десятичного режима. Я по ней свои процы эмуляторы проверял и пробовал её же на реальном железе.

3

Re: Ошибки в эмуляторах

Теперь у меня есть Агат, спасибо Игорю. И сразу нашел такой косячок:

Запускаю таймерные прерывания. При этом IRQ запрещено командой SEI.

Обработчик таймерных выглядит так

NMI
      STA$C020 ; отключаю таймерные, дабы случайно не зациклиться.

       .
       .
       . обрабатываю таймерное прерывание NMI
       .
       .
       STA$C040; включаю таймерные прерывания
       RTI

Т.е. в обработчике прерываний NMI отключал таймерные прерывания, а потом включал.

Так вот, в эмуляторе все путем, частота таймерных прерываний около 50Гц

А в реальном Агате фиг! Получается гораздо-гораздо выше. Такое ощущение, что STA$C040 вызывает еще одно NMI.  И так до тех пор, пока синхроимпульс NMI не закончится...

Короче убрал эти выключения/включения, стало все нормально.

4 Отредактировано Voldemar0 (19-06-2018 17:40)

Re: Ошибки в эмуляторах

Я вполне допускаю, что в схемотехнике, действительно, включение может вызывать дополнительный перепад NMI. Но тут не ясно, почему обработчик настолько долго выполняется, что нужно гасить таймер на время его исполнения ? Если он настолько сложный и долгий, то логичнее в обработчике только ставить какой нибудь флаг, а где-то в проге проверять его появление... Или сделать обработчик реентерабельным:

NMI:
 bit flag      ; если флаг поднят - обработчик уже исполняется
 bmi @exit

 sec
 ror flag      ; поднять флаг
<тут какой-то длинный обработчик>
 lsr flag      ; опустить флаг

@exit:
 rti

5

Re: Ошибки в эмуляторах

Voldemar0 пишет:

Если он настолько сложный и долгий, то логичнее в обработчике только ставить какой нибудь флаг, а где-то в проге проверять его появление... Или сделать обработчик реентерабельным:

Не, как извернуться я знаю)) Да и отключал я NMI для отладки, сейчас уже не нужно. Забыл убрать и вот на реальном железе оно вылезло...

6 Отредактировано LeoN (22-06-2018 07:23)

Re: Ошибки в эмуляторах

Сергей, это не хардварный косяк. Следую схемотехнике такая фича и должна проявляться. А вот несоответствие этому в эмуляторе - косяк!
После триггера включения таймерных прерываний стоит буферный элемент с третьим состоянием на сигналы запроса прерываний к процу/слоту. Посмотри на скважность этих сигналов - тут и тут.
Выключение и затем опять включение (пока выход счетчика еще в единице, так как буфер с инверсией) создает новый отрицательный фронт NMI, который тут же и чухается. В итоге быстродействие падает до 18%.
А вообще, обработчик должен быть как можно коротким и быстрым.

Турбо АГАТ-9/16 (65C802 CPU, 2.8 Маха), MSX2 Yamaha YIS503IIIR.

7

Re: Ошибки в эмуляторах

LeoN пишет:

Выключение и затем опять включение (пока выход счетчика еще в нуле) создает новый отрицательный фронт NMI, который тут же и чухается. В итоге быстродействие падает до 18%.
А вообще, обработчик должен быть как можно коротким и быстрым.

Ну я так примерно и предполагал.

Обработчик у меня уже относительно быстрый. проблемы нет. просто заметил косяк эмулятора и сюда написал.

8

Re: Ошибки в эмуляторах

Voldemar0 пишет:

Насколько я помню, в этом эмуляторе и в дефолтном процессоре есть ошибки DEC.
Что-то в тонкостях управления флагами.
Я писал Олегу, об этом, давно, но ответа не получил.

Где-то у эпловодов встречал написанную на асме прогу, которая проверяет все фичи проца на предмет десятичного режима. Я по ней свои процы эмуляторы проверял и пробовал её же на реальном железе.

так какую именно прогу-то пользовал ?

9

Re: Ошибки в эмуляторах

http://www.6502.org/tutorials/decimal_mode.html
http://www.6502.org/tutorials/vflag.html