プチコン4 SmileBASIC でいろいろ遊んでいますが、プチコン3号から バックグラウンド画面(BG) 周りの変更が大きい気がします。過去のサンプルもこれが原因で動いていないものが多そう。
今回の範囲
バックグラウンド画面用のキャラクタ(画像タイル)の話で、今回は 16bit 用の以下の部分が主な対象です。
どう変わった?
ざっくり言えば、テキスト表示周り が拡張され、バックグラウンド画面(BG)機能を取り込んだ、ですかね。従来の BG* 系の命令が、T* 系に統合され、廃止されています。
例えばプチコン3号のサンプルで、マニュアル にある以下の例は
' 座標(3,3)に将棋のコマ(歩)をセット
BGPUT 0,3,3,18
以下のように書き直す必要があります。
' 座標(3,3)に将棋のコマ(歩)をセット
TPUT 0,3,3,&HE800+18
より詳細な説明
プチコン3号では、BGキャラクター番号として 0~4095 が指定できました。つまりは 4096個のバックグラウンド画面用のキャラクタ(画像タイル)が利用できたわけです。
※ あくまで文法的には。実際に定義され利用できるのは 0~1023 だった気が
プチコン4でもこの仕様は変更されていません。やはり4096個のバックグラウンド画面用のキャラクタ(画像タイル)が利用できます。ただし、それがテキスト表示用の文字(漢字も含む)フォントと同じ扱いになりました。
いまコンピューターの世界で、最も使われている文字コードは Unicode です。UTF-8 とか UTF-16 だとかいうのも、Unicode の仲間(フォーマットのバリエーション)です。1文字を16bitで表現するコードです。
※ 厳密に言えば16bitで表現するのは Unicode の一部で、これを 基本多言語面、Basic Multilingual Plane、BMP と呼びますが、説明が長くなるので、今回は Unicode = BMP のみの前提で話を進めます
プチコン4 も Unicode を採用しています。
Unicode には全世界で決まった文字が定義されていますが、例外的に、自由に使ってよい領域があります。外字エリア、私用領域、などと呼びます。これが E000 ~ F8FF の間の 6,400 文字です。プチコン4では、この私用領域を使ってバックグラウンド画面用のキャラクタ(画像タイル)を管理しています。
Unicode の私用領域のうち、E000 ~ E7FF の間の 2,047 文字は、プチコン4 のシステムで利用しているようです。こんな感じで、プチコン3号時代からある独自文字の実装に使用されている模様。
そして E800 ~ F7FF の間の 4,096 文字が、バックグラウンド画面用のキャラクタ(画像タイル)のために使用されます。以下のサンプルをもう一度、眺めてみてください。
' 座標(3,3)に将棋のコマ(歩)をセット
TPUT 0,3,3,&HE800+18
表示される画像(将棋の歩)を指定するコード 18 に加算されている &HE800 が、このバックグラウンド画面用のキャラクタ(画像タイル)のために使用される領域の、先頭アドレスであることがわかります。
プチコン3号のプログラムを簡易的に動かしたい場合、以下のような関数を追加しても良さそうですね。(アトリビュート値に対応していませんが)
DEF BGPUT P,X,Y,C
TPUT P,X,Y,&HE800+C
END
4,096 種類である意味
気がつかれた方が居ますでしょうか、Unicode の私用領域の F800 ~ F8FF の 256 文字が利用されていないことに。
貧乏性の私としては、プチコン4で仕組みを変えるのですから、このチャンスに、4096 種類のバックグラウンド画面用のキャラクタ(画像タイル)を増やしてもいいのではないか?この 256 文字も使えば良いのではないか?と思いました。
でも、考えてみたら、それは内部仕様に合わないのです。4,096 という数には意味がある。
4096 * 16 * 16 = 1,048,576 = 1024 * 1024
この意味不明な数は、ドット数を意味しています。
内部的に、これらバックグラウンド画面用のキャラクタ(画像タイル)のデータは、横64文字、縦64文字で並べられ、1つのグラフィックデータとして管理されています。そのサイズが丁度、1024x1024 ドットで、システム的な画像サイズ2048x2048の1/4であり、すごく扱い易いんですよ。
というわけで、私用領域の残り 256 文字をうまく使うことよりも、この 4,096 という扱い易い数を維持することは、とても自然であることが理解できます。
今回のサンプル
さて今回、以下のようなサンプル・プログラムを作成してみました。
実行すると、プチコン4で定義された 4,096 個のバックグラウンド画面用のキャラクタ(画像タイル)が表示され、左の上下ボタン
で上下にスクロールします。左右だとより大きくスクロールします。
最後までスクロールさせると、こんな感じ。
横幅が足りなかったので、Xボタン
で右半分といいますか、もう1セットのほうに切り替わります。
終了は Bボタン
です。
まあ全体像は標準の SmileTool2 でも見られますが、文字コードとあわせて探す場合に、ちょっとだけ実用的かもしれません。
補足 - キャラ番号について
と、ここまで書いて気がつきましたが、プチコン3号とはキャラ番号が異なっているものも多くありますね。ググったら以下がヒットしました。
確かに、今回作成したサンプルで言えば、Xボタンを押した後に表示される部分が、プチコン3号には無かった気がします。
この並びの違いを考慮すると、BGPUT の簡易互換関数は以下のような感じになりますかね?
DEF BGPUT P,X,Y,C
TPUT P,X,Y,&HE800+C DIV 32*64+C MOD 32
END
というわけで
プチコン4 でいろいろ遊びつつ、プチコン3号からの変更点で、特に自分が戸惑った部分をまとめてみました。まとめることで自分の中でも整理でき、より理解が深まった気がします。
今後も何か気になる点がありましたら、こうやってまとめてみたいと思います。
ではでは!