2016/03/31 追記
この記事の内容は古いです。ファームウェアV1.1.β11以降では、USR関数の呼び出しで、
マシン語プログラム側で実アドレスが取得可能となり、バージョンによる依存が無くなりました。
=> 関連記事:IchigoJamのマシン語呼び出しの機能追加の確認(ファームウェアV1.1β11)
IchigoJamでは、PEEK、POKE命令で、
VRAM、変数領域、プログラム領域、フォントデータ領域のアクセスが出来ます。
その領域のアドレスは仮想的なアドレスですが公開されています。
さらに、USR関数というマシン語(アセンブラコード)の呼び出しが出来る関数も利用できます。
ここでマシン語とはCPUが直接処理できる命令のことを言います。
このマシン語からVRAM、変数領域、プログラム領域、フォントデータ領域をアクセスする場合、
仮想アドレスではなく、実アドレスが必要となります。
この実アドレスをちょっと調べて見ました。次のような感じになります。
ただし、これはバージョン 1.0.0b16 の場合です。他のバージョンでは異なる可能性があります。
仮想アドレス 用途 実アドレス
#000-#6FF キャラクターパターン #00-#DF (読取専用) 0x0000488c - 0x00004F8B
#700-#7FF キャラクターパターン #E0-#FF 0x10000190 - 0x1000028F
#800-#8FF 変数[0]-[100]、A-Z 0x10000290 - 0x1000038F
#900-#BFF 画面(VRAM) 32x24 0x10000390 - 0x1000048F
#C00-#FFF プログラム領域 0x10000690 - 0x10000A8F
2015/06/19 追記V1.0.1の実アドレスは次のようになります。
仮想アドレス 用途 実アドレス
#000-#6FF キャラクターパターン #00-#DF (読取専用) 0x0000496c - 0x0000506B
#700-#7FF キャラクターパターン #E0-#FF 0x10000188 - 0x10000287
#800-#8FF 変数[0]-[100]、A-Z 0x10000288 - 0x10000387
#900-#BFF 画面(VRAM) 32x24 0x10000388 - 0x10000487
#C00-#FFF プログラム領域 0x10000688 - 0x10000A87
実際にこの実アドレスをアクセスするマシン語(アセンブラコード)プログラムを作成し、
IchigoJamにて実行してみました。
注意:下記は1.0.0b16用です。
1 CLS
10 POKE #700,#0f,#4b,#c0,#00,#c0,#18,#0f,#4b
20 POKE #708,#0f,#4a,#1b,#88,#12,#88,#5b,#01
30 POKE #710,#9b,#18,#0e,#4a,#30,#b5,#9c,#18
40 POKE #718,#0d,#4a,#9a,#18,#00,#23,#80,#21
50 POKE #720,#19,#41,#05,#78,#29,#40,#00,#d0
60 POKE #728,#01,#21,#e1,#54,#01,#33,#08,#2b
70 POKE #730,#f5,#d1,#20,#34,#01,#30,#94,#42
80 POKE #738,#f0,#d1,#00,#20,#30,#bd,#c0,#46
90 POKE #740,#8c,#48,#00,#00,#92,#02,#00,#10
100 POKE #748,#90,#02,#00,#10,#90,#03,#00,#10
110 POKE #750,#90,#04,#00,#10
120 [0]=0:[1]=0
130 FOR I=0 TO 255
140 U=USR(#700,I)
150 [0]=(I MOD 4)*8
160 [1]=(I/4 MOD 3)*8
170 IF I MOD 12=11 WAIT 5
180 NEXT
190 GOTO 120
注意:下記は1.0.1用です。
1 CLS
10 POKE #700,#0f,#4b,#c0,#00,#c0,#18,#0f,#4b
20 POKE #708,#0f,#4a,#1b,#88,#12,#88,#5b,#01
30 POKE #710,#9b,#18,#0e,#4a,#30,#b5,#9c,#18
40 POKE #718,#0d,#4a,#9a,#18,#00,#23,#80,#21
50 POKE #720,#19,#41,#05,#78,#29,#40,#00,#d0
60 POKE #728,#01,#21,#e1,#54,#01,#33,#08,#2b
70 POKE #730,#f5,#d1,#20,#34,#01,#30,#94,#42
80 POKE #738,#f0,#d1,#00,#20,#30,#bd,#c0,#46
90 POKE #740,#6c,#49,#00,#00,#8a,#02,#00,#10
100 POKE #748,#88,#02,#00,#10,#88,#03,#00,#10
110 POKE #750,#88,#04,#00,#10
120 [0]=0:[1]=0
130 FOR I=0 TO 255
140 U=USR(#700,I)
150 [0]=(I MOD 4)*8
160 [1]=(I/4 MOD 3)*8
170 IF I MOD 12=11 WAIT 5
180 NEXT
190 GOTO 120
実行結果は次のような感じです。
マシン語からはIcigoJamの変数[0]、[1]の参照、VRAMへの書き込み、フォントデータ
の読み込みを行っています。
IcigoJamでUSR関数を使ってマシン語を実行すると高速な処理が行えます。
最近のコメント