Toggle carry. By Lee Davison.

Introduction.
Carry bit the wronge sense? Want a 0 when it's 1? Read on....
The code.

Recently in some otherwise elegant code the result of a compare left the carry bit in exactly the wrong sense for the following add. The usual way to fix that is to do something like ..


	BCC	WasClear	; if clear go set it	

	CLC			; was set so clear it
	BCC	AllDone		; continue

WasClear
	SEC			; was clear so set it
AllDone

While this works there had to be a more elegant way of doing this. It turns out there is, you do this ..


	ROL	A		; Cb into b0		
	EOR	#$01		; toggle bit
	ROR	A		; b0 into Cb

The ROL puts the carry into bit 0 in the accumulator.
The EOR toggles the state of that bit without affecting any other bits.
The ROR puts the bit back into the carry, restores the accumulator and sets the N and Z flags.

There are a couple of advantages of doing things this way instead of the branch and set (or clear) given earlier ..

  • It only takes four bytes instead of six.
  • It always takes six cycles, not five or seven depending on the state of the carry.
  • There is one possible disadvantage in that it sets the N and Z flags from what is in A at the time. But, most of the time, if you're interested in the carry state the N and Z states are unimportant.


    Last page update: 28th August, 2003. e-mail me