H8/3694遊び

H8/3694F

  • トラ技2004−4付録 http://journal.mycom.co.jp/news/2004/04/16/014b.jpg

今週のテーマ:

とりあえずこいつをAVR-USB経由でコントロールしたいなぁ

てか、拾ってきたモニタでは動いたんだが、ボーレートが20/16になっていて不便だった(水晶のクロック比だけボーレートが速いので困っている)

  • で、モニタを修正しようとしたら、ソースが微妙に欠落していて、変更できない。
  • RENESASのASM記述モニタはCじゃないので嫌。
  • 苫小牧のやつもCじゃないのと、3694版がない。改造すりゃあいいんだがASMは嫌。

しかたないので、自分で書くか・・・あーめんど。


まずはh8300-hmsなgccを入れるところから

ソースは、ここか?

MinGW版とLinux版を入れてみた。

  • ちなみにH8のアキーテクチャーだが
  • MC68000をパクッたようなマイコン。
    • ニモニックがそんな感じ mov.l とか mov.wとか、代入方向も元ローラ方式(左から右に受け流す)。
    • 命令コードのマッピングは全然違うけれど16ビット長の倍数であるとか。
    • ビッグエンディアン(ワード並びが、大きな桁のデジットが先に並ぶ。インテルと逆)であるところ。
  • 32ビットアドレス空間。
    • おっとぉぉ、但しPCは24ビット。
  • レジスタは32ビット×8本。
    • だけど、
    • 16ビットなら16本。(ER0〜ER7を分割)
    • 8ビットは16本。(R0〜R7を分割)
      +--------------+------+------+
      |      E0      | R0H  | R0L  |  = ER0
      +--------------+------+------+
      |      E1      | R1H  | R1L  |  = ER1
      +--------------+------+------+
      |      E2      | R2H  | R2L  |  = ER2
      +--------------+------+------+
      |      E3      | R3H  | R3L  |  = ER3
      +--------------+------+------+
      |      E4      | R4H  | R4L  |  = ER4
      +--------------+------+------+
      |      E5      | R5H  | R5L  |  = ER5
      +--------------+------+------+
      |      E6      | R6H  | R6L  |  = ER6
      +--------------+------+------+
      |      E7      | R7H  | R7L  |  = ER7
      +--------------+------+------+
              |         pc         |
              +--------------------+
                     | EXR  | CCR  |
                     +------+------+

メモリー空間モード

ノーマルモード64kB
アドバンストモード16MB
  • H8/3694F (H8 tiny) は常に64kB空間で動くらしい。
  • アドバンストモード(32bit空間)というかh8/300H用のコードを落とすときは -mh オプション。
  • H8Sのコードを落とすときは -msオプションが必要。
  • H8/3694Fは64kモードなので、オプションを -mh -mn と入れる。さらに int のサイズを32bitにするときは -mint32 も入れる。

アドレッシングモードの癖

No.アドレッシングモード記号
1レジスタ直接Rn
2レジスタ間接@ERn
3ディスプレースメント付きレジスタ間接@(d:16,ERn)/@(d:24,ERn)
4ポストインクリメントレジスタ間接@ERn+
プリデクリメントレジスタ間接@-ERn
5絶対アドレス@aa:8/@aa:16/@aa:24
6イミディエイト#xx:8/#xx:16/#xx:32
7プログラムカウンタ相対@(d:8,PC)/@(d:16,PC)
8メモリ間接@@aa:8
  • 8ビット絶対アドレス(@aa:8)は、上位ビットすべてが1に拡張される(0xffffXX)
  • 16ビット絶対アドレス(@aa:16)は、上位8ビットは符号拡張扱い(0〜0x7fff,0xff8000〜0xffffff)
  • メモリ間接 (@@aa:8)は jmp,jsrでしか使えない。
    • アドレスaa:8は0〜255の番地を指すことしか出来ない。(つまり、例外ベクター内のテーブルジャンプとなる)
    • ノーマルモードでは @aa:8 の指す番地の2バイトを飛び先とする。
    • アドバンストモードでは@aa:8 の指す番地の4バイトのうち下位24ビットを飛び先とする。

速いのか?

  • H8/3048とかでは外部バス(16ビット/8ビット幅は選択できる)にコードやデータが置ける
    • かわりに、しこたまアクセスウェイトが掛かる。
  • 内蔵のFLASH ROMにコードを置く限りは、最短で1命令当たり2クロックで実行する。
    • ということは同一クロックならば、MC68000の倍程度の速度。
    • 最短で1命令当たり2クロックというのは、裏を返せば、内蔵FLASHROMの16ビットフェッチサイクルが2クロックということだ。
    • 20MHzで動かせば、68000の40MHz相当だ。
    • だが、典型的なld命令である、以下のケースでは
      mov.l @(d:16,ERsrc),ERdst ... ワード長3+データアクセス2=5回
    • 5回のバスフェッチが入るので10クロックだ。
    • これを長いと見るか短いと見るか。
    • 普通のRISCなら1クロックだ。(キャッシュにHITする場合のみの話)


  • H8Sでは、最短で1命令1クロックの実行が出来るようになったらしい。
    • つまりH8の半分になる。

方針

  • 普通にメモリーダンプとポート書き換えとSレコードの読み込みと、自作プログラムのRAM上実行が出来ればいいだけなんだけど。
  • ROMは32kBしかないので、まあ4K以下で書きたい。
    • じゃあ、余った28kBに何を置くかと言われても困る。

今後の目標

いったいあんたはH8tinyで何をしたいのか

  • AVRの補完
    • 内蔵RAMがちょっとだけ多いとかA/Dとかピン数が多いとか。
    • だけどUSB接続出来ないのでAVR-USB経由で繋げばいいんじゃあ。
  • 結局のところA/D使って簡単なデジタルテスターもどき。
  • もうちょいピン数の多いやつ(3048)を使った場合は、ROMライタとか。
    • AVRのmega644とか使えば出来るんだけどね。H8じゃなくても。

続き H8/tinymon