高度なテクニック

IchigoJam BASIC・IchigoCake BASIC 向けのより高度なテクニックをまとめています。


CHR$()

CHR$(0) が初期状態で埋まっている空白、CHR$(1) が ▉ になっています。

そのため、ビット処理した結果の 0・1 をそのまま CHR$() に入れる事で
空白と ▉ による線画を行う事ができます。
BASIC 0.9.4 からは CHR$() で , 区切りで複数の文字を出力できるようになりました。
? CHR$(0,1,2,3,4)

この方法を用いる事で、容量が少なくなり、線画も高速化しています。


文字列の入力

BASIC 1.2.0 より文字列に対応していますが、これに INPUT も対応しています。

つまり文字列の入力も対応しています。しかし、「頭に " を入れる」仕様になっています。

さすがにそれでは使いにくいので、キーバッファで " を入力させる事で、文字列の入力が扱いやすくできます。

CLS:POKE #1003,1,34:INPUT A、IchigoCake BASIC では CLS:POKE #1E03,1,34:INPUT A となります。

 

IchigoJam BASIC のテクニックあれこれ。| ふうせん🎈 FU-SEN

この情報を Facebook グループ IchigoJam-FAN に入れたら、早速福野さんも活用方法を公開していました。

 

コンパイラはじめのいっぽ、EVAL実現法とマシン語生成 / IchigoJamではじめるArmマシン語その13 | 福野泰介の一日一創

 

スクロールすると入力そた文字列を得る事ができません。CLS や空いているところへの LC が必須です。


擬似グラフィック

BASIC 0.9.8 より擬似グラフィックに対応しました。

