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 画面表示させる方法が公開されていました。

今回の方法だと表示は一瞬です。

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 で他のプログラムへ渡すのも手段です。

表示画面を製作したい場合は次が使えるでしょう。

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

この方法を用いたプログラムを公開しています。


追記 2019/03/19

IchigoCake BASIC がベータ版で公開されましたが、
番地とプログラムの領域が大きくなる分、仮想アドレスの番地がずれるため、
このページで紹介している仮想ページのアドレスは IchigoCake では異なり、
プログラムの領域が異なるため、このままでは動作しません。
変更が必要となりますので、ご注意下さい。


IchigoJam Advent Calendar 2018