ひやしたです。 長文失礼。 参考になるかどうかわかりませんが、こんなコード #define foreleg 0x69 #define hindleg 0x96 #define DA0 (*(volatile unsigned char *)0xFFFFFF) #define DA1 (*(volatile unsigned char *)0xFFFFFF) #define P1 (*(volatile unsigned char *)0xFFFFFF) long count; short divNum; unsigned char* adrR; unsigned char* adrL; char ampR; void interrupt_timer0(void) { register unsigned a= (count++ &(divNum-1));/*=count%divNum 高速化*/ register unsigned b= ((a>>4)<<1) + (ampR>>3); DA0=*(adrR+a);/*右足,=adrR[count%divNum];*/ DA1=*(adrL+a);/*左足*/ P1 &= ~0x03; P1 |= (foreleg >> b) & 0x01; P1 |= (hindleg >> b) & 0x02; } をイエローソフトのコンパイラでコンパイルすると、こんなコードが出ました。 秋月コンパイラがどういうコードを吐き出すのかは不明ですが、 シフトって結構ステート数を使うみたいですね。 segment TEXT ATR_CODE public _interrupt_timer0 _interrupt_timer0: ; a -2(er6) ; b -4(er6) PUSH.L ER6 MOV.L ER7,ER6 SUBS #4,ER7 ; D:\PRJ\test\ML\ML.c(15) MOV.W @_divNum,R0 SUBS.L #H'00000001,ER0 EXTS.L ER0 MOV.L @_count,ER1 MOV.L @_count,ER2 INC.L #H'00000001,ER2 MOV.L ER2,@_count AND.L ER0,ER1 MOV.W R1,@(-2,ER6) ; D:\PRJ\test\ML\ML.c(16) MOV.B @_ampR,R0L EXTS.W R0 SHAR.W R0 SHAR.W R0 SHAR.W R0 MOV.W R1,R3 SHLR.W R3 SHLR.W R3 SHLR.W R3 SHLR.W R3 SHLL.W R3 ADD.W R0,R3 MOV.W R3,@(-4,ER6) ; D:\PRJ\test\ML\ML.c(17) MOV.W R1,R0 EXTU.L ER0 MOV.L @_adrR,ER4 ADD.L ER0,ER4 MOV.B @ER4,R0L MOV.L #H'00FFFFFF,ER4 MOV.B R0L,@ER4 ; D:\PRJ\test\ML\ML.c(18) MOV.W @(-2,ER6),R0 EXTU.L ER0 MOV.L @_adrL,ER1 ADD.L ER0,ER1 MOV.B @ER1,R0L MOV.B R0L,@ER4 ; D:\PRJ\test\ML\ML.c(20) MOV.B @H'00FFFFFF:8,R0L AND.B #H'FC,R0L MOV.B R0L,@ER4 ; D:\PRJ\test\ML\ML.c(21) MOV.W #H'0069,R0 MOV.W @(-4,ER6),R1 PUSH.W R1 PUSH.W R0 JSR @__w_shift_sr ADDS.L #H'00000002,ER7 POP.W R0 AND.W #H'0001,R0 MOV.B @H'00FFFFFF:8,R2L OR.B R0L,R2L MOV.B R2L,@ER4 ; D:\PRJ\test\ML\ML.c(22) MOV.W #H'0096,R0 MOV.W @(-4,ER6),R1 PUSH.W R1 PUSH.W R0 JSR @__w_shift_sr ADDS.L #H'00000002,ER7 POP.W R0 AND.W #H'0002,R0 MOV.B @H'00FFFFFF:8,R2L OR.B R0L,R2L MOV.B R2L,@ER4 ; D:\PRJ\test\ML\ML.c(23) _interrupt_timer0_end: MOV.L ER6,ER7 POP.L ER6 RTS extern __w_shift_sr ; public _count public _divNum public _adrR public _adrL public _ampR ; segment DATA ATR_DATA _count: DS.B 4 _divNum: DS.B 2 _adrR: DS.B 4 _adrL: DS.B 4 _ampR: DS.B 1 end