LoginSignup
1
1

More than 3 years have passed since last update.

プチコン3号経験者によるプチコン4まとめ (1) BG画面とテキストの統合について

Last updated at Posted at 2019-07-14

プチコン4 SmileBASIC でいろいろ遊んでいますが、プチコン3号から バックグラウンド画面(BG) 周りの変更が大きい気がします。過去のサンプルもこれが原因で動いていないものが多そう。

今回の範囲

バックグラウンド画面用のキャラクタ(画像タイル)の話で、今回は 16bit 用の以下の部分が主な対象です。
2019071402311800-B4374FDA41BFF09D976C1FEA83EFB230.jpg

どう変わった?

ざっくり言えば、テキスト表示周り が拡張され、バックグラウンド画面(BG)機能を取り込んだ、ですかね。従来の BG* 系の命令が、T* 系に統合され、廃止されています。

例えばプチコン3号のサンプルで、マニュアル にある以下の例は

プチコン3号
' 座標(3,3)に将棋のコマ(歩)をセット
BGPUT 0,3,3,18

以下のように書き直す必要があります。

プチコン4
' 座標(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号時代からある独自文字の実装に使用されている模様。

2019071410510400-B4374FDA41BFF09D976C1FEA83EFB230.jpg

そして E800 ~ F7FF の間の 4,096 文字が、バックグラウンド画面用のキャラクタ(画像タイル)のために使用されます。以下のサンプルをもう一度、眺めてみてください。

プチコン4
' 座標(3,3)に将棋のコマ(歩)をセット
TPUT 0,3,3,&HE800+18

表示される画像(将棋の歩)を指定するコード 18 に加算されている &HE800 が、このバックグラウンド画面用のキャラクタ(画像タイル)のために使用される領域の、先頭アドレスであることがわかります。

プチコン3号のプログラムを簡易的に動かしたい場合、以下のような関数を追加しても良さそうですね。(アトリビュート値に対応していませんが)

プチコン4
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 という扱い易い数を維持することは、とても自然であることが理解できます。

今回のサンプル

さて今回、以下のようなサンプル・プログラムを作成してみました。
2019071322440000-B4374FDA41BFF09D976C1FEA83EFB230.jpg
実行すると、プチコン4で定義された 4,096 個のバックグラウンド画面用のキャラクタ(画像タイル)が表示され、左の上下ボタン で上下にスクロールします。左右だとより大きくスクロールします。
2019071322440900-B4374FDA41BFF09D976C1FEA83EFB230.jpg
最後までスクロールさせると、こんな感じ。
2019071322442800-B4374FDA41BFF09D976C1FEA83EFB230.jpg
横幅が足りなかったので、Xボタン で右半分といいますか、もう1セットのほうに切り替わります。
2019071322441600-B4374FDA41BFF09D976C1FEA83EFB230.jpg
終了は Bボタン です。

まあ全体像は標準の SmileTool2 でも見られますが、文字コードとあわせて探す場合に、ちょっとだけ実用的かもしれません。

補足 - キャラ番号について

と、ここまで書いて気がつきましたが、プチコン3号とはキャラ番号が異なっているものも多くありますね。ググったら以下がヒットしました。

確かに、今回作成したサンプルで言えば、Xボタンを押した後に表示される部分が、プチコン3号には無かった気がします。

この並びの違いを考慮すると、BGPUT の簡易互換関数は以下のような感じになりますかね?

プチコン4
DEF BGPUT P,X,Y,C
 TPUT P,X,Y,&HE800+C DIV 32*64+C MOD 32
END

というわけで

プチコン4 でいろいろ遊びつつ、プチコン3号からの変更点で、特に自分が戸惑った部分をまとめてみました。まとめることで自分の中でも整理でき、より理解が深まった気がします。

今後も何か気になる点がありましたら、こうやってまとめてみたいと思います。

ではでは!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1