IchigoJam BASIC で画面キャプチャ。
IchigoJam Advent Calendar 2018 - Day 4
ぜひ使ってほしい IchigoJam BASIC の新テクニックをご紹介したいと思いまして。
IchigoJam BASIC 1.2.0 以降で使用できます。
試してみましょう
まずは何でも良いのである程度画面を埋めておきます。
そうしたら次のコマンドを実行して……
COPY #D00,#900,768
空いてるところに保存します。
SAVE [プログラムNo.]
F1 キーで一度画面をきれいにします。
もちろん
CLS
でも OK です。
念の為プログラムもからっぽにしておきます。
NEW
では保存したプログラムを読み出して……
LOAD [プログラムNo.]
次のコマンドを入れましょう。
COPY #900,#D00,768
すると……
あら不思議。SAVE の前に COPY した段階の画面が表示されました!
仕組み
この仕組みを理解するには、
IchigoJam BASIC の仮想メモリを知る必要があります。
最新の IchigoJam BASIC では次のようになっています。
アドレス | 内容 |
---|---|
#000~#7FF | キャラクターパターン |
#800~#8CB | 配列 |
#8CC~#8FF | 変数 |
#900~#BFF | 画面のキャラクター |
#C00~#1001 | プログラム |
#1002 | キー状態 |
#1003~ | キー・受信バッファ |
そのうち、先程の COPY で使用しているのは
- #900~#BFF 画面のキャラクター
- #C00~#1001 プログラム
の領域です。
画面のキャラクター
#900 には LC 0,0 のキャラクター、#901 は LC 1,0 のキャラクター……とつづき、
#BFF LC 31,23 まで収納されています。(VIDEO 1・2 の場合)
プログラム
#C00 を先頭にプログラムが入ります。
NEW をした時 #C00 から #FFF は 0(#00)で埋まっています。
(#1000・#1001 も 0 ですが、ここは変化しない固定の値です)
ここで 1 行プログラムを入れてみてから #C00 を調べると、値が変わっています。
COPY
IchigoJam BASIC 1.2.0 より追加された命令です。
COPY [テンソウサキ],[テンソウモト],[テンソウスウ]
最初に実行したのは
COPY #D00,#900,768
でしたね。#900 から 768 文字分を #D00 以降へ転送しています。
768 は 32×24=768 でちょうど 1 画面のサイズです。
#900~#BFF の画面状態を #D00~#FFF のプログラム領域へ保存しています。
COPY #900,#D00,768
#900 と #D00 を逆にすれば、動作も逆になりますね。
プログラム領域から画面の状態を戻します。これで表示されます。
ここでのポイントはプログラム領域のうち #C00~#CFF を使用していない事。
この範囲 256 バイト分はプログラムを入れられます。
最初の COPY 前にはプログラムも入れていました。
ちゃんと実行できます。
プログラム内で COPY #900,#D00,768 とすれば画面表示が可能ですが、
もう少し空きがあるので、面白い表示方法ができそうですね。
SAVE・LOAD(LRUN)の特性
IchigoJam BASIC では SAVE する時、
#C00~#FFF のプログラム領域をそのまま保存します。
#D00~#FFF に転送した画面の状態を入れました。これも SAVE で保存できるんです。
LOAD(LRUN)は SAVE の逆、#C00~#FFF へ入ります。
これで何ができるのか?
COPY #D00,#900,768
SAVE [プログラムNo.]
COPY で画面表示を丸ごとプログラム領域に入れ、SAVE で保存ができます。
LOAD [プログラムNo.]
COPY #900,#D00,768
そして LOAD(LRUN)後 COPY をして一気に表示させる事ができるんです。
残った領域は本来のプログラムを入れる事ができます。
おそらくプログラムの中で COPY で画面表示する事になるでしょう。
ここでは COPY を 1 画面分にしていますが、部分的にも使用できます。
従来 PRINT・POKE を用いて 1 画面表示させる方法が公開されていました。
IchigoJamで疑似グラフィックを使った画像の表示 | 猫にコ・ン・バ・ン・ワ
今回の方法だと表示は一瞬です。
EEPROM に保存して I2CR で読み出す方法も公開していました。
今回の方法であれば IchigoJam 本体や IchigoJam BASIC RPi の SD カードにも保存できます。
また、こんなメリットもあります。
NEW
10 LET [0],0,1,2,3,4,5
だと ?FREE() は 1000 になるので 1024-1000=24 バイト使っていますが、
POKE #FF0,0,1,2,3,4,5
であれば #FF0~#FF5 の 6 バイトしか使っていません。
プログラム領域の節約にもなります。
使用上の注意・補足
1 画面まるまる保存であれば、1024-768=256 バイトしかプログラムで使用できません。
?FREE() で 768 以上である必要があります。
これを超えるとプログラムによって画面データを破損します。
画面表示のみを 1 プログラムにして、LRUN で他のプログラムへ渡すのも手段です。
表示画面を製作したい場合は次が使えるでしょう。
- IchigoJam キャラクタエディタ ver 1.2 | IchigoJamを楽しもう
- Web 上で製作。POKE のアドレス #900 からを全画面であれば #D00 からに変更します - Tamakichi/IchigoBmpConv | Github
IchigoJam用画像コンバータを少々改良 | 猫にコ・ン・バ・ン・ワ
- 画像から変換。テキスト出力 で 16 進データを出力し、POKE アドレス, を加えます
LPC1114 で動作する IchigoJam BASIC の場合 SAVE・LOAD・LRUN は一瞬画面が乱れます。
Ichigojam BASIC RPi や IchigoJam ap などは乱れません。
直接 POKE を入れる領域は、できるだけ後ろの #FFF に近い領域を使用して下さい。
ソース公開する場合は POKE をダイレクトモード(行番号なし)で記載する事で
プログラム本体と一緒にして公開できます。
POKE #FF0,0,1,2,3,4
10 CLS
20 COPY #900,#FF0,5
30 LC 0,1
追記 2019/01/11
この方法を用いたプログラムを公開しています。
🎈 IchigoJam 5 周年 | イチゴジャム レシピ/BASIC/プログラム
追記 2019/03/19
IchigoCake BASIC がベータ版で公開されましたが、
番地とプログラムの領域が大きくなる分、仮想アドレスの番地がずれるため、
このページで紹介している仮想ページのアドレスは IchigoCake では異なり、
プログラムの領域が異なるため、このままでは動作しません。
変更が必要となりますので、ご注意下さい。
IchigoJam Advent Calendar 2018
IchigoJam Advent Calendar 2018 | Qiita