先日、こどもパソコン IchigoJam の新製品の IchigoJam R が発表されました。
※IchigoJamはjig.jpの登録商標です。
さて、この IchigoJam R 、これまでの IchigoJam とはCPUの種類が違うため、これまでのマシン語が使えないようです。
上記の記事の「両対応」は「同じソースコードからそれぞれのマシン語を生成できる」という意味で、
同じマシン語を両方で使えるわけではありません。
しかし、動く機種を限ってしまうというのは不便ですので、なるべく避けたいです。
そこで、同じマシン語を同じ位置から実行することで、両方で動くようにできる方法を考えました。
両対応のマシン語
結論からいえば、例えば
00101111 10110111
11100xxx xxxxxxxx
というマシン語が使えることがわかりました。
これまでの IchigoJam では、1行目はR7 - #B7
を、2行目はGOTO n11
を表します。
(Cortex-M0 Armマシン語表 (asm15表記、抜粋) より抜粋)
1行目は比較命令なのでフラグレジスタの値が破壊されますが、他の汎用レジスタ(PCは除く)の値には影響を与えず、
2行目のGOTO
で(命令が対応する範囲の)任意の場所に制御を移すことができます。
一方、IchigoJam R では、この2行でR31 = n32
(lui
) を表します。
(RV32C RISC-Vマシン語表 (asm15r、抜粋) より抜粋)
したがって、レジスタR31
の値が破壊されますが、他の汎用レジスタの値には影響を与えず、
次の命令に進むことができます。
The RISC-V Instruction Set Manual, Volume I: User-Level ISA, Document Version 20191213 の Chapter 25 RISC-V Assembly Programmer's Handbook を参照すると、
このレジスタR31
にあたるx31
は Temporaries かつ Saver が Caller となっているため、
マシン語を呼び出してすぐ保存するべきような重要な情報は入っていないと考えられ、
この処理により破壊してしまってもまあ大丈夫でしょう。
したがって、このマシン語により、データの破壊を最小限にしつつ、これまでの IchigoJam では処理をジャンプさせ、
IchigoJam R では処理をジャンプさせない、ということが可能になります。
あとは、分岐後にそれぞれの仕様に沿ったマシン語を配置すればいいでしょう。
組み込み例
以下のコードでは、これまでの IchigoJam ではマシン語が0を返して「イママデノ ヤツ」を出力する一方、
IchigoJam R ではマシン語が1を返して「アタラシイ ヤツ」を出力します。
10 ' CPU ヲ ハンベツ スル
20 POKE#700,`10110111,`00101111 :' R7 - #B7
30 POKE#702,`00000001,`11100000 :' GOTO @TRAD
40 POKE#704,`00000101,`01000101 :' R10 = 1
50 POKE#706,`10000010,`10000000 :' RET
60 ' @TRAD
70 POKE#708,`00000000,`00100000 :' R0 = 0
80 POKE#70A,`01110000,`01000111 :' RET
90 IF USR(#700,0) ?"アタラシイ ヤツ" ELSE ?"イママデノ ヤツ"
結論
これまでの IchigoJam ではジャンプするが IchigoJam R ではジャンプしない命令を用いることで、
マシン語がどっちのCPUで実行されているかを判別し、
それぞれにあった処理に分岐させることができることがわかりました。