2020-07-09 11:44 — asano
カテゴリー:
8088ボードのソフトウェアについて書いてみます。
動かすのはいつものようにUniversal Monitorです。
8086系は8080に似ていますし、以前(30年ほど前です)書いていたこともあるので、あまり苦もなく書けますね。フラグ変化とか細部はもちろん憶えてはいないので資料確認しながらですし、アセンブルすると使えないレジスタ指定しててエラーになったりはありますが、書いているうちにすぐに慣れていきます。
まずはコンソールドライバ、EMILY Board用のものを6502から、8251用のものを8080から移植しました。ほぼ機械的な変換で済みますが8251の初期化部分にはNOP
を追加(8251はまだ配線もしていないので動作未確認)しています。
EMILY Boardで文字列出力まで確認できたら、D(ump), G(o), S(et), L(oad)の順に8080から移植していきます。ここも基本的には機械的な変換ですが8086にはセグメントがあるので考えなくてはならないことがあります。
- EMILY Boardのメモリは少ないので全てを単一セグメントに入れることができますが、ワークやスタックのためのエリア(
DS
とSS
に同一の値を入れていますが別にすることも容易と思います)とコードのためのエリア(当然CS
を仕様)を別セグメントに配置できるようにしました。注意を要するのは文字列出力ルーチンで、CS
を使うMSGOUT
とDS
を使うSTROUT
の2つに分けています。これはAVRなどと似ています。 - コマンドの対象となるセグメントの指定も必要になります。これは
segment:offset
の形式で指定し、セグメントを省略した場合は最後に使ったセグメント使うことにしました。アドレス表示も同じ形式で表示します。
内部的にはES
をこのために使用しています。 - L(oad)コマンドも本来はIntel HEXの02レコードやSレコード形式のS2レコードに対応すべきですが未対応です。L(oad)コマンドのパラメータにセグメントを含んだオフセット指定をすれば64kB以内のデータを任意のエリアにロード可能なのでそれほど困らないと思っています。
続いてR(egister)コマンド関連も実装しました。ここはプロセッサ毎に考えなくてはならないことが多くあります(そこが面白いところです)ので、ワークに保存されているレジスタ値の変更部分は6809用を元にしていますが残りはほぼ新規ですね。
- ブレーク命令は唯一の1バイト
INT
命令の0CCH(INT 03H
)を使用します。本来の命令に書き戻して継続実行させることを考慮しIP
レジスタの値はINT 03H
命令のアドレスに調整されます。2バイトの0CDH,03Hを使用するとずれるので注意してください。 - Division error, Overflowの発生時にもブレークします。これらの場合は
IP
レジスタの値は原因となった命令の次のアドレスとなります。 - Single stepも同様にブレークするように書いていますが、まだ動作確認ができていません。
- 上記いずれかでブレークすると全レジスタを表示しますが、これまではレジスタ名の表示と値の表示をレジスタ数分並べていたのをレジスタ数が多いのでテーブルとループに変更しています。
参考文献・関連図書:
R.レクター・G.アレクシー(1982)『ザ8086ブック』秋葉出版.
井出裕巳(1982)『図解16ビットマイクロコンピュータ 8086の使い方』オーム社.
相沢一石(1989)『8086ファミリ・ハンドブック』CQ出版社.
関連項目:
広告:
コメントを追加