KOZOS (12)

とりあえず 2nd Step から 4th Step あたりまで読んだのですが、色々な意味で内容が濃いです。今からエントリの下書きしつつ動作確認する方向なんですが、日曜夜でどこまでデキるかというカンジ。

2nd Step

シリアル通信。最初に mmio なナニが解説されてます。ただ、H8/3069F なソレについては sci というシリアルコントローラ内蔵らしく、こちらの解説な記述もあります。
とりあえず一文字出力なナニを掘っておくことに。手続き定義が以下。

/* 送信可能か? */
int serial_is_send_enable(int index)
{
  volatile struct h8_3069f_sci *sci = regs[index].sci;
  return (sci->ssr & H8_3069F_SCI_SSR_TDRE);
}

/* 1文字送信 */
int serial_send_byte(int index, unsigned char c)
{
  volatile struct h8_3069f_sci *sci = regs[index].sci;

  /* 送信可能になるまで待つ */
  while (!serial_is_send_enable(index))
    ;
  sci->tdr = c;
  sci->ssr &= ~H8_3069F_SCI_SSR_TDRE; /* 送信開始 */

  return 0;
}

送信可能かどうかなナニですが、マニュアルの記述な方式に慣れてないので微妙。

  • 0 : TDR に有効な送信データがライトされていることを表示
  • 1 : TDR に有効な送信データがないことを表示

手続き的には 0 なら送信可能ではない状態、という事か。日本語って難しい。ちなみに送信開始したら左端のビットを off にしてますな。
あと、lib.c で定義されている putc という関数についてフォローあり。

/* 1文字送信 */
int putc(unsigned char c)
{
  if (c == '\n')
    serial_send_byte(SERIAL_DEFAULT_DEVICE, '\r');
  return serial_send_byte(SERIAL_DEFAULT_DEVICE, c);
}

\n を \r\n にして送信というきまりらしい。歴史的な事情により改行は \r が、という記述もありますね。
lib.c でメモリとか文字列とかなライブラリ関数を自分で書かなきゃ駄目だよ云々という事で追加されてたりするのですが、面白かったのはそっちよりも数値の 16 進数出力するという putxval() という関数です。
面白かったのが以下な記述。

    *(p--) = "0123456789abcdef"[value & 0xf];

結構長く C を弄ってますが、こんな記述は初めて見た。てか見れば成程なんですがちょっと目から鱗でした。
とりあえず修正するのは以下三点らしいので

  • lib.h
  • lib.c
  • main.c

とりあえず盛り込んで動作確認。で、とりあえず make して

$ make
/usr/local/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD vector.c
/usr/local/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD startup.s
/usr/local/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD main.c
/usr/local/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD lib.c
/tmp/ccJvQ04U.s: Assembler messages:
/tmp/ccJvQ04U.s:61: Warning: operand #0xffffffffffffffff out of range.
/tmp/ccJvQ04U.s:130: Warning: operand #0xffffffffffffffff out of range.
/tmp/ccJvQ04U.s:159: Warning: operand #0xffffffffffffffff out of range.
/usr/local/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD serial.c
/usr/local/bin/h8300-elf-gcc vector.o startup.o main.o lib.o serial.o -o kzload -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD -static -T ld.scr -L.
cp kzload kzload.elf
/usr/local/bin/h8300-elf-strip kzload
$ make image
/usr/local/bin/h8300-elf-objcopy -O srec kzload kzload.mot
$

で、動作確認か。ええと dip switch の三番目だけを off にして以下で良いのかな。

$ ../H8cross/h8writer/h8write -3069 -f20 kzload.mot /dev/ttyUSB0

う。コマンド実行したのは良いのですが、戻ってこないな。sudo が必要? それとも再起動しないといかんのか。
とりあえずエントリ投入して再起動してリトライしてみます。

追記

再起動してリトライ。

$ ../H8cross/h8writer/h8write -3069 -f20 kzload.mot /dev/ttyUSB0 

戻ってこないなぁ。とりあえずデバッグ情報出してみましたが同じ。

$ ../H8cross/h8writer/h8write -3069 -f20 kzload.mot /dev/ttyUSB0 -d
filename:kzload.mot
sPort   :/dev/ttyUSB0
Freq    :20
CPU ID  :257

戻ってこない。困ったなぁ。電源遮断で以下なメセジ。

FATAL:Can not open the line to the H8/OS system.

むむ。とりあえず調べてみることに。