IchigoJam BASIC・IchigoCake BASIC 向けのより高度なテクニックをまとめています。
CHR$(0) が初期状態で埋まっている空白、CHR$(1) が ▉ になっています。
? 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 にもソケットがあり、出力ポートの一つとして使用する事ができます。
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 などの接続を行い制御を行う場合、次のコマンドを実行して下さい。
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であれば #990~#BFF は使われません。
そこで、画面を生成した状態で COPY コマンドを用いて使用していない領域へ画面情報をコピーしてしまい、
それを再度 COPY で #900 以降に戻す事で、素早く画面を切り替える事ができます。
New 迷路では VIDEO 1 で迷路を生成し、VIDEO 5 で拡大表示しています。
VIDEO 5 を実行してクリアされるのは #92F までで、#930~#BFF は残ります。
迷路生成時に上が空いているのはこの領域を VIDEO 5 で使用しているためです。
VIDEO 3 をメイン画面にして、空き領域にデータを入れている他の人公開のプログラムが存在します。
なお、キャラクター領域に続く #C00 以降はプログラム領域ですので、
ここを POKE で書き込むとプログラムが破壊されます。ご注意下さい。
仮想メモリ領域で #C00 は次の値になっています。
従って、プログラムで CLV を実行した後、
PEEK(#C00) が 0 でなければ IchigoJam BASIC、0 なら IchigoCake BASIC と判別できます。
仮想メモリの違う BASIC で実行して大きな問題が発生する場合(例えば IC2W で EEPROM を書き込む場合)は
この仕組みを入れておく事をおすすめします。
なお、IchigoCake BASIC 専用プログラムで、IchigoJam BASIC ではエラーとしたい場合、
[102]=0:'Only IchigoCake BASIC! という行を頭に入れておくだけです。
(エラーの場合はその行が表示されるので、コメント文が表示されます)
SkyBerryJAM は 栃木県立栃木工業高等学校 が管理する登録商標であり、
SkyBerryJAM は 栃木県立栃木工業高等学校 の商標です。
Raspberry Pi は
Raspberry Pi 財団 の登録商標です。
Raspberry Pi is a registered trademark or
trademark of
the Raspberry Pi Foundation.
"RISC-V" の商品名は RISC-Vインターナショナル が管理する登録商標です。
The “RISC-V” trade name is a registered trade mark of
RISC-V International.