nedoPC.org

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



Reply to topic  [ 82 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6
6502 
Author Message
Doomed
User avatar

Joined: 05 Nov 2007 05:08
Posts: 487
Location: Украина
Reply with quote
вот чего я еще узнал:
Quote:
If the processor happens to be in BCD mode when a hardware interrupt occurs it will not revert to binary mode. This characteristic could result in obscure bugs in the interrupt service routine if it fails to clear BCD mode before performing any arithmetic operations, for example, the Commodore 64's KERNAL did not correctly handle this processor characteristic, requiring that IRQs be disabled or re-vectored during BCD math operations. This issue was addressed in the CMOS derivatives as well.

т.е., как я понил, хорошим тоном перед отключением режима BCD было дизейбливание прерываний. про изменение BCD при сбросе там ничё не сказано.
++++++++++++++++++
точнее все не так... короче, тот еще проц! б3-34 со своими тригогами отдыхает :)


14 Jul 2018 13:51
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Ну то есть какая-то неуверенность у программеров присутствует, что по аппаратному RESET
процессор сам запрещает прерывания, поэтому первой командой ставят:
Code:
    SEI          ; disable IRQs

Я, правда, мучаю модель этого проца на логике 74, но заметил, что SEI влияет...

_________________
iLavr


14 Jul 2018 13:58
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
Подавляющее большинство программ для NES начинаются вот так:
Code:
        SEI          ; disable IRQs
        CLD          ; disable decimal mode

Ну, с CLD - более менее понятно:
On the 6502, a BRK instruction, an IRQ interrupt, and an NMI interrupt do not affect the D flag, and after a RESET interrupt, the D flag is undefined.
Значит D flag надо "определить"...

