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

« PIC24FJ64GB002を使ったUSBホストの実験 5 | トップページ | 普通のUSBコネクタをmicroUSB化するパーツ »

2016年3月 9日 (水)

Ichigojamのファームウェアを1.2b12の動作確認

Ichigojamのファームウェアを1.2b12にアップデートしました。
1.2系ではいくつかの機能が追加されており、ついでにその一部の機能を試してみました。

試したこと
  ・COPY命令 ・・・ 指定したメモリ領域のコピーを行う
    COPY コピー先アドレス、コピー元アドレス、コピーバイトサイズ
  ・ラベル
   行にラベル(@hogeohoge)を付けて、GOTO、GOSUBで飛び先を指定でこる
  ・VIDEO 2 ・・・ 画面を反転表示
   従来のVIDEO命令に画面反転機能と追加。VIDEO 1で元に戻る

更に、マシン語を使った場合の文字列の受け渡し方法について調べてみました。
プログラム中で、
  A="Hello!":   U=USR(#700,A)

とやって、
マシン語側で受け取った文字列を疑似グラフィック文字で拡大表示する処理の実装
で調べてみました。

調査にて作成したプログラム(赤字は1.2系で追加された機能)

10 'draw font2
20 CLS:CLV:CLP:P=#700
30 LET [0],#B5F7,#2380,#9201,#2290,#11B,#5ACB,#112,#189A,#4B21,#5ACB,#15B,#18D3,#1808,#18C9,#7805,#2D22
40 LET [16],#D036,#9B01,#ED,#195D,#1C2B,#1C0F,#3308,#9300,#2600,#2406,#782A,#73,#1AE3,#411A,#469C,#2301
50 LET [32],#612,#E12,#3C03,#4013,#4022,#4664,#852,#5B,#4313,#3B80,#61B,#E1B,#55BB,#786A,#4122,#2401
60 LET [48],#612,#E12,#4014,#64,#46A4,#2403,#4022,#4664,#852,#4322,#92,#189B,#55BB,#3601,#2E04,#D1D8
70 LET [64],#9B00,#3502,#3720,#429D,#D1D2,#3104,#3001,#E7C5,#2000,#BCFE,#BC02,#4708,#802,0
80 COPY P,#800,156
90 A="Hello!":B="Jam":C="World":D="Thank":E="you!":F=""
100 @LOOP
110 [0]=0:[1]=0:U=USR(P,A)
120 [1]=5:U=USR(P,B)
130 [0]=4:[1]=10:U=USR(P,C)
140 [0]=12:[1]=15:U=USR(P,D)
150 [1]=20:U=USR(P,E)
160 WAIT 150
170 FOR I=0 TO 5:VIDEO 2:WAIT 10:VIDEO 1:WAIT 10:NEXT:CLS
180 FOR I=0 TO 23 STEP4:FOR J=0 TO 31 STEP 4
190 [0]=J:[1]=I:U=USR(P,F)
200 WAIT 10
210 NEXT:NEXT
220 FOR I=0 TO 5:VIDEO 2:WAIT 10:VIDEO 1:WAIT 10:NEXT:CLS
230 WAIT 150:CLS
240 GOTO @LOOP

マシン語側のプログラム(C言語で実装) 2016/03/27 修正 define文を追記

#include <stdint.h>

#define VRAM_ADR	0x900 // VRAM先頭アドレス
#define VAR_ADR		0x800 // 変数格納アドレス
#define PRG_ADR		0xc00 // プログラム格納アドレス
#define CHR_BNK		0x80  // 疑似グラフィックの空白文字
#define CHR_END		0x22  // 文字(") 

// 疑似フォント文字列表示
//  引数
//    argv : 文字列格納アドレス(USR関数の第2パラメタ)
//    m_p  : 仮想アドレスの先頭実アドレス (BASICの#000の実アドレス)
//    f_p  : フォントデータの先頭実アドレス
//
uint16_t draw_font(uint16_t argv, uint8_t* m_p,  uint8_t* f_p) {
	
	uint16_t* 	h_p = m_p + VAR_ADR; 	// 変数格納アドレス
	uint8_t* 	s_p = m_p + argv;		// 文字列格納アドレスを実アドレスに変換
	uint8_t* 	v_p = m_p + VRAM_ADR; 	// VRAMアドレス
	uint8_t*	d_p;					// フォントパターン参照用
	uint8_t		d;						// 疑似フォント作成用
	int i,j;

	v_p+= *h_p;							// [0]の値加算 横分
	v_p+= *(h_p+1)*32;					// [1]の値加算 縦分
	
	while(*s_p != CHR_END) {
		d_p = f_p + (*s_p)*8; 			// 指定フォント格納アドレス
		for (i=0; i<4;i++) {
			for (j=0;j<4;j++) {
				d = ( *d_p >> (6-(j<<1)) ) &3;
				*v_p = (d>>1 | (d&1)<<1) + CHR_BNK;
				d = ( *(d_p+1) >> (6-(j<<1)) ) &3;
				*v_p += (d>>1 | (d&1)<<1)<<2;
				v_p++;
			}
			v_p+=28;
			d_p+=2;
		}
		v_p -= 124;
		s_p++;
	}
	return 0;
}

プログラム実行の様子


※動画はビデオキャプチャした画面を「BB FlashBack Express 4 日本語版 (フリー版)」を使って
    動画作成しました。


プログラムの簡単な説明
マシン語コード部分(30~80行)の定義はプログラムを短くするため一旦、配列に格納してから
COPY命令で、PCG領域にコピーしています。通常のPOKE文を使うよりも218バイト節約出来ました。
ただし、配列領域を使わないのであれば、コピーしないでそのまま配列領域のマシン語を
呼び出しても良いですね。

マシン語部は、
  A="Hello!"
  [0]=0
  [1]=1
  U=USR(#700, A)

てな感じで、[0]に横座標(0~31)、[1]に縦座標(0~23)を指定し、Aに文字列をセットして
呼び出すと、画面の指定位置から疑似グラフィックにて文字を表示します。

ちなみに変数Aには文字列"Hello!"が格納されているアドレス(仮想アドレス)が格納されています。
  PRINT A
とやっても、"Hello!"は表示せず、アドレス(整数)が表示されます。
PRINT STR$(A)
とやることで、"Hello!"が表示されます。

マシン語部はC言語にて作成しています。
Cソースからマシン語部の作成はIJBin2Pokeを使ています。良いツールです。
プログラムでは複数の領域を参照するので、ちょっとDFD(データーフローダイアグラム)
にて図式化してみました。

Photo
     ※DFDはdiaを使って作成しました。

文字列の実体はプログラムリスト(プログラム領域)の"Hello"の変数代入部となります。
そこから文字を取り出し、そのコードに該当するフォントパターンを取り出して、
疑似グラフィックフォントに変換して、表示用メモリ(VRAM)に書き込んで表示をします。

ややこしいのが、各領域の先頭アドレスには仮想アドレスと実アドレスがあり、
マシン語中では仮想アドレスを実アドレスに変換して利用する必要があります。
その実アドレス先頭はマシン語呼び出し時に引数として渡される(m_p)のでそれを利用
します。

次に追加されたVIDEOコマンドによる反転表示ですが、ゲームなのど効果には良さそうです。
また、ラベルも行番号を意識する必要が無くなり、サブルーチンを多用する場合はかなり
効率よくプログラミングが出来ると思います。
RENUM命令によって行番号を付け直す際、手作業でGOTO分の飛び先の修正もなくなります。





« PIC24FJ64GB002を使ったUSBホストの実験 5 | トップページ | 普通のUSBコネクタをmicroUSB化するパーツ »

IchigoJam」カテゴリの記事

コメント

コメントを書く

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

トラックバック


この記事へのトラックバック一覧です: Ichigojamのファームウェアを1.2b12の動作確認:

« PIC24FJ64GB002を使ったUSBホストの実験 5 | トップページ | 普通のUSBコネクタをmicroUSB化するパーツ »