現在地

8088ボード(ソフトウェア編)


カテゴリー:

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のメモリは少ないので全てを単一セグメントに入れることができますが、ワークやスタックのためのエリア(DSSSに同一の値を入れていますが別にすることも容易と思います)とコードのためのエリア(当然CSを仕様)を別セグメントに配置できるようにしました。注意を要するのは文字列出力ルーチンで、CSを使うMSGOUTDSを使う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出版社.
広告: 

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。