中間コード


IchigonQuest では つうしん を用いて送受する際に独自の中間コードで送受します。

このページではこの中間コードの形式について説明しています。

 

IchigonQuest のアーカイブには reference.ja.txt のファイル、IchigonQuestコマンド仕様書 が含まれています。

この中間コード仕様の公式文章です。


ぼうけんしょ つうしんの形式

ぼうけんしょ一つがバイナリーで 512 バイト固定になります。

これは ぼうけんしょ(プログラム)の長さに関係なく固定になります。

このページでは基本的にバイナリーで構成されている状態で説明をしています。

 

IchigonQuest へ送る場合は必ずバイナリー 512 バイト固定である事にご注意下さい。

 

Hex 形式

1 バイトのコード(文字)を 0~9・A~F の 16 進数 2 文字に変換したものです。

16 進数 5A の 1 バイトコードであれば、「5A」という 2 文字に変換されます。

 

これは IchigonQuest そのものは考慮していませんが、Hex 形式に変換する事でテキストファイルとなり、

そのままプログラム投稿として行う事ができ、Kidspod; への投稿に採用されてきています。

 

単純に IchigonQuest のバイナリー 512 バイトを変換した場合は 2 倍 1024 バイトの文字となりますが、

IJUtilities や MicJack(MixJuice 上位互換)は終了後の FF ではじまる行以降を削除して生成します。

IchigonQuest へ送出する場合は不足しているところを FF ではじまる 8 バイトで埋めます。


ぼうけんしょの構成

1 行は 8 バイトで構成されます。512÷8=64 で、ぼうけんしょ 1 つの最大行は 64 行となっています。

 

行番号 01 8 バイト
行番号 02 8 バイト
:
行番号 63 8 バイト
行番号 64 8 バイト

行毎の構成

各行の 8 バイトは次のように構成されています。

 

ID 種類 値 1 値 2 値 3
予備 値 3 値 2

値 1

1 バイト 1 バイト 2 バイト 2 バイト 2 バイト

 

それぞれ次の意味となっています。

 

ID

1 バイト。じゅもん・どうぐ のコマンドが入っています。

 

種類

1 バイトですが、ビット単位で更に分かれています。

  • 下位 2・1 ビット = 値 1
  • 下位 4・3 ビット = 値 2
  • 下位 6・5 ビット = 値 3
  • 下位 8・7 ビット = 予備

種類内の値 1・値 2・値 3 はそれぞれ、次の値が入っています。

  • 00 = かず。該当する値(値 1~3)には数値が直接入っています
  • 01 = はこ。はこ に入っている値が有効です。0=はこ# | 1~7=はこA~はこG

10 と 11 は予約扱いとなっています。

下位 8・7 ビットは現在 00 ですが、将来的に使われる事を想定し、00 固定である事を期待しないで下さい。

 

値 1・値 2・値 3

それぞれ 2 バイトで、下位 1 バイト・上位 1 バイトの順です。

値が入っていますが、種類によって値の意味が変化する事にご注意下さい。

 

使われていないところは現在 00 ですが、将来的に使われる事を想定し、00 固定である事を期待しないで下さい。


ID と値の割り当て

ここでの ID は 16 進数、値 1~値 3 は 10 進数の数値です。

 

種類・値 1~3 で空白のところは使用していないところです。(通常 16 進数 00 で埋めます)

 

種類で割り当てられているところは背景を変えています。

これに該当する値は 種類 が 2 進数 00 の場合は直接数値が入り、01 の場合は はこ の種類が入っている事にご注意下さい。

 

ID 種類 値 1 値 2 値 3
値 3 値 2

値 1

01 らいと・LED     数値 | はこ 消灯・点灯 (0|1)    
02 あうと・OUT     数値 | はこ 出力状態 (0~63)    
03 ぱるす・PWM   数値 | はこ   OUT 端子 (2~5) 幅 (0~2000)  
04 うぇいと・WAIT     数値 | はこ 長さ 単位 (0|1)  
05 ごーとぅ・GOTO       行番号 (番号-1)    
06 いん・IN       端子番号 (1~4)    
07 あなろぐ・ANA       端子番号 (0|2)    
08 ぼたん・BTN       ボタン番号 (0~5)    
09 = いれる・LET   数値 | はこ   はこ 入れる値  
0A + たす・ADD   数値 | はこ    はこ 加える値  
0B - ひく・SUB   数値 | はこ   はこ 引く値  
0C * かける・MUL   数値 | はこ   はこ 掛ける値  
0D / わる・DIV   数値 | はこ   はこ 割る値  
0E % あまり・MOD   数値 | はこ   はこ 割る値  
0F らんだむ・RND     数値 | はこ 最大 (0~32767)    
10 ごーいふ・GOIF       行番号 (番号-1) 比較 (0~3) 比較する値
11 えんど・END            
12 しーえるえす・CLS            
13 ぷりんと・PRINT     数値 | はこ キャラ | 数値 ※    
14 ろけーと・LC   数値 | はこ 数値 | はこ X 座標 (0~31) Y 座標 (0~23)  
15 すくりーん・SCR   数値 | はこ 数値 | はこ X 座標 (0~31) Y 座標 (0~23)  
16 えるらん・LRUN       ぼうけん (0~7)    
17 びーぷ・BEEP       周波数 (Hz) 長さ (1/60 秒)  
18 しーえるてぃ・CLT            
19 てぃっく・TICK            
1A あうとぴー・OUTP   数値 | はこ   OUT 端子 (1~6) 消灯・点灯 (0|1)  

 

※ 数値を入れた場合はそのコードのキャラクター、はこ を指定した場合は はこ に入っている数値を出力します。

 

