Facebook グループ IchigoJam-FAN が数日盛り上がりました。
大きな空容量が生まれて新機能の実装が可能になったため、
アンケートが実施されました。
その際、実はできるのだけど、
知られていない内容がいくつか項目で出てきていました。
ここではあまり知られていない
IchigoJam BASIC のテクニックをまとめておきます。

採用された新機能

まずはサラッと IchigoJam BASIC 1.3b08~1.3.2b11 で一度追加されている
新機能に触れておきます。後に変更・削除の可能性がある事にご注意下さい。
※ この記事公開後に公開されている 1.3.2b12 以降は下に追加で随時入れています。

Facebook グループ IchigoJam-FAN でのアンケートがこちら。

https://www.facebook.com/groups/ichigojam/permalink/1432456136894135/

1.3b08 - POS・SIN・COS・DRAW

  • カーソル位置取得 → POS
  • 三角関数 → SIN・COS
  • PSET → DRAW(1.3b08 のみ PSET)
  • LINE命令(キャラクタ座標で構わない)→ DRAW(1.3b08 のみ PSET)

カーソル位置を得る方法が今までなかったのです。POS が採用。
仮想メモリに合わせた左上からの位置、
VIDEO・SWITCH で画面サイズが異なるので、これも得られるようになっています。

DRAW は仮想グラフィック #80~#8F を用いた機能。
テキスト文字が出ているのに線画が可能になり、高度なポケコン BASIC のようです。

これを使った GIVE UP! 2 を先日公開しています。

SIN・COS が採用されたらバイオリズムを作ってよ~とコメントしたら、
SHIRO さんが早速作ってくれました。

https://www.facebook.com/groups/ichigojam/permalink/1434221540050928/

円の線画も少しは容易に可能となっています。

10 'CIRCLE
20 CLS
30 FOR D=0 TO 360 STEP 2
40 X=SIN(D)*23/256+32
50 Y=COS(D)*23/256+24
60 DRAW X,Y
70 NEXT

円

サインカーブも簡単です。

10 'Sine Curve
20 CLS
30 FOR X=0 TO 63 STEP 2
40 DRAW X,24
50 NEXT
60 I=0
70 J=24
80 FOR X=1 TO 63
90 Y=SIN(X*360/63)
100 Y=-Y*23/256+24
110 DRAW I,J,X,Y
120 I=X
130 J=Y
140 NEXT

サインカーブ

丸を描く方法を用いて 1 分タイマー 風船 を公開。
PanCake+BASIC 版で公開していたのが、BASIC のみで可能になりました。

1.3b09 - WS.LED

  • LEDテープ(WS28128)→WS.LED(1.3b10 まで WS.OUT)

フルカラー対応の LED WS28128 を制御する機能です。
配列 [0] 以降に 0・1 を入れて、WS.LED 個数 とするだけ。
記事では 1.3b10 で WS.LED に変更とあるのですが、
WS.OUT のままになっているのでご注意下さい。1.3b11 で WS.LED に変わりました。

1.3b10 - IoT.OUT

  • IOT.OUT #700,16 でバイト列送信→IoT.OUT 機能追加

アンケートでは票が少ないですが、
IchigoSoda 利用者から要望が多かったのがこれだそうです。
文字列送信が可能になったので、活用方法も広がっています。

1.3.2b11 - UART・IoT.IN

  • UART(表示せずにシリアル送受)→UART 値追加

この記事を公開すると共に福野さんも 1.3.2b11 を公開していたので、
この部分は追記しています。
なお、このバージョンから 1.3「.2」b11 と .2 部分が復活しました。
UART に 8 を加える事によって、PRINT は画面出力せずにシリアルのみへ送信を追加。

この項目を入れていたのは自分でした。投稿時で 6 番目の投票数でした。
IchigoJam BASIC ではできずにいたターミナル(ichigoLatte で公開していました)、
これで実現できるかもしれません。

また、IoT.IN の最大 8 バイト受信も対応しています。

実はこれも更新 - LANG→VER

  • 種類別(RPi・Cake など)の値→LANG 廃止・VER 統合

