ニャオニャオ21世紀

レトロゲーム(MSX、PCエンジン、セガサターン)と、MSXぽいアプリ開発と、最新ゲーム(PS4、SWITCH)、身体(身体意識など)、ライフハック、電子工作ほか雑記を綴っています

MSXマシン語入門(Z80 アセンブラ・機械語) 第30回 I/Oポートについて(VDP) 勉強レポート 






f:id:nyaonyaokun:20181011072553j:plain

 

I / Oポートって何?

よく聞くのですけど、いまいち分からなかったんです。

Windowsでもポートの何番をあけてどうのこうのというのをよく聞くのですが....

 

MSXのハードの構造を読んでよくわかりました^^

 

MSXハード構成

 

   CPU ------ I/Oポート------ VDP

      |                                          |

  メモリ                                VRAM

 

 

このようになっているそうです。

CPUで計算した結果を出力したり、値を入力するために、

外部機器とデータをやりとりしないといけないのですが、

それらの機器が、I / Oポートにつながっているそうなのです。

(キーボード、プリンタだけでなく、VDP、PSGなどのチップも)

 

MSXの場合、I / Oポートは、全部で256個あります。

CPUからI/Oポートにデータを送り、そこに繋がっている機器に、

そのデータを送り込んだり、

機器の繋がっている、I/OポートからデータをCPUに入力したりします。

 

よくVDPを操作するのに、I/Oポートを使うとかあるので、

それはなんじゃい?と思っていたのですが、

これで意味がわかりました^^

 

I/Oポートの何番かがVDPと繋がっていて、

そのI/Oポートに描きたいデータを送るというのをやるのですね?

(VDPに直接データを送るのはできないらしいです。I/Oポートを通してしか^^)

 

まぁI/Oポートを直接操るのは、基本的にはダメらしいのですが、

(将来的な互換性のためとかなんとか)

VDPに限りOKみたいです。

 

I/Oポートの入出力命令マシン語  IN / OUT

 

 入出力する値は、Aレジスタに入れます。

 IN       A , (89H)

 

OUT    (91H) , A

 

といった風に使います。

INは、89H番ポートから、CPUのAレジスタに入力します。

(CPUに値を取り込む)

 

OUTは、91H番ポートへ、Aレジスタの値を出力します。

(VDPとかへ値を送り込むとき)

 

または、

IN        B , (C)

OUT   (C)  , B

という風に、Cレジスタの値をポート番号にして、Bレジスタに値をいれることも出来るそうです。 

 

本には、各ポート番号がなにに割り当てられてるか書いてありますが、

省略します。

 

MSXマシン語入門講座
MSXマシン語入門講座
posted with amazlet at 18.10.08
湯浅 敬
アスキー
売り上げランキング: 917,197
 

VDPのポート番号だけ。

ポート番号

98               ->   Wの場合、VRAMへのデータライト

                     ->   Rの場合、VRAMからのデータリード

 

99          ->   Wの場合、コマンド、アドレスセット

                     ->   Rの場合、ステータスリード

 

この本には、I/Oポートを使ったVRAMの入出力のサンプルコードがなかったので、

こちらのサイト様を参考にしてください^^

 

超人MSX

 

 あとTiny野郎さんのツイートが面いです^^

 

サンプルプログラムのファイルもダウンロードできます!

MSX1だけど頑張って高速スクロール - YouTube

 

OUTIというのは、ブロック出力命令だそうです。

一度にまとめて送るのに使われるみたいです。

 

 

MSXの適当手帳

さまの、こちらのページにも詳しく書いています。

VDP/VRAM ACCESS TIMING

 

 

OTIR命令

メモリのデータのまとまりを、I/Oポートへまとめて送る命令

HLレジスタ   ...    転送するメモリのはじめの番地

Bレジスタ     ...    データ量(何バイトのデータを転送するか)

Cレジスタ     ...    ポート番号

 

メモリの9000H番地 ~ 907FH番地までのデータを、I/Oポートに送る場合、

HLに9000H、Bに80H、Cにポート番号をセットしてから、

OTIRを実行。

 

なお、VDPのポート番号ですが、MSXの機種により異なるそうでして...

(98、99ではダメなのかな?)

メモリの0006H番地と0007H番地に、VDPのポート番号が入っているので、

そこを調べてレジスタCに入れればいいらしいです。

0006H番地: VRAMからのデータの呼び出し

0007H番地 :     VRAMへのデータの書き込み

 

まとめ

このあたりは、実に面白いです。

VDPへのアクセスは、I/OポートへOUTしてやると、

速度が速いみたいですね〜。

BIOSを使って、VRAMの操作をすると遅くなるらしいです。

Tiny野郎さんのスクロールの動画なんかは、とても速くて驚きました^^

 

でもなんとなく分かってきました^^

あとはサンプルプログラムをよく読んでいくことが大切なのかなぁ。

 

次回は、カーソルキー(ジョイスティック)での入力をやります。

ここはゲームに直結ですね!

じつに楽しみです^^

 

MSX関係のお買い物はこちらでどうぞ^^

msx | 通販ショップの駿河屋

  

それでは〜。

 

 

 

 

 


「ニャオニャオ21世紀は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」

当サイトは第三者配信の広告サービス「Google Adsense グーグルアドセンス」を利用しています。 広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用することがあります。 Cookie(クッキー)を無効にする設定およびGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください