Decimal Mode: Difference between revisions
(Flags invalid on 6502) |
(mention RTI and PLP) |
||
Line 1: | Line 1: | ||
'''Decimal mode''' is one of the [[SNES]] CPU's processor flags. It is bit 3 of the [[status register]]. Toggling it on/off will only affect the instructions '''[[ADC]]''' and '''[[SBC]]'''. To toggle decimal mode on/off, use '''[[SED]]''' (Set decimal mode) and '''[[CLD]]''' (clear decimal mode) | '''Decimal mode''' is one of the [[SNES]] CPU's processor flags. It is bit 3 of the [[status register]]. Toggling it on/off will only affect the instructions '''[[ADC]]''' and '''[[SBC]]'''. To toggle decimal mode on/off, use '''[[SED]]''' (Set decimal mode) and '''[[CLD]]''' (clear decimal mode) | ||
On the [[65c816]], it is cleared on reset.<sup>[2]</sup> [[BRK]] and [[COP]] clear it as well. | On the [[65c816]], it is cleared on reset.<sup>[2]</sup> [[BRK]] and [[COP]] clear it as well. [[RTI]] and [[PLP]] can affect the decimal mode flag too. | ||
The [[negative flag|negative]], [[overflow flag|overflow]], and [[zero flag|zero]] flags are invalid in decimal mode on the 6502.<sup>[3]</sup> | The [[negative flag|negative]], [[overflow flag|overflow]], and [[zero flag|zero]] flags are invalid in decimal mode on the 6502.<sup>[3]</sup> |
Revision as of 00:19, 20 September 2024
Decimal mode is one of the SNES CPU's processor flags. It is bit 3 of the status register. Toggling it on/off will only affect the instructions ADC and SBC. To toggle decimal mode on/off, use SED (Set decimal mode) and CLD (clear decimal mode)
On the 65c816, it is cleared on reset.[2] BRK and COP clear it as well. RTI and PLP can affect the decimal mode flag too.
The negative, overflow, and zero flags are invalid in decimal mode on the 6502.[3]
There are no conditional branch instructions that examine the decimal flag (such as BDS or BDC).[5]
Processes
Let's just assume A is 8-bit and holds the value #$00. When one is doing ADC #$0C for example, the following steps will take place.
- Take the parameter after ADC
- Convert it to Decimal
- Add the conversion to A (execute ADC)
- If A turns out to have a hexadecimal number after the addition, convert it it to a decimal number again.
In this case, #$0C gets converted to 12. Since $0C equals to 12, doing ADC #$12 would give you the same result.
Same story with SBC, except SBC subtracts of course.
Example usage of ADC:
LDA #$09 ;A = $09 CLC ;Clear carry flag ADC #$02 ;A = $11
The decimal mode has been documented more thoroughly in Ersanio's ASM tutorial V2.1.
See Also
References
- Labiak, William. Appendix C, page 357. conversion table
- Eyes & Lichty, page 262
- lbid, page 44
- Pickens, John. NMOS 6502 Opcodes. http://www.6502.org/tutorials/6502opcodes.html#DFLAG
- Eyes & Lichty, page 148
- Clark, Bruce. http://www.6502.org/tutorials/decimal_mode.html