IOの実装を進めた。
色々あるのだけと一番大きいのはシフトレジスタだ。
参考になるのはこのページで
最初は理解できなかったが16bitのシフトレジスタがあってout portの4番に書き込むと上位8bitにセットされる。
更に書き込むと前回のデータはシフトされて下位8bitに移り書き込んだデータが上位8bitにセットされる。
コードで書いたらこんな感じになるか
@shift_data = 0 def out_port_4 val @shift_data >>= 8 @shift_data |= (val & 0xff) << 8 end
そしてout portの2番に更にシフト量を指定できる。
先ほどの16bitレジスタがシフト量分左にシフトされる。
そのシフトされた値はin portの3番で得られるが上位の8bitを返す。
@shft_amount = 0 def out_port_2 val @shift_amount = val & 0x7 end def in_port_3 ((@shift_data << @shift_amount) >> 8) 0xff end
インベーダーの描画にはこのシフトレジスタが使用されている。
bit操作が必要ない様に画面を90°回転させていてるのかと思っていたがそうではないらしい。
i8080は1bit分のシフト操作しかないのでそれを補うためのものだろう。
前回 インベーダーが表示されていなかったが、このシフトレジスタが実装されていなかったのでシフトした結果が0になって表示されていなかった事になる。
こちらが結果である。

インベーダーは表示される様になったが、ミサイルやビームが貫通して当たり判定がされてない様だ。
こちらはIOとは関係していない気がするのだが…
また時間ができたら調べよう。