福野泰介の一日一創 では 命令削除:LANG とだけ記載されていました。
実は LANG が VER(3) に変わっています。
VER(0) は VER() と同じで、VER(1)・(2) も予定があるのですが、
1.3b10 までは 0 のままになっています。数値を決めて入る事になるでしょうか。
VER()=13207 でも IchigoJam BASIC で IchigoCake BASIC や DakeJacket 版では
異なる動作になってしまっていたのです。VER()>=13207 とする意味がなくなってしまいます。
なので、Jam・Cake・DJ などが分かる番号も用意しては?という提案でした。


※ 1.3.2b12 以降は下に追加で入れています。

1.3b10 の段階で空き容量がなくなってしまったので、機能追加が一度止まりましたが、
最適化されて、小さく入れられそうな機能は追加される可能性があります。
実際 1.3b11 がそんなに間を置かずに更新されました。今後もこんな感じでしょう。
いずれの機能も影響が大きいので、
コマンド名は変わっても、そのまま採用されそうな気がするのですが……

イチゴジャム レシピ のメニューにある IchigoJam BASIC コマンド一覧、
しっかりとベータ版の新情報を反映しています。
MixJuice コンテンツ も適度に更新しています。


では、ここからが本題。アンケートで出ていた項目とその実現方法です。


MID$(文字列の一部分を読み出す)

LEFT$・MID$・RIGHT$ が多くの BASIC で採用されていましたが、
容量が小さいポケコンの BASIC は MID$ しか入っていませんでした。
MID$ だけあれば LEFT$・RIGHT$ 相当は容易です。

STR$ を用いて MID$ の代用が可能になっています。こんな感じです。

10 S="IchigoJam BASIC"
20 ? STR$(S)
30 ? STR$(S+6)
40 ? STR$(S,9)
50 ? STR$(S+6,3)
RUN
IchigoJam BASIC
Jam BASIC
IchigoJam
Jam

文字列の入力

INPUT A$ の代わり。実は文字列追加と共に実装済で、
入力の時に頭 “ で文字列の先頭アドレスが変数に入って、
文字列の命令をある替える仕様になっているのですが、
(IchigoJam BASIC では、行末が改行の場合、文字列の末尾 “ を省略できます)
「” を入れる」という仕様が使われにくいところ。
そこでキーバッファに “ を入れて INPUT するのはどうでしょう?という提案。

