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レジスタに値をいれることも出来るそうです。
本には、各ポート番号がなにに割り当てられてるか書いてありますが、
省略します。
VDPのポート番号だけ。
ポート番号:
98 -> Wの場合、VRAMへのデータライト
-> Rの場合、VRAMからのデータリード
99 -> Wの場合、コマンド、アドレスセット
-> Rの場合、ステータスリード
この本には、I/Oポートを使ったVRAMの入出力のサンプルコードがなかったので、
こちらのサイト様を参考にしてください^^
あとTiny野郎さんのツイートが面いです^^
「MSX=カクカクスクロール」という固定観念を打ち破るべく。
— TINY野郎 (@tiny_yarou) January 5, 2018
■MSX1だけど頑張って高速スクロール https://t.co/jOckSEv4K6
サンプルプログラムのファイルもダウンロードできます!
OUTIというのは、ブロック出力命令だそうです。
一度にまとめて送るのに使われるみたいです。
さまの、こちらのページにも詳しく書いています。
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関係のお買い物はこちらでどうぞ^^
それでは〜。
BASICの情報はこちらへ^^