Overflow Flag: Difference between revisions
(→References: hid archive URL for E&L) |
(PLP and RTI pull V off of stack) |
||
(6 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
* [[CLV]] (always clears it) | * [[CLV]] (always clears it) | ||
* [[BIT]] (becomes bit 6 or bit 14 of operand except in [[immediate addressing]]) | * [[BIT]] (becomes bit 6 or bit 14 of operand except in [[immediate addressing]]) | ||
* [[PLP]] | * [[PLP]] (pulls it off the stack) | ||
* [[RTI]] | * [[RTI]] (pulls it off the stack) | ||
* [[SEP]] (might set it) | * [[SEP]] (might set it) | ||
* [[REP]] (might clear it) | * [[REP]] (might clear it) | ||
Line 12: | Line 12: | ||
Here is how it behaves: | Here is how it behaves: | ||
* When the accumulator is 8 bits wide, V indicates whether the sum/difference of [[ADC]]/[[SBC]] is outside the range of -128 to 127. | * When the [[accumulator]] is 8 bits wide, V indicates whether the sum/difference of [[ADC]]/[[SBC]] is outside the range of -128 to 127. | ||
* When the accumulator is 16 bits wide, V indicates whether the result of [[ADC]]/[[SBC]] is outside the range of -32768 to 32767. | * When the accumulator is 16 bits wide, V indicates whether the result of [[ADC]]/[[SBC]] is outside the range of -32768 to 32767. | ||
Line 24: | Line 24: | ||
[[BVC]] and [[BVS]] both examine the overflow flag to decide whether or not to branch. | [[BVC]] and [[BVS]] both examine the overflow flag to decide whether or not to branch. | ||
The overflow flag is invalid in [[decimal mode]] on the NMOS 6502, but it is valid in the 65c816's decimal mode. | |||
=== See Also === | === See Also === | ||
Line 34: | Line 36: | ||
=== References === | === References === | ||
# [[Eyes & Lichty]], [https://archive.org/details/0893037893ProgrammingThe65816/page/439 page 439] | # [[Eyes & Lichty]], [https://archive.org/details/0893037893ProgrammingThe65816/page/439 page 439] | ||
# lbid, "Branching Based on the Overflow Flag" on [https://archive.org/details/0893037893ProgrammingThe65816/page/150 page 150] | |||
# Clark, Bruce. http://www.6502.org/tutorials/vflag.html | # Clark, Bruce. http://www.6502.org/tutorials/vflag.html | ||
# Shirriff, Ken. The 6502 overflow flag explained mathematically. https://www.righto.com/2012/12/the-6502-overflow-flag-explained.html?m=1 | # Shirriff, Ken. The 6502 overflow flag explained mathematically. https://www.righto.com/2012/12/the-6502-overflow-flag-explained.html?m=1 | ||
Line 40: | Line 43: | ||
# Pickens, John. NMOS 6502 Opcodes. http://www.6502.org/tutorials/6502opcodes.html#VFLAG | # Pickens, John. NMOS 6502 Opcodes. http://www.6502.org/tutorials/6502opcodes.html#VFLAG | ||
# https://forums.nesdev.org/viewtopic.php?t=6331 | # https://forums.nesdev.org/viewtopic.php?t=6331 | ||
# Table 7-1 Caveats of 65c816 datasheet | |||
[[Category:ASM]] | [[Category:ASM]] | ||
[[Category:Flags]] | [[Category:Flags]] | ||
[[Category:Inherited from 6502]] | [[Category:Inherited from 6502]] | ||
[[Category:Condition Codes]] |
Latest revision as of 18:41, 12 November 2024
The Overflow Flag (V) is bit 6 of the status register. It is affected only by the following eight instructions:
- ADC (indicates signed sum overflowed)
- SBC (indicates signed difference underflowed)
- CLV (always clears it)
- BIT (becomes bit 6 or bit 14 of operand except in immediate addressing)
- PLP (pulls it off the stack)
- RTI (pulls it off the stack)
- SEP (might set it)
- REP (might clear it)
Here is how it behaves:
- When the accumulator is 8 bits wide, V indicates whether the sum/difference of ADC/SBC is outside the range of -128 to 127.
- When the accumulator is 16 bits wide, V indicates whether the result of ADC/SBC is outside the range of -32768 to 32767.
Adding a positive and negative integer together never sets the overflow flag because the sum has a smaller magnitude than either addend.
It may be the most misunderstood flag of the 65c816 and the 6502.[2][3]
There is no SEV instruction to directly set the overflow flag, but the 6502 and 65c02 do have a hardware signal to set it. Unfortunately this hardware signal was removed on the 65c816 (or fortunately, as now it can no longer get set by accident.)
On the SPC700 it can be cleared with CLRV and is set whenever the half-carry flag is set.
BVC and BVS both examine the overflow flag to decide whether or not to branch.
The overflow flag is invalid in decimal mode on the NMOS 6502, but it is valid in the 65c816's decimal mode.
See Also
References
- Eyes & Lichty, page 439
- lbid, "Branching Based on the Overflow Flag" on page 150
- Clark, Bruce. http://www.6502.org/tutorials/vflag.html
- Shirriff, Ken. The 6502 overflow flag explained mathematically. https://www.righto.com/2012/12/the-6502-overflow-flag-explained.html?m=1
- lbid. https://www.righto.com/2013/01/a-small-part-of-6502-chip-explained.html?m=1
- Labiak, William. Page 108.
- Pickens, John. NMOS 6502 Opcodes. http://www.6502.org/tutorials/6502opcodes.html#VFLAG
- https://forums.nesdev.org/viewtopic.php?t=6331
- Table 7-1 Caveats of 65c816 datasheet