IchigoJamの新しいファームウェアV1.1 beta10では、マシン語呼び出しにおいて、
呼び出される側で、仮想メモリ領域の先頭実アドレス、フォントデータの先頭実アドレス
が拾得出来るようになりました。
BASICで
U=USR(#700, N)
と実行すると、
仮想アドレス#700に格納されているマシン語プログラムに対して、
レジスタに次の値がセットされて呼び出しが行われます。
R0 : USR関数の引数N (16ビット)
R1 : 仮想アドレスの先頭実アドレス (BASICの#000の実アドレス)
R2 : フォントデータの先頭実アドレス
また、USR関数の戻り値としてR0の値が返されます。
実際に次のC言語で作成した関数を呼び出して確かめてみます。
下記の関数は、指定した文字を画面に疑似グラフィック文字を使って
指定した位置に大きく表示します。
#include <stdint.h>
#define VRAM_ADR 0x900 // VRAM先頭アドレス
#define VAR_ADR 0x800 // 変数格納アドレス
#define CHR_BNK 0x80
// 仮想VRAM=>VRAM 疑似グラフィック展開
uint16_t draw_font(uint16_t c, uint8_t* m_p, uint8_t* f_p) {
uint16_t* h_p = m_p + VAR_ADR; // 変数格納アドレス
uint8_t* v_p = m_p + VRAM_ADR; // VRAMアドレス
uint8_t d;
int i,j;
f_p+=c*8; // 指定フォント格納アドレス
v_p+= *h_p; // v_pに[0]の値(横表示位置)を加算
v_p+= *(h_p+1)*32; // v_pに[1]*32(縦表示位置)を加算
for (i=0; i<4;i++) {
for (j=0;j<4;j++) {
d = ( *f_p >> (6-(j<<1)) ) &3;
*v_p = (d>>1 | (d&1)<<1) + CHR_BNK;
d = ( *(f_p+1) >> (6-(j<<1)) ) &3;
*v_p += (d>>1 | (d&1)<<1)<<2;
v_p++;
}
v_p+=28;
f_p+=2;
}
return 0;
}
関数draw_font()の引数cには、レジスタR0の値、m_pにはR1、f_pにはR2の値が
セットされて呼び出されます。
この関数をコンパイルして、マシン語コード部を生成します。
この作業がちょっと面倒なので、今回はFacebookの公開グループIchigoJam-FANにて
公開されているツール IJBin2Pokeを利用させて頂きました。

便利ですね。
C言語で記述した部分をコンパイルして、BASICからマシン語として呼び出し可能な
ソースに変更してくれます。
出力したソースをコピペして、BASICのプログラムを完成したのが次のソースです。
1 'draw font
2 CLS:CLV:CLP
10 poke#700,#80,#23,#c0,#00,#10,#18,#90,#22
20 poke#708,#f0,#b5,#06,#1c,#1b,#01,#cb,#5a
30 poke#710,#12,#01,#9a,#18,#19,#4b,#cb,#5a
40 poke#718,#5b,#01,#d3,#18,#c9,#18,#08,#36
50 poke#720,#00,#22,#06,#25,#04,#78,#53,#00
60 poke#728,#eb,#1a,#1c,#41,#24,#06,#24,#0e
70 poke#730,#01,#27,#9c,#46,#23,#1c,#03,#3d
80 poke#738,#3b,#40,#2c,#40,#fc,#40,#bb,#40
90 poke#740,#65,#46,#23,#43,#80,#3b,#1b,#06
100 poke#748,#1b,#0e,#8b,#54,#44,#78,#2c,#41
110 poke#750,#03,#25,#24,#06,#24,#0e,#27,#40
120 poke#758,#25,#40,#7f,#00,#6d,#08,#3d,#43
130 poke#760,#ad,#00,#5b,#19,#8b,#54,#01,#32
140 poke#768,#04,#2a,#da,#d1,#02,#30,#20,#31
150 poke#770,#b0,#42,#d5,#d1,#00,#20,#f0,#bc
160 poke#778,#02,#bc,#08,#47,#02,#08,#00,#00
170 '
200 FOR [1]=0TO 23 STEP4
210 FOR [0]=0TO 31 STEP4
220 U=USR(#700,237):WAIT 10:U=USR(#700,0)
230 NEXT
240 NEXT
250 GOTO 200
プログラムは、拡大表示したキャラクタが動く簡単なものです。
BASICからのマシン語呼び出しにおいて、次の値を渡しています。
変数 [0] 横位置
変数 [1] 縦位置
USR関数の第二パラメタに文字コードを指定
キャラクターコード237(宇宙人?)を指定しています。
関数draw_font()で仮想アドレスの先頭実アドレス、フォントデータの先頭実アドレス
を取得して、画面に表示することが出来ました。
最近のコメント