H8/325

組み込み用8 bitマイクロプロセッサとして日立はZ80 CPU上位互換のHD64180ファミリを一時期展開しましたが、その後、独自のアーキテクチャを持つH8シリーズに移行していきます。
ここに示すH8/325はH8/300 CPUコアを持つシングルチップマイクロコンピュータです。32 KByteのROMに1 KByteのRWMを内蔵しています。さらに16 bitのフリーランニングタイマモジュールが1チャネル、8 bitのタイマモジュールが2チャネル、シリアルインターフェース2チャネル、53本のプログラマブルプルアップ付きI/Oポートとその一部でハンドシェーク付き入出力を行うためのインターフェースといった入出力機能も備えています。もちろんクロック発振回路も内蔵で、M6800系周辺LSIを接続するためのEクロック出力も可能ですし、内蔵メモリ以外に外付けメモリを接続するためのモードやら内蔵ROMを切り離して外部メモリのプログラムを実行するモードもあります。CMOSプロセスで製造され、低消費電力モードも当然含まれています。といった具合に、今時の、充実した周辺回路を内蔵した8 bitマイクロコンピュータに仕上がっています。

HD6473258
32 KByteのOne Time EPROMを内蔵しているHD6473258です。シュリンク64ピンDIP入り。

H8/300 CPUコアは、8 bit幅の汎用レジスタ16本を備えています。その8 bit幅のレジスタを組み合わせて、8本の16 bit幅のレジスタとして使用することもできます。日立はRISC風のアーキテクチャだというような表現も使用していて、確かに演算命令はレジスタ・レジスタ間演算が基本だったり、できるだけ2 Byte命令に揃えようとしていたりRISCっぽさも少しはあります。しかし、それなりに便利なアドレッシングモードや命令を備えた充実した命令体系になっていて、RISCというより、ごく普通の整理されたアーキテクチャのプロセッサというべきでしょう。

H8/300のレジスタ構成はこのようになっています。
H8/300 registors

Rで始まるのが汎用レジスタで、8 bitレジスタとして使用する場合にはR0H - R7HとR0H - R7Hの合計16個となります。RxHとR0Lを組み合わせてRxという8組の16 bitレジスタとしても使えます。ただしR7はスタックポインタとしても使用されます。なお、16 bitレジスタを扱える命令はMOV命令や加減算命令など比較的少数の命令だけに限定されています。
プログラムカウンタは16 bitです。このレジスタ構成からも想像されるように、H8/300のアドレス空間は16 bitで、特にアドレス拡張の機構は用意されていません。もともと内蔵のROMとRWMでプログラムを動かすのが普通のシングルチップですから、十分でしょうね。
フラグ類はコンデションコードレジスタ(CCR)に集められています。下位ビットからキャリー、オーバーフロー、ゼロ、ネガティブ、ユーザ、ハーフキャリー、ユーザー、割り込みマスクという役割が与えられています。ユーザフラグは2種類用意されていますが、これはプログラムの中で1 bitの記憶が必要なときにそれぞれのユーザフラグを自由に利用できるようにしたものです。演算命令の副作用で変化することはありません。
8 bitのシングルチップ用プロセッサといっても、8080とかMC6800とかと異なり、PDP-11的というか比較的新しい洗練された16 bitプロセッサ風というか、特別な機能レジスタが排除されてすっきりとした汎用レジスタ構成になっています。レジスタ数も組み込み用にしてはぜいたくな量が用意されていますね。

アドレッシングモードには次の10種類があります。

任意の命令で自由に上記のアドレッシングモードを利用できるわけではなく、各命令ではかなり限定されたアドレッシングモードしか利用できません。自由度が高いのはMOV命令くらいですけど、それでもたとえばレジスタをメモリに格納するときにはプリデクリメント付きレジスタ間接モードが使えてもポストインクリメント付き間接モードが使えないとか、メモリからレジスタにデータを読み込む場合には逆にポストインクリメント付き間接モードが使えてもプリデクリメント付きレジスタ間接モードが使えないとか、制限があります。とはいえ、従来の8 bitマイクロプロセッサと比較してみると、インデックスレジスタとして利用できるレジスタ数が多いこともあって、便利に感じます。