キャラクターコード 128〜143(16進数表記で #80〜#8F )に1文字を2×2に分けたキャラクターが入っています。

これによって 横72×縦54、IchigoJam BASIC 0.9.9 からは 横64×縦48 の大きさで描く事ができます。
(BASIC 0.9.9 以降は MSX SCREEN 3 のブロック数に同じ。ただし2色しかない)

ただし縦座標一番下は PRINT で出力するとスクロールしてしまう場合がある点にご注意下さい。POKE ではスクロールしません。

 

128(#80) に下記の該当する部分を加えた値が CHR$() および POKE で表示するコードとなります。

また、左Alt+Shift+0〜F でも入力が可能です。

 


配置をまとめると下記になります。


 

CHR$() による線画では、1画面描ききれませんが、?(PRINT の短縮形)で直接 左Alt+Shift+0〜F の表示を行うと、

BASIC プログラムからでも1画面出力する事が可能です。

ただし、右下に出力するとスクロールしてしまうため、ここを空けるか、代わりに POKE を使用して下さい。

 

更に高度な手段として、#900〜#BFF の画面状態をそのまま EEPROM に入れておき
I2CR を用いて、EEPROM から直接画面出力する方法もあります。

1画面をそのまま保存する場合に必要なサイズは 768 バイトで、1プログラム(最新は 1024 バイト)の4分の3になります。

#900~#BFF のサイズはプログラム領域 #D00~#FFF で収まりますので、

COPY で画面状態をプログラム領域に入れて、256 バイト以下に簡単なプログラムと共に SAVE で保存する事もできます。

COPY で画面表示させ、他に処理が必要なら LRUN で他のプログラムを呼び出せば良いのです。

これは EEPROM を使用しなくても本体(IchigoJam BASIC RPi なら SD カード)へ保存できるメリットがあります。

 

なお、128(#80) のキャラクターコードは PanCake でバイナリーコマンドの開始コードに割り当てられているため、

PanCake を接続している場合に誤動作する恐れがあります。
これを留意するなら 128(#80) を 32(#20) や 0(#0) へ変更して下さい。

 

BASIC 1.3b09(正式版 1.4.0)より DRAW が採用されています。(1.3b08 のみ PSET で同じ機能)
これにより仮想グラhィックの点・線を描くのが容易になっています。


配列の拡張

BASIC 0.9.9-RC6 より [0] から [101] の 102 個が配列となっていますが、

もっと必要に思う場合があるでしょう。

 

配列・変数の領域 #800〜 を POKE・PEEK で使用する事で、
値は 0〜255 ですが、配列部分だけでも 202 個に倍増します。
変数は Z に近い部分を使う事で、更にこの数を増やす事ができます。

 

プログラムが短ければ、#FFF に近い領域も空いていますので、ここも使う事ができます。

 

BASIC 1.2.2・1.2.5 RPi 以降は VIDEO で拡大文字にすると

画面表示領域 #900〜#BFF の後方を使用しないため、ここも使用できます。 

 

値の範囲が短かければ、数は増やせます。0 と 1 でよければ1つの仮想番地に8つ入ります。

PanCake+BASIC 版 GIVE UP! はこの方法で仮想の画面状態を配列・変数の領域に保持しています。


シリアル信号の仕組み

IchigoJam BASIC では PRINT などで出力している内容をそのままシリアル信号の RXD で送出します。

また、TXD で受信したデータをキーボードで入力した状態と同じように扱います。これは INPUT や INKEY() も含みます。


TXD・RXD は PC 接続 で接続するだけではなく、IchigoJam 同士をつないだりもできます。
TXD がデータ送信、RXD がデータ受信です。

IchigoJam 同士を接続してプログラムの転送を行う場合は、
そのままだと受信側が処理しきれないため、BPS 300 位まで通信速度を落として下さい。

 

マルチメディアボード PanCake は、この仕組みを利用し、PRINT で出力させたデータでグラフィックを描きます。

MixJuice も同じ仕組みでインターネット通信を実現します。

 

IchigoJam BASIC 0.9.4 からは LOCATE 0,-1 として、画面出力を行わず、シリアル信号の送信のみにする事ができます。

IchigoJam BASIC 1.1.0 からは LOCATE・CLS・SCROLL などをコード化して送出を行います。UART コマンドで無効化可能です。 


LED を出力ポート、BTN を入力ポートの代わりに使用する

LED にもソケットがあり、出力ポートの一つとして使用する事ができます。
LED 1・LED 0 がそのままオン・オフです。OUT の代わりになります。

 

また BTN もソケットがあり、入力ポートの一つとして使用する事ができます。

BTN() の状態でオン・オフを判断する事ができ、IN の代わりになります。

 

逆にいうと、OUT に LED を付ける事ができ、IN にボタンを付ける事ができます。

IN 4つを上下左右、更に BTN でゲームパッドには使えそうですね。

SkyBerryJAM では LED 以外に OUT1~4 連動のランプ、BTN 以外に IN1・IN4 のボタンが付いています。

KumaJam では BTN 以外に IN1 のボタンが付いています。

 

BASIC 1.1.0 から IN・OUT で BTN・LED の対応も可能になっています。


電源を入れた時に自動でプログラムを実行させる

IchigoJam に付いているボタンを押しながら電源を入れる事で、

プログラム番号 0 番のプログラムを実行する仕様になっています。(LRUN 0)

これは 0.7 から対応しているため、多くの IchigoJam で使用可能です。

 

これを生かし、GND 端子と BTN 端子をジャンパワイヤなどで接続した状態にしておくと

いつも自動起動する事が可能です。

 

EEPROM のプログラムはプログラム番号 0 から LRUN する事で起動して下さい。

 

BASIC 1.3.2b19(正式版 1.4.0)より、

プログラム番号 0 の先頭行に @ARUN を入れる事で、自動起動するようになりました。

 

IchigoJam BASIC RPi はキーボードを外した状態で電源を入れるとプログラム番号 0 番を実行します。


シリアル信号で制御する

シリアルで何か IC などの接続を行い制御を行う場合、次のコマンドを実行して下さい。

  • BPS - 通信速度の設定(初期設定 0=115200bps)
  • UART - シリアル信号の設定(1.1.0 以降。初期設定 2=LOCATE や SCROLL などのコントロールコードも送出する)

8 ビット・ノンパリティ・ストップビット 1 ビット・フロー制御なし となります。

IchigoJam BASIC 1.1.0 以降では特に UART 1 または UART 3 としないと正常に送出できない事にご注意下さい。
VER() を用いて、下記を行うのが便利です。

IF VER()>11000 UART 1

通常の改行コードは CHR$(10)=LF を送りますので、CHR$(13) 付加させる必要があります。


ビデオ出力を非表示にして処理を高速にする

LPC1114 を用いた IchigoJam BASIC はビデオ出力信号も生成しています。

そのため、VIDEO 0 にして非表示にすると、ビデオ出力信号の生成を行わない分処理が高速化します。

VIDEO 1 にして表示状態に戻す事を忘れないで下さい。F8 キーに割り当てられています。

 

IchigoJam BASIC RPi や IchigoJam web などは影響ありません。


プログラム領域にデータを入れる

POKE では仮想メモリの特定アドレスに任意の値を入れられます。

プログラム領域は #C00~#FFF が使われています。先頭 #C00 から使用されますが、後方は空きます。

この領域を POKE で任意の値を入れます。

 

これは他の領域を使用する事もできるのですが、プログラム領域に入れると一つメリットがあります。

SAVE を行った場合、#C00~#FFF の中身はそのまま丸ごと保存されます。

そのため、POKE で任意の値を入れた内容もそのまま SAVE で保存する事ができます。

もちろん LOAD でその値を読み出す事ができます。

 

変数の値をプログラム領域に入れて SAVE する簡単な例は次で紹介しています。

 

IchigoJam BASIC のテクニックあれこれ。| ふうせん🎈 FU-SEN

 

プログラム一覧・ローダー は #FFE にプログラム番号を一時保存します。
その後 CLV などを実行するため、変数は初期化されますが、
#FFE に保存されたプログラム番号は残っているので、 PEEK で取り出す事が可能です。

 

画面領域よりプログラム領域の方が大きいので、画面の状態をまるごと保存する事もできます。

 

IchigoJam BASIC で画面キャプチャ。| ふうせん🎈 FU-SEN

 

IchigoJam 5 周年令和NYAN CAT でこの方法を使用し、全画面表示を実現しています。


拡大文字で空き領域に画面を保存する

仮想メモリ #900~#BFF には画面上の位置に応じたキャラクターが入っています。

これを POKE で書き換える事で、画面上の表示を変更でき、PEEK でキャラクターを得る事もできます。

 

VIDEO 3~8 では文字が大きくなりますが、この場合、使用される領域は少なくなり、後方の領域は使われません。

使用される領域は次のとおりです。

  • VIDEO 3・4・IchigoJam BIG: #900〜#9BF
  • VIDEO 5・6: #900〜#92F
  • VIDEO 7・8: #900〜#90B
  • SWITCH による液晶表示: #800~#97F

VIDEO 3・4であれば #990~#BFF は使われません。
そこで、画面を生成した状態で COPY コマンドを用いて使用していない領域へ画面情報をコピーしてしまい、

それを再度 COPY で #900 以降に戻す事で、素早く画面を切り替える事ができます。

 

BASIC/プログラム/New 迷路

 

New 迷路では VIDEO 1 で迷路を生成し、VIDEO 5 で拡大表示しています。

VIDEO 5 を実行してクリアされるのは #92F までで、#930~#BFF は残ります。

迷路生成時に上が空いているのはこの領域を VIDEO 5 で使用しているためです。

VIDEO 3 をメイン画面にして、空き領域にデータを入れている他の人公開のプログラムが存在します。

 

地底探検 | SHIROのIchigoJam日記

Rough Drivin' | Kidspod;

 

なお、キャラクター領域に続く #C00 以降はプログラム領域ですので、

ここを POKE で書き込むとプログラムが破壊されます。ご注意下さい。


IchigoJam BASIC と IchigoCake BASIC を判別する方法

仮想メモリ領域で #C00 は次の値になっています。

  • IchigoJam BASIC - プログラム領域の先頭、先頭の行番号が入る(10・100 など)
  • IchigoCake BASIC - 配列 [102] の値が入る(CLV をした直後は 0) 

従って、プログラムで CLV を実行した後、

PEEK(#C00) が 0 でなければ IchigoJam BASIC、0 なら IchigoCake BASIC と判別できます。

 

仮想メモリの違う BASIC で実行して大きな問題が発生する場合(例えば IC2W で EEPROM を書き込む場合)は

この仕組みを入れておく事をおすすめします。

 

なお、IchigoCake BASIC 専用プログラムで、IchigoJam BASIC ではエラーとしたい場合、

[102]=0:'Only IchigoCake BASIC! という行を頭に入れておくだけです。
(エラーの場合はその行が表示されるので、コメント文が表示されます)