C.P.U. フォーマット 1/2 [お絵かき]
ご心配をお掛けしましたが、ガベージコレクションも終了(笑)し、復活いたしました。
グラフィックエディタ関係の記事で色々な画像を紹介してきましたが、今回は画像データの圧縮についてです。
PC-8801シリーズや初期のFM-8/7シリーズでは、カラーグラフィックは全画面サイズで 640 pixels × 200 pixels の大きさがあります。
データサイズだと 640 pixels × 200 pixels × 3 planes = 384,000 bits = 48,000 bytes = 48 Kbytes です。
Microsoft の Disk BASIC が標準で使用していたディスクフォーマットだと、2D メディアの容量が 40 tracks × 16 sectors × 256 bytes × 2 sides で 327,680 bytes ですから、非圧縮状態で画像を格納しようとすれば、327,680 ÷ 48,000 ≅ 6.826 ということで、システムやローダーが無い状態でも6枚しか保存できないことになります。
ちなみに、当時はまだ5インチフロッピーディスクの値段が高く、一枚250~500円程度でした(発売当初は一枚1,500円程でした)。
「お絵かきプログラム」で作られたデータのサイズは 20 KBytes を超えるものもありましたが、非圧縮状態で保存すると 48 KBytes にもなってしまい、1枚のフロッピーには今までの半分程度の枚数しか保存できない上、パターンで塗りつぶされた領域の多い美少女キャラ画像をデータ圧縮をせずに保存するのは効率が悪いということで、美少女キャラ画像を効率よく圧縮するための方法が考案されました。
それが「C.P.U.フォーマット」です。
リン・ミンメイ
上の「リン・ミンメイ」の一部を拡大したのが下の画像です。
「Graphic Editor 88」だと拡大できる範囲が小さいので、PNG 形式に変換したものを Windows に付属の「ペイント」で拡大してあります。
拡大画像
肌色の部分には影の付き方に応じて合計4種類の「3色ペイント」が使用されています。
特に目の上の髪の毛の陰になっている部分は、色指定をあえて2色にすることで濃い影を表現していますし、瞳の中の色の付いた部分も同じ手法で描かれています。
髪の毛で光の当たっていない部分は「2色ペイント」が使用されています。
光源に近いベールの外側や髪の毛のハイライト部分は「単色ペイント」(通常のペイント)で表現されています。
複雑な配色を使ったクロマキーペイント(タイルペイント)ですが、『PC-8801 N88-BASIC の PAINT ステートメントで「タイルストリング指定」を使えば可能じゃないの?』 と言う声が聞こえてきそうなので、ちょいと補足しておきます。
N88-BASIC の PAINT ステートメントには、領域を指定されたタイルパターンで埋めるために「タイルストリング」と言う機能があります。
とする代わりに、
と指定することで任意のパターンで領域を埋めることができます。
タイルストリング機能は、RGB それぞれの要素の横方向の塗りつぶしパターンを16進数に置き換えて文字列で指定することで、任意のパターンを使用した塗りつぶしが可能です。
文字列は先頭から、青、赤、緑の順で指定します。
例えば、
と指定すると、緑と水色の縦縞模様になります。
と指定すると、緑と水色の市松模様になります。
タイルストリングの指定を増やすことで、縦方向の繰り返しパターンを増やすことはできますが、横方向のパターンは 8 pixel 固定なので、横方向に3色を並べた「3色ペイント」は不可能です。
『それなら、縦方向の「3色ペイント」にすればいいんじゃない?』 と言われそうですが、
FM-8 や PC-8801 のグラフィック画面は 640 pixels × 200 pixels で、ピクセル自体が縦方向に長いため、縦方向に3色を並べると綺麗なタイリングになりません。
単色ペイント/2色ペイント/3色ペイントを共に効率よく圧縮するために「縦方向変則RL圧縮」(当時は、いや、今だってそんな言葉はないかもね)が採用されました。
RL圧縮とは、同じパターンが連続して現れる場合、パターンと連続する回数を記録することで圧縮する方法です。
RL圧縮について詳しく知りたい方は、Wikipedia: 連長圧縮 へどうぞ。
拡大画像を見てもらえば分かるのですが、どのペイントでも縦方向は異なる2色か同じ色の繰り返しになっています。
ですから、縦方向の2ピクセルを1パターンとしてRL圧縮をすれば、単色ペイント/2色ペイント/3色ペイント共に効率よく圧縮できるはずです。
つづく
★
グラフィックエディタ関係の記事で色々な画像を紹介してきましたが、今回は画像データの圧縮についてです。
PC-8801シリーズや初期のFM-8/7シリーズでは、カラーグラフィックは全画面サイズで 640 pixels × 200 pixels の大きさがあります。
データサイズだと 640 pixels × 200 pixels × 3 planes = 384,000 bits = 48,000 bytes = 48 Kbytes です。
Microsoft の Disk BASIC が標準で使用していたディスクフォーマットだと、2D メディアの容量が 40 tracks × 16 sectors × 256 bytes × 2 sides で 327,680 bytes ですから、非圧縮状態で画像を格納しようとすれば、327,680 ÷ 48,000 ≅ 6.826 ということで、システムやローダーが無い状態でも6枚しか保存できないことになります。
ちなみに、当時はまだ5インチフロッピーディスクの値段が高く、一枚250~500円程度でした(発売当初は一枚1,500円程でした)。
「お絵かきプログラム」で作られたデータのサイズは 20 KBytes を超えるものもありましたが、非圧縮状態で保存すると 48 KBytes にもなってしまい、1枚のフロッピーには今までの半分程度の枚数しか保存できない上、パターンで塗りつぶされた領域の多い美少女キャラ画像をデータ圧縮をせずに保存するのは効率が悪いということで、美少女キャラ画像を効率よく圧縮するための方法が考案されました。
それが「C.P.U.フォーマット」です。
★
リン・ミンメイ
上の「リン・ミンメイ」の一部を拡大したのが下の画像です。
「Graphic Editor 88」だと拡大できる範囲が小さいので、PNG 形式に変換したものを Windows に付属の「ペイント」で拡大してあります。
拡大画像
肌色の部分には影の付き方に応じて合計4種類の「3色ペイント」が使用されています。
特に目の上の髪の毛の陰になっている部分は、色指定をあえて2色にすることで濃い影を表現していますし、瞳の中の色の付いた部分も同じ手法で描かれています。
髪の毛で光の当たっていない部分は「2色ペイント」が使用されています。
光源に近いベールの外側や髪の毛のハイライト部分は「単色ペイント」(通常のペイント)で表現されています。
★
複雑な配色を使ったクロマキーペイント(タイルペイント)ですが、『PC-8801 N88-BASIC の PAINT ステートメントで「タイルストリング指定」を使えば可能じゃないの?』 と言う声が聞こえてきそうなので、ちょいと補足しておきます。
N88-BASIC の PAINT ステートメントには、領域を指定されたタイルパターンで埋めるために「タイルストリング」と言う機能があります。
PAINT (100,100), <境界色>
とする代わりに、
PAINT (100,100), <タイルストリング>, <境界色>
と指定することで任意のパターンで領域を埋めることができます。
タイルストリング機能は、RGB それぞれの要素の横方向の塗りつぶしパターンを16進数に置き換えて文字列で指定することで、任意のパターンを使用した塗りつぶしが可能です。
文字列は先頭から、青、赤、緑の順で指定します。
例えば、
PAINT (100,100), CHR$(&&H55)+CHR$(0)+CHR$(&&HFF), 7
と指定すると、緑と水色の縦縞模様になります。
PAINT (100,100), CHR$(&&H55)+CHR$(0)+CHR$(&&HFF)+CHR$(&&HFF)+CHR$(0)+CHR$(&&H55), 7
と指定すると、緑と水色の市松模様になります。
タイルストリングの指定を増やすことで、縦方向の繰り返しパターンを増やすことはできますが、横方向のパターンは 8 pixel 固定なので、横方向に3色を並べた「3色ペイント」は不可能です。
『それなら、縦方向の「3色ペイント」にすればいいんじゃない?』 と言われそうですが、
FM-8 や PC-8801 のグラフィック画面は 640 pixels × 200 pixels で、ピクセル自体が縦方向に長いため、縦方向に3色を並べると綺麗なタイリングになりません。
★
単色ペイント/2色ペイント/3色ペイントを共に効率よく圧縮するために「縦方向変則RL圧縮」(当時は、いや、今だってそんな言葉はないかもね)が採用されました。
RL圧縮とは、同じパターンが連続して現れる場合、パターンと連続する回数を記録することで圧縮する方法です。
RL圧縮について詳しく知りたい方は、Wikipedia: 連長圧縮 へどうぞ。
拡大画像を見てもらえば分かるのですが、どのペイントでも縦方向は異なる2色か同じ色の繰り返しになっています。
ですから、縦方向の2ピクセルを1パターンとしてRL圧縮をすれば、単色ペイント/2色ペイント/3色ペイント共に効率よく圧縮できるはずです。
つづく
なるほど、連長方式で圧縮していたのですね。
少ない容量をいかに効率よく使うか、無駄を省くか等々、当時のパソコンプログラミングは、容量や制限との戦いだったような気がします。そしてそうした制約との戦いを通じて、様々なテクニックを身につけていったものでした。
by 本名荒井 (2009-04-28 21:29)
本名荒井さん、コメントありがとうございます。
今では力技で解決してしまうようなプログラムを書いてしまったりしますが、当時はコンパクトかつスマートな方法を極限まで追求しました。
その結果出来上がったものを「芸術的プログラム」とか言ってましたね。
Z80で容量を節約する方法は PC80/88 の Microsoft BASIC を解析して身につけました。
by Thunderbolt (2009-04-29 14:10)
M_tさん、nice! ありがとうございます。
nice! 見逃してましたorz
御礼が遅くなりまして、すみませんm(_~_)m
by Thunderbolt (2010-07-13 03:42)