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, счетчик ходов у меня был реализован очень просто:
Это потому как я априори знал, что есть системная процедура вывода на экран слова в десятичном виде.
Но когда я начал ту же программу писать под 
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-арифметика выключена! Навечно... навсегда!  
