081020

|


gccのh8300-hmsのアーキテクチャには3種類ある。
h8300  H8/300
h8300h H8/300H
h8300s H8S
H8/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化への道筋がついた! 後はもうちょっとサバイバルキットを作っておくだけだ。