gccのh8300-hmsのアーキテクチャには3種類ある。
次はldscript。/usr/pkg/libexec/cross-h8300-hms/h8300-hms/lib/ldscripts/にサンプルがある。
モニタ上のメモリマップに合わせて作成。ALIGN(4)は余計かも。レジスタを 32bitで使えるし、こうしておきたい気持ちなのだけど、実際どうなのかは?? .bssの中で_bss_startを設定しているのは、ROM版の時にはデータセクションと BSSセクションが連続しないため。PROVIDEしたシンボルはスタートアップの時 のBSSクリアのために使う。このアーキテクチャはCのシンボルにアンダースコ アがいる。
ROM化のテスト。ROM用のldscriptを作成。リセットされると0x0のリセットベクター に書かれているアドレスにジャンプするので、それ用に設定する必要がある。 スタックポインタも自前で設定しないといけないので、設定用のアセンブラソー スを追加。
h8300 H8/300 h8300h H8/300H h8300s H8SH8/3052はH8/300Hシリーズなのでh8300h。
h8300-hms-gcc特有のオプションは ---------------------------------------------------------------------- $ h8300-hms-gcc --target-help Target specific options: -malign-300 Use H8/300 alignment rules -mno-h Do not generate H8/300H code -mh Generate H8/300H code -mrelax Enable linker relaxing -mslowbyte Consider access to byte sized memory slow -mno-quickcall Do not use registers for argument passing -mquickcall Use registers for argument passing -mint32 Make integers 32 bits wide -mno-s2600 Do not generate H8/S2600 code -ms2600 Generate H8/S2600 code -mno-s Do not generate H8/S code -ms Generate H8/S code There are undocumented target specific options as well. no emulation specific options. $ ----------------------------------------------------------------------なので、-mh(必須) -mint32(うっかり間違いもなく楽そう。intが16bitは絶対 はまるはず)。
次はldscript。/usr/pkg/libexec/cross-h8300-hms/h8300-hms/lib/ldscripts/にサンプルがある。
モニタ上のメモリマップに合わせて作成。ALIGN(4)は余計かも。レジスタを 32bitで使えるし、こうしておきたい気持ちなのだけど、実際どうなのかは?? .bssの中で_bss_startを設定しているのは、ROM版の時にはデータセクションと BSSセクションが連続しないため。PROVIDEしたシンボルはスタートアップの時 のBSSクリアのために使う。このアーキテクチャはCのシンボルにアンダースコ アがいる。
----------------------------------------------------------------------
OUTPUT_FORMAT("coff-h8300")
OUTPUT_ARCH(h8300h)
MEMORY {
vectors : o = 0xfdf10, l = 0x100
ram : o = 0xfe200, l = 0x1d00
}
SECTIONS {
PROVIDE (stack_top = 0xfff00);
.vectors :
{
*(.vectors)
} > vectors
.text :
{
*(.text)
*(.rodata)
. = ALIGN(4);
} > ram
.data :
{
*(.data)
. = ALIGN(4);
} > ram
.bss :
{
PROVIDE (_bss_start = .);
*(.bss)
} > ram
PROVIDE (_bss_end = .);
}
----------------------------------------------------------------------
テストプログラムはLEDを点灯するだけのもの。
----------------------------------------------------------------------
#include <sys/types.h>
void
machine_startup ()
{
*(u_char *)0xffffffc8 = 0xff; /* set port 5 for output */
while (/*CONSTCOND*/1)
*(u_char *)0xffffffca = 1; /* LED connected to port 5 on */
/* NOTREACHED */
}
----------------------------------------------------------------------
/usr/pkg/bin/h8300-hms-gcc -mh -mint32 -c start.c
/usr/pkg/bin/h8300-hms-ld -T ldscript.ram -o test start.o
/usr/pkg/bin/h8300-hms-objcopy -Osrec test test.srec
こんな感じで。
----------------------------------------------------------------------
H8/3052 Advanced Mode Monitor Ver. 3.0A
Copyright (C) 2003 Renesas Technology Corp.
: l
~>Local file name? test.srec
8 lines transferred in 0 seconds
!
Top Address=FE200
End Address=FE217
: r
PC=0FE200 CCR=80:I....... SP=000FFF00
ER0=00000000 ER1=00000000 ER2=00000000 ER3=00000000
ER4=00000000 ER5=00000000 ER6=00000000 ER7=000FFF00
: g
----------------------------------------------------------------------
OK。PCはモニタがスタートアドレスに設定してくれる。ベクタ領域のロードが
あってもPCはちゃんとテキストの先頭に設定します。
ROM化のテスト。ROM用のldscriptを作成。リセットされると0x0のリセットベクター に書かれているアドレスにジャンプするので、それ用に設定する必要がある。 スタックポインタも自前で設定しないといけないので、設定用のアセンブラソー スを追加。
----------------------------------------------------------------------
OUTPUT_FORMAT("coff-h8300")
OUTPUT_ARCH(h8300h)
MEMORY {
vectors : o = 0x00000, l = 0x100
ram : o = 0xfdf10, l = 0x2000
rom : o = 0x00100, l = 0x7ff00
}
SECTIONS {
PROVIDE (stack_top = 0xfff00);
.vectors :
{
*(.vectors)
} > vectors
.text :
{
*(.text)
*(.rodata)
. = ALIGN(4);
} > rom
.data :
{
*(.data)
. = ALIGN(4);
} > rom
.bss :
{
PROVIDE (_bss_start = .);
*(.bss)
} > ram
PROVIDE (_bss_end = .);
}
----------------------------------------------------------------------
スタートアップ用。h8300-hms-asには設定するオプションはなし。マシンは
.h8300hで設定してあるので。
---------------------------------------------------------------------- .h8300h .section .vectors L.start: .long start .section .text .globl start start: mov.l #stack_top, er7 loop: jmp @_machine_startup jmp @loop /* NOTREACHED */ ----------------------------------------------------------------------これでRAM上での開発と、ROM化への道筋がついた! 後はもうちょっとサバイバルキットを作っておくだけだ。