命令については概要だけ
命令 サイズ 概要
MOV    B/W  レジスタ・メモリ間データ転送、多様なアドレッシングモードを使える
MOVFPE  B   Eクロックに同期させた周辺回路からレジスタへの転送
MOVTPE  B   レジスタからEクロック同期周辺回路への転送
POP*    W   レジスタのポップ、MOV.W @SP+, Rnの別名
PUSH*   W   レジスタのプッシュ、MOV.W Rn, @-SPの別名
ADD    B/W  レジスタ間加算、あるいは8 bitレジスタに定数加算
SUB    B/W  レジスタ間減算、あるいは8 bitレジスタからの定数減算
ADDX    B   キャリー付きのレジスタ間あるいは定数加算
SUBX    B   キャリー付きのレジスタ間減算あるいは定数減算
INC     B   レジスタのインクリメント
DEC     B   レジスタのデクリメント
ADDS    W   16 bitレジスタへの+1あるいは+2
SUBS    W   16 bitレジスタからの-1あるいは-2
DAA     B   加算時BCD補正
DAS     B   減算時BCD補正
MULXU   B   8 bit乗算
DIVXU   B   16 bit数値を8 bit数値で割る
CMP    B/W  レジスタ間比較、あるいは8 bit定数との比較
NEG     B   2の補数の符号反転
AND     B   レジスタ間、レジスタ・定数間のAND
OR      B   レジスタ間、レジスタ・定数間のOR
XOR     B   レジスタ間、レジスタ・定数間のXOR
NOT     B   レジスタ内容のビット反転
SHAL    B   レジスタ内容の算術左シフト
SHAR    B   レジスタ内容の算術右シフト
SHLL    B   レジスタ内容の論理左シフト
SHLR    B   レジスタ内容の論理右シフト
ROTL    B   レジスタ内容の左回転
ROTR    B   レジスタ内容の右回転
ROTXL   B   レジスタ内容とキャリーを合わせた左回転
ROTXR   B   レジスタ内容とキャリーを合わせた右回転
BSET    B   指定ビットのセット
BCLR    B   指定ビットのクリア
BNOT    B   指定ビットの反転
BTST    B   指定ビットのZフラグへのロード
BAND    B   指定ビットとキャリーのANDをキャリーへ
BIAND   B   指定ビットの反転とキャリーのANDをキャリーへ
BOR     B   指定ビットとキャリーのORをキャリーへ
BIOR    B   指定ビットの反転とキャリーのORをキャリーへ
BXOR    B   指定ビットとキャリーのXORをキャリーへ
BIXOR   B   指定ビットの反転とキャリーのXORをキャリーへ
BLD     B   指定ビットをキャリーへロード
BILD    B   指定ビットの反転をキャリーへロード
BST     B   キャリーを指定ビットにロード
BIST    B   キャリーの反転を指定ビットにロード
Bcc     -   条件分岐
JMP     -   無条件ジャンプ(レジスタ間接、16 bit絶対、メモリ間接モード可)
BSR     -   相対アドレッシングのサブルーチン呼び出し
JSR     -   サブルーチン呼び出し(レジスタ間接、16 bit絶対、メモリ間接モード可)
RTS     -   サブルーチンからのリターン
RTE     -   例外ハンドラからのリターン
SLEEP   -   パワーダウンモードへ遷移
LDC     B   レジスタか定数をCCRへロード
STC     B   CCRをレジスタへロード
ANDC    B   CCRと定数をAND
ORC     B   CCRと定数をOR
XORC    B   CCRと定数をXOR
NOP     -   ノーオペレーション
EEPMOV  -   メモリ上のデータのブロック転送

Return to IC Collection