ひやしたです。
長文失礼。
参考になるかどうかわかりませんが、こんなコード
#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