10 CLS:CLV:A=#1003
20 IF PEEK(#C00)=0 A=#1E03 
30 POKE A,1,34
40 INPUT S
50 PRINT STR$(S)

IchigoJam BASIC の場合 #1003 がキーバッファの文字数、
#1004 からがキーバッファ本体です。
#1003 で 1 文字、#1004 で “ のキャラクターコード 34 を入れると、
INPUT の段階で “ が自動入力される、という仕組みです。

IchigoCake BASIC は #1E03 からなので、10~20 の記載にしてあります。
#C00 は IchigoJam BASIC はプログラムの頭でこのプログラムでは 10 になるのですが、
IchigoCake BASIC では配列 [102] の値で、CLV をしている直後なので 0 になります。


行の複製

これは多くの場合、他の BASIC でも可能な方法で、
行番号を変えるだけで複製できます。元の行は削除されません。
(行番号が変更される BASIC もあります)

10 'IchigoJam

ここで 10 へカーソルを移動し、20 に変更して Enter すると……

10 'IchigoJam
20 'IchigoJam

複製されます。簡単に行の複製ができます。


特定の変数に入っている値を IchigoJam や EEPROM へ保存

IchigoJam BASIC の場合、SAVE は #C00~#FFF の中身を丸ごと保存する、という仕様です。
なので、プログラム領域に値を保存して SAVE してしまう事ができます。
なるべく後ろのアドレスを使います。
#FFF が末尾ですが、古いバージョンではエラーになる場合があるので、#FFE が確実です。

IchigoCake BASIC は #E00~#1DFF なので、#1DFF が末尾となる事にご注意下さい。
短いプログラムであれば共通で使用できます。

POKE #FF0,0

10 P=PEEK(#FF0)
20 P=P+1
30 PRINT P
40 POKE #FF0,P
50 SAVE

一度これをどこかの番号に SAVE した後に RUN します。EEPROM に限らず本体も使用できます。
SAVE するので、一瞬画面が変化して正常です。
何度か数字が進んだのを確認してから、電源を切って入れ直して LRUN してみて下さい。
それでも正常に動作します。

2 バイト保存

上項目に続けます。POKE で入れている場合は 1 バイトなので、値は 0~255 に限られます。
通常変数や配列は 2 バイトです。ならば 2 バイト転送すれば良いわけですよね。

POKE #FF0,0
POKE #FF1,0

10 COPY #800,#FF0,2
20 [0]=[0]+1
30 PRINT [0]
40 COPY #FF0,#800 2
50 SAVE

#900~#901 が [0] が入っているアドレスです。これを #FF0~#FF1 に保存します。
ただし、COPY は IchigoJam BASIC 1.2 以降の命令なので、

POKE #FF0,0
POKE #FF1,0

10 POKE #800,PEEK(#FF0)
15 POKE #801,PEEK(#FF1)
20 [0]=[0]+1
30 PRINT [0]
40 POKE #FF0,PEEK(#800)
45 POKE #FF1,PEEK(#801)
50 SAVE

とすると古いバージョンでも使用できます。仮想メモリの変数・配列は……

配列・変数 アドレス
配列 [0] #800~#801
配列 [1] #802~#803
配列 [2] #804~#805
: :
変数 X #8FA~#8FB
変数 Y #8FC~#8FD
変数 Z #8FE~#8FF

となっているので、配列 [0] や 変数 Z を保存用に使うと扱いやすいですね。

画面を保存

まだ同じ情報が続きます。1 画面の情報よりプログラム領域の方が大きいので、
画面の状態をプログラム領域に保存し、SAVE してしまう事ができます。
これについては過去このブログで紹介しました。
これだけで 1 プログラムを占領しますが、続きで何かをするなら LRUN すれば良いのです。

COPY が高速で、一瞬で画面を変化させます。この機能で多彩な事ができます。
ちょうど先日 COPY を使ったこんな物ができました。


他の解決方法

IchigoJam BASIC のファームウェアレベルでは難しいけど、
ハードや周辺機器パーツで解決できる手段です。

キーボードの種類を増やしてほしい

PS/2-USB 逆変換アダプタ が存在します。PCN などで発売されています。
ただし価格が高く、対応キーボードを探して購入した方が安くなりそう……

VIDEO 拡大表示でぶれずに表示

IchigoJam web を使うのが一つの回避手段です。

HDMI 出力・USB キーボード対応・VIDEO 拡大表示でぶれずに表示

Raspberry Pi で動作する IchigoJam BASIC RPi が使用できます。
Raspberry Pi Zero W・WH も使えます。IchigoJam と変わらない価格なので、
Ichigojam BASIC RPi 向けに 1 台持っていると良いかもしれません。

プログラム容量を増やしたい

2019年4月より商品販売されている IchigoCake BASIC が 4k バイトになっています。
ただし IchigoJam BASIC で使っていた EEPROM を IchigoCake BASIC で参照すると
問題が発生してしまいます。EEPROM もプログラム容量が異なっているためです。
これは解決手段を検討しているようです。

そうそう、LRUN プログラム番号[,行番号] がプログラムで実行できるのもお忘れなく。
でもこれを今回も要望している人はマシン語を使いたい人のようですね。


そうそう、新機能を使うためにはファームウェアの更新が必要です。
イチゴジャム レシピ の該当ページをリンクしておきます。


周辺機器/パソコンと接続/ファームウェアの更新 | イチゴジャム レシピ
ここでは LPC1114 のファームウェア更新についてまとめています。 採用されている LPC1114 は更新に失敗する事でファームウェアが失われ、起動できなくなるケースはまれです。 起動できない場合は別の問題である場合があります。 運営者は数年ファームウェアの更新を経験していますが、LPC1114 が完全に使えなくなった事はありません。 一方でオプションの選択により、LPC1114 に入っていたプログラムは消去される場合があります。 プログラムを残す必要がある場合は、予めパソコンへプログラムを転送しておくか、EEPROM へ保存して下さい。 EEPROM は接続していた場合でもこの方法で中身が削除される心配はありません。
 

え? USB-シリアルモジュール を持っていない?
ショップのふうせん からどうぞ。
IchigoDake も更新できるよう フッククリップ などを用意しています。


追加 2019/05/21

ターミナルは入力した文字を画面に表示せずにシリアル送出し、
シリアルから受け取った文字を画面表示させる、という仕様になっています。
UART の拡張で画面表示は完璧な状況なのですが、
IchigoJam BASIC では入力した文字とシリアルから受信する文字を
同じバッファ(#1003~・IchigoCake BASIC は #1E03~)へ入れてしまうため、
混在してしまう問題があります。現状での実現はまだ難しそうです。


追加 2019/05/26

1.3.2b12 が公開されています。

1.3.2b12 - SWITCH・マシン語 API

  • 液晶コントラストパラメータ→SWITCH に値を追加
  • 機械語からBASICコマンドの読み出し(特にRND関数) → API を実装
  • マシン語から呼べるBIOS CallのTableとか。よく使いそうなものだけでも。 → API を実装

実は 1.3.2b11 で API の実装をはじめていました。
(公開から日数を置いて福野さんが公開しています)
1.3.2b12 で仕様が変わっています。BIOS コールみたいな感じにまとまり、理想的ですね。

最適化されて、空き容量が増えています。
まだ最適化して空けられそうとの事で、今後も機能追加がありそうです。


追加 2019/05/30

1.3.2b13 が公開されています。

1.3.2b13 - キーボード配列変更

  • キーボード配置JP/US切り替え→API で対応

これにより、使用していたキーボードとファームウェアが一致していない場合でも
プログラムを実行してキーボード配列を変更できるようになりました。
よくキーボードを切り替えるようであれば、IchigoJam 本体、
教室やイベントでのトラブル対策であれば EEPROM にプログラムを入れておくのが理想でしょう。

1.3b12 と 1.3b13 の変化

この仕掛けが IchigoJam BASIC ファームウェア本体の内部変化です。
配布されている .bin ファイル を バイナリーエディタ Bz で参照してみました。
左が 1.3b12、右が 1.313 で、共に 0x5800 番地前後です。

青背景に変化している部分が仮想メモリ #000~#7FF に該当する
キャラクターデータがそのまま入っているところです。
1.3b12 まではキャラクターデータの後ろにもデータが入っていて、
バージョンによって物理的な場所が固定されていませんでした。
それを 1.3b13 では末尾の 0x5800 番地から 0x5FFF 番地に固定、
その前 0x5700 番地から 0x57FF 番地をキーボード配列情報にしてあります。

この物理番地の後ろ部分が IchigoJam BASIC を実行して変更可能な場所です。
1.3b12 まではこの辺がキャラクターデータ部分の終わり部分になり、
先頭部分から途中までは変更できない位置にありました。
そのため、書き換え可能なキャラクター(PCG)は #E0~#FF の 32 文字に制限してありました。


追加 2019/05/31

1.3.2b13 - フォント変更

福野さんが話題にしてくれました。

  • キャラクター編集可能(PCG)範囲(#E0~#FF)追加→API で対応、注意事項あり

これの注意ですが、キーボード同様に元のデータを書き換えてしまいます。
なので、CLP や電源を入れ直しても戻りません。元に戻すプログラムを実行する必要があります。
福野さん公開のプログラムでは #E0~#FF の範囲で制限してあります。
英数部分を書き換えてしまった場合、最悪ビデオ画面での操作が困難で、
シリアルからプログラムを実行するか、ファームウェアを入れ直す事になります。
これはキーボード配列部分も変更した場合でも同様です。

この方法ができるようになった事で、現在ベータ版はカナ版のみ配布されているのですが、
モンゴル版やベトナム版のフォントで使いたい場合、
プログラムで切り替えして実行できるようになりました。

実際にモンゴル版・ベトナム版・カナ版へ変更するプログラムを作ってみました。
従来は別のファームウェアで確認する必要があったのですが、
このプログラムを EEPROM へ保存して LRUN で実行するだけでフォントを切り替えできます。

ちなみに仮想メモリとしての配置は変わっていないので、
POKE で書き換え可能な範囲 #E0~#FF は変わらないようです。


追加 2019/06/01

1.3.2b12 でのマシン語 API 公開と共に C 言語開発環境も公開されています。

フォント変更でこの c4ij などの C 言語環境を整えました。
せっかくなので、この c4ij を用いて、風船 を C 言語で作ってみました。

Kidspod ID=855: http://kidspod.club/program/default.html?id=855

std15.h のおかげもあり、BASIC とほとんど変わらないソースになっていますね。
IchigoLatte JavaScript 版・Ruby 版・FORTH 版 と見比べて見るのも良いです。
C 原語版特有のところとして、コンパイルしてマシン語に変換されるので、
この場合 Esc キーによるプログラム中断ができません。
そのため、プログラムを止められるように inkey() を調べてループを抜けるように
記載を加えてあります。

コンパイルして IchigoJam BASIC で実行できるようにしたのがこちら。

Kidspod; ID=854 http://kidspod.club/program/default.html?id=854

POKE と USR しかありません。完全なマシン語動作です。


追加 2019/06/04

1.3.2b14 が公開されています。

1.3.2b14 - EEPROM SAVE 時の VERIFY

  • EEPROM SAVE時のVERIFY → SAVE 時に確認動作を追加

SAVE したのにプログラムが保存されていなかった! ありますあります。
その対応がされました。


追加 2019/06/12

1.3.2b17 が公開されています。

1.3.2b17 - PLAY 音痴修正・VIDEO ブレ修正・BTN 一斉取得

  • 音痴修正 → PLAY 調整。O5~O6 は VIDEO 0 推奨
  • ブレないVIDEO3以上 → VIDEO 調整
  • PEEK # 1002の値(矢印・SPACE キー)を専用コマンドで → BTN(-1) 追加

1.3.2b15 は不具合の修正のみ、1.3.2b16 は 1.3.2b17 対応の途上状態でしたので、
この記事への追加をしていませんでした。

BTN(-1) 追加は IchigoJam BASIC では仮想メモリ #1002、
IchigoCake BASIC では #1ED2 の値となります。
次の値の合計値です。つまりキーの同時押しが検出できるようになっています。

値 キー
1 ← 矢印 左キー・LEFT
2 → 矢印 右キー・RIGHT
4 ↑ 矢印 上キー・UP
8 ↓ 矢印 下キー・DOWN
16 SPACE スペースキー

Facebook ページ IchigoJam-FAN では触れてあったのですが、
新機能がだいぶ追加された影響で、この仕様が定まり次第、1.4βへ更新される予定です。
つまり、次の正式版は 1.3.2 ではなく、1.4.0 となると思われます。


追加 2019/06/14

1.3.2b19 が公開されています。

1.3.2b19 - PLAY 音痴修正・VIDEO ブレ修正・BTN 一斉取得

  • DRAW の PRESET → DRAW に値追加で対応(反転 XOR も追加)
  • CHR$(#80)~(#8F) の SCR → POINT 追加
  • AUTOEXECダイレクトコマンド・AUTORUN(電源時にそのプログラムを自動起動) → プログラム番号 0 に先頭行 @ARUN で自動起動するように

1.3.2b18 は不具合の修正のみなので追加していませんでした。
DRAW は値が 3 つまたは 5 つの場合、一番右の値が線画方法となります。

値 線画方法
0 PRESET 非表示
1 PSET 表示(省略時)
2 XOR 表示・非表示の反転

点の簡単なサンプルは次のとおりです。1 行ずつ入力して確認してみて下さい。

DRAW 32,24,1
DRAW 32,24,0
DRAW 32,24,2
DRAW 32,24,2
DRAW 32,24,2
      :

線の場合は次のとおりです。

DRAW 10,10,50,40,1
DRAW 10,10,50,40,0
DRAW 10,10,50,40,2
DRAW 10,10,50,40,2
DRAW 10,10,50,40,2
      :

POINT の返し値 0・1 は DRAW と共通になっています。

返し値 状態
0 PRESET 非表示
1 PSET 表示

追加 2019年6月25日

予告のとおり、1.4.0b1 と更新されて公開されました。


追加 2019年8月15日

POINT で #80~#8F 以外の文字があった場合、
1.3.2b24 までは任意の文字はすべて 0 が返ってきていたのですが、
1.4.0b1 より #00 のみ 0、これら以外は 1 を返すように変更されています。