Dmitry Kiryashov [zews at AHA.RU] says:
...to convert byte mask back into number. I suggest that somebody else probably has successfully researched this before. This is what I've discovered... It takes 12 clocks/words; W before -> W after ; abcdefgh -> 00000ABC ; 10000000 -> 7 = 4+2+1 ; 01000000 -> 6 = 4+2+0 ; 00100000 -> 5 = 4+0+1 ; 00010000 -> 4 = 4+0+0 ; 00001000 -> 3 = 0+2+1 ; 00000100 -> 2 = 0+2+0 ; 00000010 -> 1 = 0+0+1 ; 00000001 -> 0 = 0+0+0 mov temp, W ;save abcdefgh mov W, <>temp ;efghabcd xor temp, W ;........ and W, #$F ;0000abcd sb Z mov W, #4 ;load A=0/4 sb temp.3 snb temp.2 or W, #2 ;add B=0/2 sb temp.3 snb temp.1 or W, #1 ;add C=0/1 ;W holds 7..0 of result
Marc [marc at AARGH.FRANKEN.DE] says:
You can make it a table-read, and fill the gaps with other sub functions. Under the presumption that you can make use of any area of 3+ words in size, this method uses 6 cycles (incl call/ret) and 11 words.add pc, W (1 wasted word) retw #0 retw #1 (1 wasted word) retw #2 (3 spare words) retw #3 (7 spare words) retw #4 (15 spare words) retw #5 ...