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


