[H8-ML(2630)] Re: 大きな配列をタイマー割り込みで参照
From: "Hirashita" <iced@xxxxxxxxxxxxxxx>
Date: 2002年12月27日(金)15時38分50秒
ひやしたです。

長文失礼。
参考になるかどうかわかりませんが、こんなコード

#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

スレッド概略
[2623(R)](起点)
 └[2629(U)]
   └[表示中]
     └[2637(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]