6502

MOS Technology / Commodore / Apple II / NES etc.

Moderator: Lavr

User avatar
shoorick
Doomed
Posts: 487
Joined: 05 Nov 2007 05:08
Location: Украина

Re: 6502

Post by shoorick »

вот чего я еще узнал:
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 со своими тригогами отдыхает :)
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: 6502

Post by Lavr »

Ну то есть какая-то неуверенность у программеров присутствует, что по аппаратному RESET
процессор сам запрещает прерывания, поэтому первой командой ставят:

Code: Select all

    SEI          ; disable IRQs
Я, правда, мучаю модель этого проца на логике 74, но заметил, что SEI влияет...
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: 6502

Post by Lavr »

Lavr wrote:Подавляющее большинство программ для NES начинаются вот так:

Code: Select all

        SEI          ; disable IRQs
        CLD          ; disable decimal mode
Ну, с CLD - более менее понятно:
6502.org Tutorials wrote: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
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: 6502

Post by Lavr »

shoorick wrote:... а люди мало того, что часто находятся в плену предрассудков, да еще и имеют свойство навязывать их другим.
Нашел я автора этого "предрассудка":

Code: Select all

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

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

Вот стартовый код его Woz Monitor-а:

Code: Select all

;-------------------------------------------------------------------------
;  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
User avatar
Shaos
Admin
Posts: 23990
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 6502

Post by Shaos »

Вот тут чувак сделал 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
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: 6502

Post by Lavr »

Lavr wrote:Я тут несколько озадачился одним вопросом и нигде ответа не нахожу... :-?

Подавляющее большинство программ для NES начинаются вот так:

Code: Select all

        SEI          ; disable IRQs
        CLD          ; disable decimal mode
или

Code: Select all

        SEI                     ; Запрет маск. прерываний INT
        CLD                     ; Сброс десятичного режима
Половину этой "зогатки" вот здесь: http://hype.retroscene.org/blog/969.html один человек весьма
доходчиво разъяснил:
Десятичная арифметика полезная для калькуляторов и BCD-архифметики в Ricoh 2A03 была выпилена (часто встречается мнение, что с целью обхода патентов), поэтому общепринятой практикой является выключение её командой CLD (CLear Decimal flag) в начале программы. Это вроде как нужно не для логики процесса, т.к. этот флаг в Ricoh просто ни на что не влияет, а больше для того чтобы не смущать отладчики.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: 6502

Post by Lavr »

Lavr wrote:
Lavr wrote:Я тут несколько озадачился одним вопросом и нигде ответа не нахожу... :-?

Подавляющее большинство программ для NES начинаются вот так:

Code: Select all

        SEI          ; disable IRQs
        CLD          ; disable decimal mode
или

Code: Select all

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

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

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

Code: Select all

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

Но когда я начал ту же программу писать под 6502, такой подпрограммы у меня не было,
поэтому счетчик ходов я написал в BCD-арифметике:

Code: Select all

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

        LDA MOVALL;--- COUNT
        JSR $FDC1 ;--- HEX
        LDA MOVALL+1
        JSR $FDC1 ;--- HEX
        JSR ZSTP  ;--- steps
И всё было хорошо, только не надо забывать, что если не сделать CLD на старте, то какой-нибудь
длинный счётчик в программе 6502 будет считать в BCD-арифметике и это приведёт к ошибкам!

Поэтому в начале программы CLD я выполнял, чтобы считать обычным образом:

Code: Select all

;-------START-----------------------
START   CLD
        JSR INIT ;--- Init Vars
        LDA #$8C ;--- CLS
        JSR $FDD7;--- DISP
А BCD-счетчик обрамлён включением и выключением BCD-арифметики:

Code: Select all

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