H8/3052F をGNU環境でアセンブリする

今年の更新は、H8/3052FをGNU環境でアセンブリすることについて。

研修で、HEWとルネサス純正コンパイラを用いてH8/3048Fを扱った。純正コンパイラは高いので頑張ってGNU環境で出来るようにする。半年前に、どこかのページを参考にして h8300-hms-gcc など環境を整えた。(もうどうやったか覚えてない。cygwin 上で動かしている。)
とりあえず、研修で覚えたアセンブリで動かすことが目標。ボードは秋月電子のH8/3052Fの開発セット。

プログラム本体

; startup.s

	.h8300h

.equ	P5DDR,	0xFFFC8
.equ	P5DR ,	0xFFFCA
.globl	LED
	
	.section .text

LED:	
	mov.l	#0xFFF00, sp
	
	; ポート5 0,1を出力モード
	;bset	#0,	@P5DDR
	;bset	#1, @P5DDR
	
	mov.b	#0x03, r0l
	mov.b	r0l, @P5DDR	

	; LED0,1を点灯
	;bset	#0,	@P5DR
	;bclr	#1, @P5DR
	
	mov.b	r0l, @P5DR
	
EXIT:
	bra		EXIT

	.section .vectors
	.data.l	LED
	
	.END

純正のコンパイラ(?)との違いについて

  • 数値記述法
    • #H'FFFFF が #0xFFFFF
  • EQU文
    • (ラベル: .EQU 数値) が (.equ ラベル, 数値)
  • レジスタ名が小文字限定
  • .global が .globl
    • 嘘でした。ごめなさい。
  • 8ビット絶対アドレス内でもメモリ上のアドレスに対しbsetなどビット演算子が使えないっぽい
  • .section でアドレスの開始指示の仕方が不明
  • .res系が使えない??.byteなどを使うのか?(未確認)

参考: http://akita-nct.jp/~yamamoto/comp/H8/ASM_linux/ASM_linux.html

リンカスクリプト

/* linkerScript.x */
SECTIONS
{
	. = 0x00000;
	.vectors : { *(.vectors) }
	. = 0x00100;
	.text : { *(.text) }
}

初めて自力で書いたので、こんなもん^^;まぁいいかw
参考: http://www.sra.co.jp/wingnut/ld/ld-ja_3.html

Makefile

PROJECT = led
OBJS = startup.o

LINKS = linkerScript.x
LDFLAGS	=	-Xlinker -Map -Xlinker $(PROJECT).map

CC		= h8300-hms-gcc
OBJCOPY	        = h8300-hms-objcopy

$(PROJECT).mot : $(PROJECT).coff
	$(OBJCOPY) -O srec $^ $@

$(PROJECT).coff : $(OBJS)
	$(CC) -o $@ -T $(LINKS) -nostdlib $(OBJS) $(LDFLAGS)

startup.o : startup.s
	$(CC) -c $^
	
clean : 
	rm -f *.o *.mot *.coff

最低限の使い方がわかったので、後は

       *'``・* 。
       |     `*。
      ,。∩      *
     + (´・ω・`) *。+゜  もうどうにでもなーれ
     `*。 ヽ、  つ *゜*
      `・+。*・' ゜⊃ +゜
      ☆   ∪~ 。*゜
      `・+。*・ ゜