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

[プチコン4 SmileBASIC](https://www.petc4.smilebasic.com/) でいろいろ遊んでいますが、プチコン3号から [バックグラウンド画面(BG)](http://petitcom.net/category/screens/background) 周りの変更が大きい気がします。過去のサンプルもこれが原因で動いていないものが多そう。

# 今回の範囲

バックグラウンド画面用のキャラクタ(画像タイル)の話で、今回は 16bit 用の以下の部分が主な対象です。
![2019071402311800-B4374FDA41BFF09D976C1FEA83EFB230.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/5c150516-72f9-7019-cb1c-da52b2616d3d.jpeg)

# どう変わった？

ざっくり言えば、[テキスト表示周り](https://sup4.smilebasic.com/doku.php?id=reference:%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E5%85%A5%E5%87%BA%E5%8A%9B) が拡張され、バックグラウンド画面(BG)機能を取り込んだ、ですかね。従来の BG* 系の命令が、T* 系に統合され、廃止されています。

例えばプチコン3号のサンプルで、[マニュアル](http://petitcom.net/manual/bgput) にある以下の例は

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

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

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

## より詳細な説明

プチコン3号では、BGキャラクター番号として 0～4095 が指定できました。つまりは 4096個のバックグラウンド画面用のキャラクタ(画像タイル)が利用できたわけです。

※ あくまで文法的には。実際に定義され利用できるのは 0～1023 だった気が

プチコン4でもこの仕様は変更されていません。やはり4096個のバックグラウンド画面用のキャラクタ(画像タイル)が利用できます。ただし、それがテキスト表示用の文字(漢字も含む)フォントと同じ扱いになりました。

いまコンピューターの世界で、最も使われている文字コードは [Unicode](https://ja.wikipedia.org/wiki/Unicode) です。UTF-8 とか UTF-16 だとかいうのも、Unicode の仲間(フォーマットのバリエーション)です。1文字を16bitで表現するコードです。

※ 厳密に言えば16bitで表現するのは Unicode の一部で、これを [基本多言語面、Basic Multilingual Plane、BMP](https://ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2) と呼びますが、説明が長くなるので、今回は Unicode = BMP のみの前提で話を進めます

プチコン4 も Unicode を採用しています。

Unicode には全世界で決まった文字が定義されていますが、例外的に、自由に使ってよい領域があります。外字エリア、私用領域、などと呼びます。これが **E000 ～ F8FF** の間の 6,400 文字です。プチコン4では、この私用領域を使ってバックグラウンド画面用のキャラクタ(画像タイル)を管理しています。

Unicode の私用領域のうち、**E000 ～ E7FF** の間の 2,047 文字は、プチコン4 のシステムで利用しているようです。こんな感じで、プチコン3号時代からある独自文字の実装に使用されている模様。

![2019071410510400-B4374FDA41BFF09D976C1FEA83EFB230.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/38bded99-16d9-40c2-b455-c3ec67338f08.jpeg)

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

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

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

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

```vb:プチコン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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/e2e63bfc-f935-5ce2-d629-7a5c6c898489.jpeg)
実行すると、プチコン4で定義された 4,096 個のバックグラウンド画面用のキャラクタ(画像タイル)が表示され、`左の上下ボタン` で上下にスクロールします。左右だとより大きくスクロールします。
![2019071322440900-B4374FDA41BFF09D976C1FEA83EFB230.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/8563c49b-0b75-42ec-3ab8-8b83c42cd1cc.jpeg)
最後までスクロールさせると、こんな感じ。
![2019071322442800-B4374FDA41BFF09D976C1FEA83EFB230.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/eef35c94-47fd-e91f-7475-915ede919dcf.jpeg)
横幅が足りなかったので、`Xボタン` で右半分といいますか、もう1セットのほうに切り替わります。
![2019071322441600-B4374FDA41BFF09D976C1FEA83EFB230.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/c47e988a-ac62-75e7-3be2-4cf9fac4f48f.jpeg)
終了は `Bボタン` です。

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

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

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

* [テキストスクリーンに CHR$(3号のBGチップ番号+&H8E00) を表示させても、3号と同じ絵が出てこないです](http://wiki.hosiken.jp/petc4/?FAQ#qdd0d575)

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

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

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

# というわけで

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

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

ではでは！