![]() |
戻る |
![]() |
LCDへのアクセス |
enter_int_section(); ld (0x1133), 2 ld (0x1134), 6 ld (0x1133), 3 ld (0x1134), low_address ld (0x1134), high_address leave_int_section();
enter_int_section(); ld (0x1133), 2 ld (0x1134), 5 ld (0x1133), 3 for(..) { ld (0x1134), data //自動インクリメント } leave_int_section();
![]() | |
![]() |
画面バッファメモリアクセス |
DS110OSでは、画面のビットマップ情報をメモリ内に確保しています。 このバッファメモリ情報を書き換えて、LCDに反映させることにより、画面を 書き換えます。 実際、DS110の画面書き換えは、すべてこの方法をとっています。
以下のアドレスはOS Ver2.1b(97-6-27版)のものであり、 バージョン毎に変更になります。 |
画面バッファメモリのアドレスは、0x40306cで、
ここから8000バイトの領域です。
機器上を左に向けて画面を横長にした時に、
左上から1バイト8ビット、画面横1行で40バイト(=320ビット)、
画面全体で8000バイトになります。黒いドットが1、最上位ビットが左側です。
この画面バッファの変更内容を画面に反映させるのは、 以下の画面書き換えルーチンを呼び出します。
0x604420: 画面書き換え(矩形範囲) in: b=0 xix=左上位置 c=横方向バイト数 l=縦方向ビット数機器上を左に向けて画面を横長にした場合の表現です。 xixで示す位置は、画面左上を0としたリニアアドレスです。 このルーチンを呼び出すと、指定された矩形範囲のバッファメモリがLCDへ 書き込まれます。
example() { ... for(z= 0; z<=100; z+= 2) { //(0,10)から(z,110)まで線を引く for(i= 0; i<=100; i++) { y= i+10; x= i*z/100; *(unsigned char*)(0x40306c+y*40+(x/8))|= 0x80>>(x%8); } } //書き換え呼び出し __XIX= 10*40; __C= 100/8+1; __L= 101; __B= 0; __asm("call 0x604420"); ... }画面バッファアドレス・画面書き換え関数アドレスは OSバージョン毎に変更になります。 現OSの管理バージョンは *(long*)0x600c7a の値から知ることができます。
なお、インジケータを表示する部分(8×320ドット分)は、 電界強度に応じて割り込みで書き換えられてしまうため、 一般アプリケーションから直接書き換えて使うことはできません。