А вот насчет I flag - вроде как разночтения для MOS, Synertek, Rockwell, WDC 65C02, etc.
Причем разночтения вносит, как ни странно, документация от MOS: :roll:
ghaytack wrote:
It puzzled me as well not finding any mention of it in the MOS hardware manual (it's labelled Frist Edition, August 1975) as I was fully expecting to find it.
То есть, в ранней документации от MOS поведение I flag вроде как не озвучено... :-?

Поэтому рекомендуется для общности начинать программу по вектору RESET с кода SEI .
ghaytack wrote:
So it would seem that if there is any chance of the code being run on older variants of the 6502 than WDC's, it is prudent to start your reset code with SEI.

_________________
iLavr


05 Aug 2018 21:18
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
shoorick wrote:
... а люди мало того, что часто находятся в плену предрассудков, да еще и имеют свойство навязывать их другим.

Нашел я автора этого "предрассудка":
Code:
        SEI          ; disable IRQs
        CLD          ; disable decimal mode
который ещё и навязал этот "предрассудок" на долгие годы всем другим... :-?

Это был не кто иной, как Стив Возняк! :lol:

Вот стартовый код его Woz Monitor-а:
Code:
;-------------------------------------------------------------------------
;  Let's get started
;
;  Remark the RESET routine is only to be entered by asserting the RESET
;  line of the system. This ensures that the data direction registers
;  are selected.
;-------------------------------------------------------------------------
RESET:
                CLD                    ; Clear decimal arithmetic mode
                CLI
                LDY     #%0111.1111    ; Mask for DSP data direction reg
                STY     DSP            ;  (DDR mode is assumed after reset)
                LDA     #%1010.0111    ; KBD and DSP control register mask
                STA     KBDCR          ; Enable interrupts, set CA1, CB1 for
                STA     DSPCR          ;  positive edge sense/output mode.

Видимо, Стив Возняк имел на это веские причины - как никак у него был
в руках оригинальный MOS 6502 тех лет.

Это потом уже налепили всяких клонов 6502, да и "анекдотов насочиняли"... :mrgreen:

_________________
iLavr


10 Aug 2018 11:31
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Вот тут чувак сделал 6502 на логике серии 74AC (200 корпусов) и разогнал до 20 МГц :o

https://hackaday.com/2018/12/15/this-6502-made-from-74-series-logic-can-run-at-20-mhz/

https://c74project.com

_________________
:dj: https://mastodon.social/@Shaos


15 Dec 2018 15:16
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
Я тут несколько озадачился одним вопросом и нигде ответа не нахожу... :-?

Подавляющее большинство программ для NES начинаются вот так:
Code:
        SEI          ; disable IRQs
        CLD          ; disable decimal mode

или
Code:
        SEI                     ; Запрет маск. прерываний INT
        CLD                     ; Сброс десятичного режима

Половину этой "зогатки" вот здесь: http://hype.retroscene.org/blog/969.html один человек весьма
доходчиво разъяснил:
Quote:
Десятичная арифметика полезная для калькуляторов и BCD-архифметики в Ricoh 2A03 была выпилена (часто встречается мнение, что с целью обхода патентов), поэтому общепринятой практикой является выключение её командой CLD (CLear Decimal flag) в начале программы. Это вроде как нужно не для логики процесса, т.к. этот флаг в Ricoh просто ни на что не влияет, а больше для того чтобы не смущать отладчики.

_________________
iLavr


06 Oct 2020 14:18
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
Lavr wrote:
Я тут несколько озадачился одним вопросом и нигде ответа не нахожу... :-?

Подавляющее большинство программ для NES начинаются вот так:
Code:
        SEI          ; disable IRQs
        CLD          ; disable decimal mode
или
Code:
        SEI                     ; Запрет маск. прерываний INT
        CLD                     ; Сброс десятичного режима

Половину этой "зогатки" вот здесь: http://hype.retroscene.org/blog/969.html один человек весьма
доходчиво разъяснил:
Quote:
Десятичная арифметика полезная для калькуляторов и BCD-архифметики в Ricoh 2A03 была выпилена (часто встречается мнение, что с целью обхода патентов), поэтому общепринятой практикой является выключение её командой CLD (CLear Decimal flag) в начале программы. Это вроде как нужно не для логики процесса, т.к. этот флаг в Ricoh просто ни на что не влияет, а больше для того чтобы не смущать отладчики.

В общем смысл этой "зогатки" стал для меня яснее, пока я писал программу под 6502.

Обычный 6502 стартует в состоянии с включенной десятичной BCD-арифметикой.
Это априори очень удобно, если устройство работает с выводом на 7-сегментные индикаторы.
Индикация в этом случае аппаратно предельно проста, но нужно не забывать про это!

Когда я писал программу под К580ВМ80, счетчик ходов у меня был реализован очень просто:
Code:
   LHLD COUNT
   INX  H
   SHLD COUNT

Это потому как я априори знал, что есть системная процедура вывода на экран слова в десятичном виде.

Но когда я начал ту же программу писать под 6502, такой подпрограммы у меня не было,
поэтому счетчик ходов я написал в BCD-арифметике:
Code:
;-------Step count-------------
        SED
        LDA MOVALL+1
        CLC
        ADC #$01
        STA MOVALL+1
        BCC PUT7   ;--- no Carry
        LDA MOVALL
        ADC #$01
        STA MOVALL
PUT7    CLD

А на экран выводил BCD-числа как НЕХ числа:
Code:
        LDA MOVALL;--- COUNT
        JSR $FDC1 ;--- HEX
        LDA MOVALL+1
        JSR $FDC1 ;--- HEX
        JSR ZSTP  ;--- steps

И всё было хорошо, только не надо забывать, что если не сделать CLD на старте, то какой-нибудь
длинный счётчик в программе 6502 будет считать в BCD-арифметике и это приведёт к ошибкам!

Поэтому в начале программы CLD я выполнял, чтобы считать обычным образом:
Code:
;-------START-----------------------
START   CLD
        JSR INIT ;--- Init Vars
        LDA #$8C ;--- CLS
        JSR $FDD7;--- DISP

А BCD-счетчик обрамлён включением и выключением BCD-арифметики:
Code:
;-------Step count-------------
        SED;------- включаем BCD-арифметику
 ...
PUT7    CLD;------- вЫключаем BCD-арифметику

Так что, несмотря на то, что у аналога 6502 - Ricoh 2A03 - BCD-арифметики нет вовсе,
программы под него пишут (и писали) кросс-средствами разработки для 6502, которые просто
не поймут, что BCD-арифметики нет как факт! Именно для этого вносится ясность:
CLD;------- BCD-арифметика выключена! Навечно... навсегда! :lol:

_________________
iLavr


01 Mar 2022 23:03
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 82 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6

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:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.