TMS9918にはもう一つ、マルチカラーモードという設定があり、このグラフィックモードでは画面の解像度を落として、その代わりにドット単位に任意の着色ができるようになります。
スクリーン座標系(X:0..63、Y:0..47)に任意のカラーパレット色(col:0..15)でピクセルを描画する関数set_pixel()です。
座標から対応するVRAM上のメモリアドレスを計算しますがVRAM1バイトにピクセル2個(4ビットで16色を表現)が対応するので既に描画済のピクセルを消さないように論理演算して新しいデータに更新しています。
![イメージ 1](https://cdn-ak.f.st-hatena.com/images/fotolife/O/O3I/20190804/20190804201655.jpg)
これですべてのカラーパレットを表示した例です。左端2マスは透明と黒なのでバックグラウンドに同化していますが他の色も仕様通りなんでしょうが冴えない中間色です。
![イメージ 2](https://cdn-ak.f.st-hatena.com/images/fotolife/O/O3I/20190804/20190804201659.jpg)
任意の点に描画できるのでサイン波を1周期書いてみました。
ただしC99コンパイラには組込みの三角関数は無いので(もともと整数しか扱えないし)64ステップを1周期として24を中心に±24振れるようなサイン波を整数に丸めたデータをEXCELで作成しそれをソースに埋め込んでいます。
![イメージ 3](https://cdn-ak.f.st-hatena.com/images/fotolife/O/O3I/20190804/20190804201705.jpg)