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-арифметика выключена! Навечно... навсегда!
