モニタ編


初めての挑戦ながら、H8に見事文字を表示させることができた。
しかしだ。このまま開発を進めてもいいのだろうか? 答えはNO。日立はH8のファラッシュメモリの書き換え回数は100回までしか保証していない。 秋月はどっかで500回は大丈夫って書いてあったような気がするが、とにかく寿命がある。
PICも死ぬほど書き換えても壊れなかったけど、壊れても700円程度なんで神経質にならなかった。しかし、H8は4800円払って買って、また組み立てないといけない。


すでに2、30回は書き込んでしまった。書き込み回数を減らすにはどうすればよいのだろうか? それには、フラッシュメモリ上でプログラムを実行せずに、RAM上で実行すればよい。
トランジスタ技術98年9月号を見ると、日立のホームページからモニタがダウンロードできるとのこと。これは使えるかもしれないと言うことで、ダウンロードしてトラ技を参考にアセンブル。で、出来上がったものは・・・秋月のデバッガといっしょやん。ちゃんちゃん。


トラ技の紹介で、アセンブル方法が紹介されているが、この通りにやると秋月版と違うものが出来上がる。まず、使用メモリが違う。モニタが使用するRAM領域が、日立版の方が3倍近く大きい。秋月版はいらない機能を省いてあるからなのだろうか?
もう一つは、モニタのリンク時に決めるアドレスの設定が違う。アドレスが違うと、同じプログラムを使用することができない。どこが違うかというと、次の図を参照。

トラ技のアドレスの設定方法は、モニタが使用するRAMを一番後ろに(ピッタシ)詰めている。それ以外の部分がユーザーが使用する領域で、先頭が仮想ベクタ領域で、一番下からスタックが使用する。
秋月版は、先頭にモニタの領域を配置し、きりのいいH'FF000からユーザー領域になっている。ユーザー領域の先頭は仮想ベクタ領域、下からスタックが使用する。ただし、一番下からというわけではなく、16バイト分空きを作っている。この領域は「絶対8ビットアクセス」が届く貴重な(?)領域なので、大切に使えってこと?

自分でカスタマイズするのもいいけど面倒なんで、秋月版の方を使うことにする。


秋月版のMONITOR.MOTをAKI−H8のフラッシュメモリに焼く。説明書通りにハイパーターミナルを設定して、AKI−H8の電源を入れると起動のメッセージが出る。日立版を見た後では、かなり胡散臭いメッセージだ。

ここで、試しにLCDの表示テストプログラムを転送・・・したいところだけど、そのままでは動かない。ROMに書かれることを想定してアセンブルされているからだ。RAM上で動くようにアドレスの設定を変えてやらなければならない。
ここで、RAM版とROM版の2つの実行ファイルができることになる。実行ファイルを切り替えたいときに、何カ所もソースをいじっていては面倒。そこで、バッチファイルで切り替えができるようにする。


モニタで動かすように書き換えるのは難しいことではない。今までRAMとROMの両方使っていたのを、RAMだけ使うようにすればいいだけなのだから。
今までは、「ベクタ領域(VECTOR)」、「プログラム領域(ROM)」、「定数データ領域(ROMDATA)」、「変数領域(RAM)」、「スタック領域」に分かれていた。最初の3つはROMに、後の2つはRAMを使うようにしていた。さらに、ベクタ領域はアドレスが固定だった。

では、書き換える点を上げる。
まず、ベクタ領域のセクションの設定で、アドレスを直接書いていた。通常の実行では固定で動くことはなかったが、モニタ上で動かす場合はRAMに配置しなくてはならない。もちろん本当のベクタ領域は今まで通り0番地に存在するが、モニタがRAM上の仮想ベクタ領域を参照して割り込み処理ルーチンへ飛ばすようにしてくれる。よって、アドレスの設定を消す。

    .section  VECTOR,DATA,LOCATE=H'00000
            ↓
    .section  VECTOR,DATA

実はプログラムの改造はこれくらいでよい。
後はバッチファイルを書き換えるだけ。

今まで通りにリンクするには、
  l38h LCDTEST.OBJ,LCD.OBJ -OUTPUT=LCDTEST.ABS -START=ROM,ROMDATA(000100),RAM(0fef10),VECTOR(0) -DEFINE=STACK(0FFF00) -PRINT=LCDTEST.MAP
とする。

アドレスの設定部分だけ抜き出すと、
  -START=ROM,ROMDATA(000100),RAM(0fef10),VECTOR(0)
ベクタの設定が追加されただけ。
これを、モニタ上で動かすには、全部RAMに配置すればいいので、
  -START=VECTOR,ROM,ROMDATA,RAM(0FF000)
とすればよい。ベクタは必ず先頭にする。


これでモニタ上で動かす実行ファイルができた。AKI−H8の電源を入れ、「L」コマンドで読み込み待ち状態にする。ここで、さっき作った「LCDTEST.MOT」をテキスト転送する。読み込み完了のメッセージが出たら「G」で実行・・・しない。あれ?

読み込んだ状態で「R」を押してレジスタの状態を確認する。プログラムカウンタがプログラム開始位置になっていない。しまった。開始したい場所「START」の手前に、あり得ない割り込みが発生したときためのダミールーチン「INT_NULL」があった。ダミーの中身は「rte」だけ。かくして2命令目にていきなり暴走していたのであった。

リンカは「読み込んだオブジェクトのうち、もっとも最初に現れたコードセクションの先頭」を実行開始位置と決めている。これを強制的に変更するためにはリンカで「-ENTRY」を宣言する。これで、読み込んだ後にレジスタを見ると、プログラムカウンタの値が「FF102」を示していて、正常に実行する。


今回は動いたところまで。というか、このページを書きながら、順番に試していったので、動くかどうかハラハラドキドキだった。というわけで、

今回のプログラム

LCD002.LZH 7,382 bytes・・・ドキュメント

前回のを少し書き換えたものです。

最新版は成果物のページにあるかも


次は何だ?ネタがない。やっぱC言語か?

続く


ご意見・ご感想は kumon@sam.hi-ho.ne.jp までどうぞ。

戻る