IchigoJam で用いることができる変数の仮想アドレスを一覧にしてみた。
これを用いることで、変数の値をマシン語のプログラムから直接読み書きできる。
※IchigoJamはjig.jpの登録商標です。
IchigoJam の変数
IchigoJam では、[0] から [101] までの配列と、A から Z までの変数を用いることができる。
これらの配列と変数の値は、メモリ上の仮想アドレス #800 から #8FF の領域に格納される。
この領域の前半に配列のデータが、後半に変数のデータが格納される。
配列のデータは [0] から [101] の順に前から並び、変数のデータは A から Z の順に前から並ぶ。
それぞれの配列の要素や変数の値は2バイトの符号付き整数で、リトルエンディアン (下位バイトが先) である。
変数へのマシン語からのアクセス
IchigoJam BASIC 1.1 系以上では、マシン語のプログラムを呼び出す際、第2引数にRAMの先頭アドレス (仮想アドレス #000 に相当する物理アドレス) が渡される。
たとえば、このアドレスに #800 を足すと、配列の先頭要素 [0] のアドレスが得られる。
第2引数は、M0 では R1 レジスタ、RV32C では R11 レジスタに格納される。
また、PC (実行中のプログラムのアドレス) を取得する命令を用い、それとアクセスしたい変数のアドレスの差に基づいてアクセスしたい変数のアドレスを求めることもできる。
RAM の先頭アドレスが引数として渡されない古いバージョンにも対応したい場合は、むしろこの方法を使うしかなさそうだ。
変数のアドレス一覧表を作成するプログラム
10 ' ヘンスウ アドレス イチラン
20 ?"[0]: #800"
30 A=ASC("A")
40 FOR I=0 TO 12
50 ?" ";CHR$(A+I);" : #";
60 ?HEX$(#900-2*(26-I));
70 ?" ";CHR$(A+I+13);" : #";
80 ?HEX$(#900-2*(13-I))
90 NEXT
ASC を用いて A の文字コードを取得し、それに何番目の変数かを足すことで、変数名の出力を行った。
また、変数のアドレスは、配列と変数を格納する領域の終わりのアドレスから、「最後から数えて何番目の変数か」に変数1個のサイズを掛けた値を引くことで求めた。
実行結果
今回のプログラムには、あえて CLS を入れていない。
CLS:RUN
を入力して実行することで、実行結果を画面の一番上から出力できる。
プログラムを実行すると、以下の出力が得られた。
[0]: #800
A : #8CC N : #8E6
B : #8CE O : #8E8
C : #8D0 P : #8EA
D : #8D2 Q : #8EC
E : #8D4 R : #8EE
F : #8D6 S : #8F0
G : #8D8 T : #8F2
H : #8DA U : #8F4
I : #8DC V : #8F6
J : #8DE W : #8F8
K : #8E0 X : #8FA
L : #8E2 Y : #8FC
M : #8E4 Z : #8FE
まとめ
マシン語のプログラムからのアクセスの助けになるよう、IchigoJam の変数の仮想アドレスの一覧表を作るプログラムを作り、それを用いて変数の仮想アドレスの一覧を作成した。
