フォト
2017年3月
      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 31  
無料ブログはココログ

« IchigoJamのデジタル入力ピン(IN1~IN4)について | トップページ | Raspberry Piはじめました »

2015年6月22日 (月)

IchigoJamで疑似グラフィックを使った文字表示

IchigoJamの疑似グラフィック(64x48ドット)を利用した文字表示です。
USR関数を使ってC言語で作成した関数を呼び出して高速表示を行っています。

01

実際の表示した動画です。

Icihojamのソースは下記の通りです。
バージョン1.0.1のみに対応しています。他のバージョンでは動作しません。
現状、VRAM、変数領域、フォントデータの格納アドレスがバージョンにより異なります。
この当たりはプログラムカウンタからの相対アドレスで対応出来るか検討中です。

1 '
2 CLS:CLV:CLP
10 POKE#700,#1b,#4b,#c0,#00,#f0,#b5,#c6,#18,#1a,#4b,#1c,#88,#1a,#4b,#64,#01
20 POKE#710,#1b,#88,#e4,#18,#19,#4b,#e4,#18,#19,#4b,#c0,#18,#00,#25,#06,#21
30 POKE#720,#32,#78,#6b,#00,#cb,#1a,#1a,#41,#d2,#b2,#01,#27,#9c,#46,#13,#1c
40 POKE#730,#03,#39,#3b,#40,#0a,#40,#fa,#40,#bb,#40,#61,#46,#13,#43,#80,#3b
50 POKE#740,#db,#b2,#63,#55,#72,#78,#0a,#41,#03,#21,#d2,#b2,#17,#40,#11,#40
60 POKE#750,#7f,#00,#49,#08,#39,#43,#89,#00,#5b,#18,#63,#55,#01,#35,#04,#2d
70 POKE#760,#dd,#d1,#02,#36,#20,#34,#86,#42,#d8,#d1,#00,#20,#f0,#bd,#c0,#46
80 POKE#770,#6c,#49,#00,#00,#8a,#02,#00,#10,#88,#02,#00,#10,#88,#03,#00,#10
90 POKE#780,#74,#49,#00,#00
100 [0]=0:[1]=0
110 for I=0 to255
120 [0]=(I MOD 8)*4
130 [1]=(I/8 MOD 6)*4
140 U=USR(#700,i)
150 IF I MOD 48=47 WAIT 5
160 NEXT
170 GOTO 100

呼び出しているC言語ソースは次のようになります。

#include "lpc_types.h"
#define VRAM_ADR	((uint8_t*)0x10000388)	// VRAM先頭アドレス
#define FONT_ADR 	((uint8_t*)0x0000496C)	// フォントデータ先頭アドレス
#define VALUE_ADR  ((uint16_t*)0x10000288)	// 変数格納アドレス
#define CHR_BNK 	0x80

uint16_t draw_font(uint16_t c) {
	uint8_t* 	f_p = FONT_ADR + c*8; 	// フォント格納アドレス
	uint16_t* 	h_p = VALUE_ADR; 		// 変数格納アドレス
	uint8_t* 	v_p = VRAM_ADR; 		// VRAMアドレス
	uint8_t		d;
	int i,j;

	v_p+= *h_p;
	v_p+= *(h_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;
}

コンパイルはWindows8.1上のLPCXpressoでダミーのプロジェクトを作成し、
上記の関数を記述したdraw_font.cをコンパイルしてオブジェクトファイル draw_font.oを
作成し、そのファイルからobjdumpコマンドにてコードを取り出して、IchigoJamに
移植しています。

objdump -s -j .text.draw_font draw_font.o

draw_font.o:     file format elf32-littlearm

Contents of section .text.draw_font:
 0000 1b4bc000 f0b5c618 1a4b1c88 1a4b6401  .K.......K...Kd.
 0010 1b88e418 194be418 194bc018 00250621  .....K...K...%.!
 0020 32786b00 cb1a1a41 d2b20127 9c46131c  2xk....A...'.F..
 0030 03393b40 0a40fa40 bb406146 1343803b  .9;@.@.@.@aF.C.;
 0040 dbb26355 72780a41 0321d2b2 17401140  ..cUrx.A.!...@.@
 0050 7f004908 39438900 5b186355 0135042d  ..I.9C..[.cU.5.-
 0060 ddd10236 20348642 d8d10020 f0bdc046  ...6 4.B... ...F
 0070 6c490000 8a020010 88020010 88030010  lI..............
 0080 74490000 

LPCXpressoに添付のobjdumpコマンドにてコード部を出力して加工後、
IcigoJamに移植しています。

USR関数の呼び出し U=USR(#700,I)を実行するとIの値はレジスタr0にセットされます。
呼び出されたC言語実装による関数はレジスタr0を関数の第1引数で受け取ることが
出来ます。関数の戻り値(return 0)はr0レジスタにセットされU変数にセットされます。

今回作成した関数はIcihojamの変数[0]、[1]を参照してフォントを表示する横、縦位置を
取得しています。[0]が横、[1]が縦位置です。
USR関数の引数には表示したい文字のキャラクターコードを指定します。

« IchigoJamのデジタル入力ピン(IN1~IN4)について | トップページ | Raspberry Piはじめました »

IchigoJam」カテゴリの記事

表示器制御関連」カテゴリの記事

コメント

コメントを書く

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

トラックバック

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

この記事へのトラックバック一覧です: IchigoJamで疑似グラフィックを使った文字表示:

« IchigoJamのデジタル入力ピン(IN1~IN4)について | トップページ | Raspberry Piはじめました »