On 08/09/2014 05:28, Lonny Pursell wrote:
I was re-reading the thread and noticed I missed the subtle differences between TAS and BSET regarding what it actually tests. TAS - entire byte - both Z and N are used BSET - only the bit being set - only Z is used Would this alternate patch method below work? Should work in all cases when one doesn't have clue how the asm routine works that they are trying to patch. ;original code tas (a1) bpl.s label ;alternate code temp: dc.w 0 ;add this somewhere or use a free register if you can move.b (a1),temp ;copy the byte in question (previous value) bset #7,(a1) ;clobber bit 7 as tas would do tst.b temp ;set Z and N based on prev value like tas bpl.s label ;original branch instruction unchanged
I think it is correct (to be carefully tested).The main idea is to consider all the bits which were *previously* set in the TAS argument, not only bit #7.
Of course, it would be better to fully understand the original routine, and be sure of the value of the other bits is important or not. In many routines, the variable used as TAS argument can only take the values of 0x00 or 0x80, so it is simpler.
Andreas's remark about interrupt safety is valid when TAS is used as a thread-safe mechanism (as it should always be). In cases where TAS usage was not justified and used as a geek-BSET (such as SDL), the thread unsafety is not a problem.
-- Vincent Rivière