SD/MMCカードを実装にあたって一番最初、H8/3052でテストしていた。その時の
ブレッドボードが未だにそのままなので、まとめておきました。回路は
74VHC125でH8側の5Vと、SD/MMCカード側の3.3Vを変換するだけ。一応SD/MMCの
仕様に従ってプルアップ。

H8開発機の中に押しこめました。ストレージがつくとちょっとうれしい。

SHについて。まずはコンパイラと呼出し規約を確認。gccとルネサスでMACレジ スタの扱いに違いがある。

H8開発機の中に押しこめました。ストレージがつくとちょっとうれしい。

SHについて。まずはコンパイラと呼出し規約を確認。gccとルネサスでMACレジ スタの扱いに違いがある。
sh-elf-gcc -Q --help=target -c sh-elf-gcc --target-help gcc-4.3.2/gcc/config/sh/sh.hあたりから様子を探ります。
リーディングアンダースコア
引数は4つまでレジスタ渡し、それ以降はスタックに積む。
R0-R1 関数の返り値 (caller saved)
R2-R3 スクラッチ (caller saved)
R4-R7 関数の引数 (caller saved)
R8-R13 callee saved.
R14 フレームポインタ (callee saved)
R15 スタックポインタ (callee saved)
FPU1 caller saved
FR0-FR3 関数の返り値
FR4-FR11 関数の引数
FR12-FR15 callee saved
gcc-4.3.2/gcc/config/sh/sh.hより。
/* Register allocation for the Renesas calling convention:
r0 arg return
r1..r3 scratch
r4..r7 args in
r8..r13 call saved
r14 frame pointer/call saved
r15 stack pointer
ap arg pointer (doesn't really exist, always eliminated)
pr subroutine return address
t t bit
mach multiply/accumulate result, high part
macl multiply/accumulate result, low part.
fpul fp/int communication register
rap return address pointer register
fr0 fp arg return
fr1..fr3 scratch floating point registers
fr4..fr11 fp args in
fr12..fr15 call saved floating point registers */
----------------------------------------------------------------------
-mrenesas Comply with the calling conventions defined by Renesas.
Renesas saves and restores mac registers on call.
The multiply instructions and multiply/accumulate instructions store
results in the MAC register.
-mnomacsave Mark the "MAC" register as call-clobbered, even if
-mhitachi is given.
MACレジスタをcallee-savedにするかcaller-savedにするか。gccデフォルトだと
caller-saved(call-clobbered)。-mrenesas(-mhitachi)にするとcallee-saved.
/* sh-elf-gcc -O -S -fomit-frame-pointer a.c */
int
a (int a0, int a1, int a2, int a3)
{
return a0 + a1 + a2 - a3;
}
int
c (int a0, int a1, int a2, int a3, int a4)
{
return a0 + a1 + a2 - a3 + a4;
}
int
b ()
{
a (0, 1, 2, 3);
return c (0, 1, 2, 3, 4);
}
int
main ()
{
return a (0xaa55, 4, 3, 2);
}
.file "a.c"
.text
.text
.align 1
.global _a
.type _a, @function
_a:
mov r5,r0
add r4,r0
add r6,r0
rts
sub r7,r0
.size _a, .-_a
.align 1
.global _c
.type _c, @function
_c:
mov r5,r0
add r4,r0
add r6,r0
mov.l @r15,r1
add r1,r0
rts
sub r7,r0
.size _c, .-_c
.align 1
.global _b
.type _b, @function
_b:
sts.l pr,@-r15
add #-4,r15
mov #4,r1
mov.l r1,@r15
mov #0,r4
mov #1,r5
mov #2,r6
mov.l .L7,r0
jsr @r0
mov #3,r7
add #4,r15
lds.l @r15+,pr
rts
nop
.L8:
.align 2
.L7:
.long _c
.size _b, .-_b
.align 1
.global _main
.type _main, @function
_main:
sts.l pr,@-r15
mov.l .L11,r4
mov #4,r5
mov #3,r6
mov.l .L12,r0
jsr @r0
mov #2,r7
lds.l @r15+,pr
rts
nop
.L13:
.align 2
.L11:
.long 43605
.L12:
.long _a
.size _main, .-_main
.ident "GCC: (GNU) 4.3.2"
