We've just updated MediaWiki and its underlying software. If anything doesn't look or work quite right, please mention it to us. --RanAS
DAA (SPC700): Difference between revisions
From SnesLab
(accumulator addressing) |
(clarify first sentence) |
||
(18 intermediate revisions by the same user not shown) | |||
Line 14: | Line 14: | ||
{| class="wikitable" style="float:right;clear:right;width:30%" | {| class="wikitable" style="float:right;clear:right;width:30%" | ||
!colspan="8"|Flags | !colspan="8"|Flags Affected | ||
|+ | |||
|[[Negative Flag|N]] | |||
|[[Overflow Flag|V]] | |||
|[[Direct Page Flag|P]] | |||
|[[Break Flag|B]] | |||
|[[Half-Carry Flag|H]] | |||
|[[Interrupt Enable Flag|I]] | |||
|[[Zero Flag|Z]] | |||
|[[Carry Flag|C]] | |||
|+ | |+ | ||
|N | |N | ||
|. | |. | ||
|. | |. | ||
Line 31: | Line 31: | ||
|. | |. | ||
|. | |. | ||
| | |Z | ||
| | |C | ||
|} | |} | ||
'''DAA''' (Decimal Adjust for Addition) is an [[SPC700]] instruction that | '''DAA''' (Decimal Adjust for Addition) is an [[SPC700]] instruction that [[BCD]]-corrects a sum: | ||
# If either the [[carry flag]] is set or the [[accumulator]] exceeds 0x99, add 0x60 to the accumulator and set the carry flag. This corrects the tens column (but perhaps not completely). | |||
# Then, if either the [[half-carry flag]] is set, or the lower nibble of the accumulator exceeds 0x09, add 0x06 to the accumulator. This corrects the ones column and possibly increments the tens column by one. | |||
DAA assumes the value in the accumulator is encoded in binary/hexadecimal (with any value in the range $00 to $FF) because that is what the [[ADC (SPC700)|ADC]] command can output. But the inputs to ADC are supposed to be in BCD. After DAA, the accumulator value will be in BCD once again where both nybbles are in the range 0 to 9. The SPC700 has no [[decimal mode]], so that is why this command is important when working with decimal data. | |||
==== Syntax ==== | |||
<pre> | |||
DAA | |||
DAA A | |||
</pre> | |||
=== See Also === | === See Also === | ||
* [[DAS]] | * [[DAS]] | ||
* [[ | * [[SED]] | ||
* [[CLD]] | |||
=== External Links === | === External Links === | ||
* Official Super Nintendo development manual on DAA: [https://archive.org/details/SNESDevManual/book1/page/n233 Appendix C-8 of Book I] | * Official Super Nintendo development manual on DAA: Table C-14 in [https://archive.org/details/SNESDevManual/book1/page/n233 Appendix C-8 of Book I] | ||
* [https://archive.org/details/SNESDevManual/book1/page/n180 page 3-8-2 of Book I] lbid | * [https://archive.org/details/SNESDevManual/book1/page/n180 page 3-8-2 of Book I], lbid | ||
* ares source code, SPC700::instructionDecimalAdjustAdd | * ares source code, SPC700::instructionDecimalAdjustAdd | ||
* anomie: https://github.com/yupferris/TasmShiz/blob/8fabc9764c33a7ae2520a76d80ed7220bb939f12/spc700.txt#L409 | |||
* http://www.righto.com/2023/01/understanding-x86s-decimal-adjust-after.html?m=1 | |||
[[Category:ASM]] | [[Category:ASM]] | ||
[[Category:SPC700]] | [[Category:SPC700]] | ||
[[Category:Decimal Compensation Commands]] | [[Category:Decimal Compensation Commands]] |
Latest revision as of 08:18, 23 September 2024
Basic Info | |||||||
---|---|---|---|---|---|---|---|
Addressing Mode | Opcode | Length | Speed | ||||
Accumulator | DF | 1 byte | 3 cycles |
Flags Affected | |||||||
---|---|---|---|---|---|---|---|
N | V | P | B | H | I | Z | C |
N | . | . | . | . | . | Z | C |
DAA (Decimal Adjust for Addition) is an SPC700 instruction that BCD-corrects a sum:
- If either the carry flag is set or the accumulator exceeds 0x99, add 0x60 to the accumulator and set the carry flag. This corrects the tens column (but perhaps not completely).
- Then, if either the half-carry flag is set, or the lower nibble of the accumulator exceeds 0x09, add 0x06 to the accumulator. This corrects the ones column and possibly increments the tens column by one.
DAA assumes the value in the accumulator is encoded in binary/hexadecimal (with any value in the range $00 to $FF) because that is what the ADC command can output. But the inputs to ADC are supposed to be in BCD. After DAA, the accumulator value will be in BCD once again where both nybbles are in the range 0 to 9. The SPC700 has no decimal mode, so that is why this command is important when working with decimal data.
Syntax
DAA DAA A
See Also
External Links
- Official Super Nintendo development manual on DAA: Table C-14 in Appendix C-8 of Book I
- page 3-8-2 of Book I, lbid
- ares source code, SPC700::instructionDecimalAdjustAdd
- anomie: https://github.com/yupferris/TasmShiz/blob/8fabc9764c33a7ae2520a76d80ed7220bb939f12/spc700.txt#L409
- http://www.righto.com/2023/01/understanding-x86s-decimal-adjust-after.html?m=1