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
最低限の使い方がわかったので、後は
*'``・* 。 | `*。 ,。∩ * + (´・ω・`) *。+゜ もうどうにでもなーれ `*。 ヽ、 つ *゜* `・+。*・' ゜⊃ +゜ ☆ ∪~ 。*゜ `・+。*・ ゜