ボードが出来たら動作確認です。
まずはφに1/2のクロック(8MHz)が出てくるのを確認します。これで電源が正しく供給され、デバイスも生きているらしいことがわかります。
続いてバスにLED繋いだ状態で短い無限ループを実行してみます。最短2バイトでループできますが、アドレスバスのLEDを見ているとかなり先(4バイト?)までプリフェッチしているらしいのがわかります。
ここまで来たらいつものようにUniversal Monitorの移植に入ります。
最初はコンソールとしてEMILY Boardの仮想UARTで書き始めましたが、文字列表示までできたところで内蔵SCIにも対応しました。日立のSCIは共通なのでH8/300用をそのまま移植して動きました。
H8/300とH8/500は同じH8ファミリで似ていますが、大きく異なる点もあり同一ソースから条件アセンブルは無理と思います。
今回の移植で一番困ったのは、H8/300ではR0~R7を上下に分割して2つの8ビットレジスタとして使えるのに対し、H8/500では上半分を8ビットレジスタとして使うことができない(下半分はできる)ことです。SWAP命令を使えばできなくはありませんがかなり面倒なことになります。
もう一つは64kBを超えるメモリ空間を扱う方法です。
H8/300系のメモリ空間はノーマルモードで64kB, アドバンストモードなら16MBまで、H8/500もミニマムモードでは64kB, マキシマムモードでは16MBと同じに見えますが使い勝手はまったく異なります。
H8/300Hではレジスタが32ビットに拡張されている(Z8000のようにペアにするのではないので使用可能な数も減らない)のでリニアな16MBの空間が得られます。
一方H8/500では64kBのページに分かれています。どのページを使うのかはCP(Code page), DP(Data page), TP(sTack page), EP(Extend page)の各レジスタによって決まります。なんか8086のセグメントレジスタに似ていますね。
8086のセグメントレジスタはアドレッシングモード(とアドレスレジスタ)によってデフォルトは決まっているもののプレフィックスによって変更できましたが、H8/500のページレジスタはアドレスレジスタによって決まっていて変更できません。例えばEPレジスタを使いたいならR4かR5の間接アドレッシングを使わなくてはなりません。
今回H8/300用をベースに移植を行ないましたが、上記2点のためレジスタ割り当てを大きく変更する羽目になりました。
ページレジスタの割り当ては以下のようにしています。
CPとTPはコードとスタックで選択の余地がありません。DPはワークエリアを指しています。EPにはCPと同じものを入れてメッセージ文字列の読み出しに使っています。各コマンドでメモリアクセスする際には一時的にEPを変更しています。
内蔵I/Oのレジスタ($00FF80~$00FFFF)はBRレジスタを使った8ビット絶対アドレッシングを用いて常にページ0を使用しています。
その他、気になった点は......
INC, DEC命令が無いこと。
これはADD:Q命令(即値が±1, ±2の時短いコードがある)で代用できます。ただしSUB:Qは無いので注意、ADD:Q #-1,R1などとします。
あとこれはH8/300系もそうですが、16ビット値は奇数アドレスに置けないこと。
基板配線した直後なので8ビットバスとの意識が強くハマってしまいました。
コメントを追加