寺脇です。
16bit サイズのビットフィールドを使うと、アドレス計算が
おかしくなるようです。
gcc のバージョンは、
gcc version 2.95.3 20010315 (release)
で、以下の3種類のオプションで同じような出力がでました。
h8300-hms-gcc -fomit-frame-pointer -c -O2 -mh -Wall -S initperi.c
h8300-hms-gcc -fomit-frame-pointer -c -O -mh -Wall -S initperi.c
h8300-hms-gcc -fomit-frame-pointer -c -mh -Wall -S initperi.c
あまり、凝った定義はしないほうがいいかもしれません。
------ この不具合がでるソースファイル initperi.c ------------
union un_mstpcr { /* union MSTPCR */
unsigned int WORD; /* Word Access */
struct { /* Byte Access */
unsigned char H; /* MSTPCRH */
unsigned char L; /* MSTPCRL */
} BYTE; /* */
struct { /* Bit Access */
unsigned char B15:1; /* DMAC */
unsigned char B14:1; /* DTC */
unsigned char B13:1; /* TPU */
unsigned char B12:1; /* TMR */
unsigned char B11:1; /* PPG */
unsigned char B10:1; /* D/A */
unsigned char B9 :1; /* A/D */
unsigned char :0; /* */
unsigned char B7 :1; /* SCI2 */
unsigned char B6 :1; /* SCI1 */
unsigned char B5 :1; /* SCI0 */
} BIT; /* */
}; /* */
#define MSTPCR (*(volatile union un_mstpcr*)0xFFFF3C)/*MSTPCRAddress*/
ttest()
{
MSTPCR.BIT.B15 = 1 ;
MSTPCR.BIT.B5 = 0 ;
}
----- 展開されるコード ----------------------------------------
_ttest:
mov.l #16777020,er2
mov.b @er2,r3l
or #128,r3l
mov.b r3l,@er2
mov.b @16777022,r2l <------ここがおかしい
and #-33,r2l
mov.b r2l,@16777022
rts
PS 今日は、これで半日つぶしました(^^;)
--
--------- Computer Artisan ---------------------------
シーエー 寺脇 勝彦
E-mail wakky@xxxxxxxxxxxxxxxxxxx
URL http://www.computerartisan.com/