プログラムの終端後は ID を FF で埋めます。
IchigonQuest は 8 バイトすべてを FF で埋め尽くしますが、

IJUtilities などでは ID 部を FF、他のところを 00 で埋めているものが見られます。

従って ID が FF であれば、他のところは無視し、ここでプログラムが終了していると判断すべきです。

 

それぞれ具体的な解説は じゅもん・どうぐ一覧 を参照して下さい。

 

IchigonQuest/じゅもん・どうぐ一覧 - GitHub で公開しています

 

ぼうけんしょ解析例

ぼうけんしょのきろく より L チカ を解析してみます。Hex ファイルは次のとおりです。

 

010001000000000004003C000100000001000000000000000400E803000000000500000000000000FFFFFFFFFFFFFFFFFFF...

 

これを 8 バイト✕ 2 文字=16 文字毎に分けます。16 文字で 1 行分です。
FF はじまりがプログラムの終了なので、その後は破棄して構いません。

 

0100010000000000

04003C0001000000

0100000000000000

0400E80300000000

0500000000000000

FFFFFFFFFFFFFFFFF

 

更に 1 1 2 2 2 バイト毎なので、それぞれ 2 倍の 2 2 4 4 4 文字で空白を入れます。

 

01 00 0100 0000 0000

04 00 3C00 0100 0000

01 00 0000 0000 0000

04 00 E803 0000 0000

05 00 0000 0000 0000

FF FF FFFF FFFF FFFF

 

では解析してみましょう。次のようになります。値 1~3 は 下位・上位 の順になっている事にご注意下さい。

3C 00 なら 003C で、10 進数 60 となります。種類は全て 00 なので、理解しやすいでしょう。

種類は 16 進数のままでは分かりにくいので、2 進数に変換し、2 桁ずつにします。

 

ID 種類 (予約 値3 値2 値1) 値 1 値 2 値 3
01 01 (らいと・LED) 00 01 00 (1=点灯) 00 00 00 00
02 04 (うぇいと・WAIT) 00 (00 00 00 00=数値) 3C 00 (数値 60) 01 00 (1=1/60 秒単位) 00 00
03 01 (らいと・LED) 00 00 00 (0=消灯) 00 00 00 00
04 04 (うぇいと・WAIT) 00 (00 00 00 00=数値) E8 03 (数値 1000) 00 00 (0=ミリ秒単位) 00 00
05 05 (ごーとぅ・GOTO) 00 00 00 (0+1=行 1 へ) 00 00 00 00
06 FF (プログラムの終了) FF FF FF FF FF FF FF

行 2 と 行 4 の うぇいと・WAIT は共に 1 秒なのですが、単位が違っていますね!? 指定の仕方を変えていたのです。

 

同じように 風船 も解析してみます。ぼうけんしょ と見比べてみると良いです。
ただし、こちらは 種類 も見る必要があるので注意を要します。

 

ID 種類 (予約 値3 値2 値1) 値 1 値 2 値 3
01 09 (= いれる・LET) 00 (00 00 00=数値 00) 01 00 (1=はこ A) 01 00 (数値 1) 00 00
02 12 (しーえるえす・CLS) 00 00 00 00 00 00 00
03 0F (らんだむ・RND) 00 (00 00 00 00=数値) 1F 00 (最大 数値 31) 00 00 00 00
04 14 (ろけーと・LC) 01 (00 00 00=数値 01=はこ) 00 00 (0=はこ #) 00 00 (数値 0) 00 00
05 13 (ぷりんと・PRINT) 00 (00 00 00 00=数値) E3 00 (キャラクター ○) 00 00 00 00
06 14 (ろけーと・LC) 00 (00 00 00=数値 00=数値) 00 00 (数値 0) 17 00 (数値 23) 00 00
07 13 (ぷりんと・PRINT) 00 (00 00 00 00=数値) 00 00 (キャラクター空白) 00 00 00 00
08 04 (うぇいと・WAIT) 00 (00 00 00 00=V) 05 00 (数値 5) 01 00 (1=1/60 秒単位) 00 00
09 14 (ろけーと・LC) 01 (00 00 00=数値 01=はこ) 00 00 (0=はこ #) 00 00 (数値 0) 00 00
10 13 (ぷりんと・PRINT) 01 (00 00 00 01=はこ) 01 00 (1=はこ A) 00 00 00 00
11 05 (ごーとぅ・GOTO) 00 02 00 (2+1=行 3 へ) 00 00 00 00
12 FF (プログラムの終了) FF FF FF FF FF FF FF

MicJack・IJUtilities の形式

MicJack を用いた Kidspod; 公開向けの IchigonQuest ぼうけんしょ は次の形式となります。

  • Hex 形式。16 の倍数で最大 1024 文字。中間に空白や改行は入らない
  • [ が行頭にある場合、その次の行を Hex データとみなす。ない場合は先頭を Hex データをみなす
  • 終了後の ID=FF 以降は削除して Hex データ化する(従って 1024 文字固定ではない)
  • プログラム終了直後は ID=FF を入れた後 00 で埋める(IchigonQuest は FF で埋めるので仕様が異なる) 

IJUtilities 0.9.9d6 よりこの形式に対応しています。ファイルは ASCII 形式の場合、次の形式で保存されます。

 

'IchigonQuest JOURNEY

 

(ぼうけんしょと入力手順)

 

[HEX]

(Hex データ)

 

1 行目「'IchigonQuest JOURNEY」はこのデータが IchigonQuest である事を IJUilities で判別させるために必要です。

ぼうけんしょと入力手順部分は省略できます。Hex データがあれば、この解読を優先します。

 

IJUtilities では IchigoJam BASIC に近い形式での保存にも対応していますが、ここでは考慮しません。