フォト
2017年6月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
無料ブログはココログ

« IchigoJamのファームウェアをV1.1 beta10にアップデートしました | トップページ | IchigojamのOUT命令の動作確認 »

2015年11月 1日 (日)

IchigoJamのマシン語呼び出しの機能追加の確認

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を利用させて頂きました。

01

便利ですね。
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(宇宙人?)を指定しています。

02

関数draw_font()で仮想アドレスの先頭実アドレス、フォントデータの先頭実アドレス
を取得して、画面に表示することが出来ました。

« IchigoJamのファームウェアをV1.1 beta10にアップデートしました | トップページ | IchigojamのOUT命令の動作確認 »

IchigoJam」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/62594592

この記事へのトラックバック一覧です: IchigoJamのマシン語呼び出しの機能追加の確認:

« IchigoJamのファームウェアをV1.1 beta10にアップデートしました | トップページ | IchigojamのOUT命令の動作確認 »