見出し画像

自分で点を打つ世界

今のPCはグラフィック画面の1ドットが見えないくらい精密な描画をしていますし、APIに座標を指定すればサッと点を打ってくれるのが当たり前なので、どうやって点を打つかなんて気にする必要はまったく無いのですが、8ビットな時代には、必ずしもそんな便利なサブルーチンが提供されているとは限らず、有っても汎用的には便利であっても特定の用途ではパフォーマンスに難があったりして、自力で点を打つ必要に迫られることも無くはありませんでした。

グラフィック画面はVRAMと呼ばれる特定のメモリ領域が使われていて、機種によって構造は大きく異なるのですが、良くある構造はカラープレーンごとに特定のアドレスからビット単位で横方向にデータが並べられて画面の右端まで行くと次の縦方向のデータが続くというものです。

VRAMの構造(例)

ですから(0,12)に点を打ちたければ、12は12/8(整数除算)の結果である1をベースアドレスに加えた$C001のバイトの値を、12 MOD 8の結果が4なので、該当するビットである$08の位置のビットを1にするわけです。このバイトには現在の状態の値が既に入っているので、この値をORすることで点を打ちます。これがカラーの場合、必要な色を持っているプレーンに対して複数回行ってようやく目的の色の点が打てるわけです。

メモリがバイト単位なのに対して、点はビット単位で考えなければならないので、何ともややこしい処理に見えるのですが、アセンブラで考えれば、これでもそんなに複雑な処理ではありません。もっとも機種によっては、こんなに単純ではなく、APPLE][(ハイレゾ)の場合、なぜか各バイトの最上位ビットには特別な意味があってX座標は7ビットごとになる上に、Yの位置ごとに飛び飛びのベースアドレスを持つので、計算式はあるもの少なくとも見た目はかなり面倒です。

APPLE][ REFERENCE MANUAL 日本語版 P21より

なお、いわゆる簡易グラフィックとも呼ばれる1文字を2✕2であるとか、もう少し細かく分割したブロックを文字フォントを使って実現しているグラフィックの場合は、打ちたい点に対応する「文字位置」を計算して、そのバイトの「文字コード」から点を打った場合の「文字コード」に置き換えるという処理になるわけです(APPLE][もローレゾは、これと似た処理です)。

MZ-80Kシリーズの場合

こうしてようやく点が打てるのですが、さらに直線を引こうとすれば、直線上の点の位置をひとつずつ計算して1点ずつ、この処理を繰り返していくのです。直線やその他の線については、またいずれ。

ヘッダ画像は、以下のものを使わせていただきました。
https://free-materials.com/囲碁の写真素材03/#google_vignette

#グラフィック処理 #点 #VRAM #アドレス計算 #APPLE2 #MZ80K

この記事が気に入ったらサポートをしてみませんか?