H8/3694遊び
今週のテーマ:†
とりあえずこいつを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