KOZOS (18)

直前エントリ、マニュアルのメモって言いつつソースも掘ってしまっています。激しく勢い余ってますよね。その勢いのまま、os 側の掘削に夕方着手。
main 手続きがアレゲ

int main(void)
{
  INTR_DISABLE; /* 割込み無効にする */

  puts("kozos boot succeed!\n");

  softvec_setintr(SOFTVEC_TYPE_SERINTR, intr);
  serial_intr_recv_enable(SERIAL_DEFAULT_DEVICE);

  puts("> ");

  INTR_ENABLE; /* 割込み有効にする */
  while (1) {
    asm volatile ("sleep"); /* 省電力モードに移行 */
  }

  return 0;
}

入力は serial な割り込みを使うので省電力モードに移行しちゃってるみたい。これはこれで凄いですね。初期処理っぽいナニを順に掘削してみます。
まず softvec_setintr 手続きですが、interrupt.c にて定義されてます。で、こいつに渡すハンドラなポインタが指してる手続きは直上で定義されてますが、これって直前の版までは main 手続きのなかにあったシリアルから読んでシリアルに出力して、というソレ達になってます。
これも main 手続きと同様で serial な割り込みを使うので、そのあたりの処理は割り込みハンドラでやりますよ、という事か。
あとは 1 番目の sci を enable にして割り込みを有効にしている模様。SERIAL_DEFAULT_DEVICE は defines.h にてマクロが定義されてます。

後は

イベント待ちなループなのか。コールバックはどれになるんだろ。あ、main.c にある intr 手続きなのか。初期化が bootload 側で処理済みなのでこちら側はこれだけで OK って事になるのかなぁ。

とりあえず

試験して次に進む方向でナニ。まず 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 intr.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 interrupt.c
/usr/local/bin/h8300-elf-gcc -c -Wall -mh -nostdinc -nostdlib -fno-builtin -I. -Os -DKZLOAD elf.c
/tmp/ccia8bKZ.s: Assembler messages:
/tmp/ccia8bKZ.s:38: Warning: operand #0xffffffffffffffd2 out of range.
/usr/local/bin/h8300-elf-gcc vector.o startup.o intr.o main.o interrupt.o lib.o serial.o xmodem.o elf.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
$ ../../H8cross/h8writer/h8write -3069 -f20 kzload.mot /dev/ttyUSB0
H8/3069F is ready!  2002/5/20 Yukio Mituiwa.
writing
WARNING:This Line dosen't start with"S".
Address Size seems wrong
WARNING:This Line dosen't start with"S".
Address Size seems wrong
...................
EEPROM Writing is successed.
$

で、minicom 起動して転送速度の設定してナニ。

unknown.
kzload> AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0
unknown.
kzload> kzload (kozos boot loader) started.
kzload>

こっからどーすんだっけ、load ってコマンド入れて C-a s だったか。転送失敗。上記の状態で接続成功したら H8/3069RF 一旦再起動した方が良いな。で、転送成功。

kzload (kozos boot loader) started.
kzload> load

XMODEM receive succeeded.
kzload>

で、run すりゃいいのかな。って暴走した。

kzload> run
starting from entry point: ffc020
kozos boot succeed!
> kzload (kozos boot loader) started.
kzload> echo test
unknown.
kzload>

再度転送して実行してみる。現象は同じだな。bootload が起動している風に見える。む、何かをタイプしたら kzload (kozos boot loader) started. するな。
何もタイプせずに放っておいたら

kzload> load

XMODEM receive succeeded.
kzload> run
starting from entry point: ffc020
kozos boot succeed!
>

のまま。で、e をタイプした時点でこうなるな。

> kzload (kozos boot loader) started.
kzload> e

むむ。おかしいな。挙動としては bootload 側の main 手続きが再度呼び出されている風に見えます。

bootload のソレを make image してないな。make image して bootload なナニを再度転送して動作確認。

kzload> kzload (kozos boot loader) started. 
kzload> load

XMODEM receive succeeded.
kzload> run
starting from entry point: ffc020
kozos boot succeed!
> echo test
 test
>

やれやれ動いた。とりあえず gitorious 方面に push して 8th step 着手の方向で。

余談

何故かいきなりコメントに関する記述があります。大いにうなづける内容なので全部引用してしまえ。以前勉強会でサンプルソースにコメントが無い、って威張って指摘されて何を言っているのか意味が全然分からなかった経験あり。

コメントはあくまで注釈であり、プログラムの意図はプログラムで表現すべきです。文章がわかりにくいと指摘されたときにするべきことは、注釈を増やすことではなく、章構成や段落などを工夫して文章そのものをわかりやすくすることです。そしてこれはプログラムについても同様に考えるべきです。
「コメントを書け」とはよく言われることですが、コメントは処理の目的や例外的な対処に対して書くものであり、まずは「コメントが無くてもわかるプログラムを書く」ということのほうが先決です。

正にその通り。