戻る
LCDへのアクセス
ハードウェアへの直接アクセスは以下により可能です。

LCD書き込み開始アドレスセット

機器上を左に向けて画面を横長にした時に、 左上から1バイト8ビット、画面横1行で40バイト(=320ビット)、 画面全体で8000バイトのリニアアドレス。
enter_int_section();
ld (0x1133), 2
ld (0x1134), 6
ld (0x1133), 3
ld (0x1134), low_address
ld (0x1134), high_address
leave_int_section();

LCD書き込み

データは黒が1、最上位ビットが左側。
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ドット分)は、 電界強度に応じて割り込みで書き換えられてしまうため、 一般アプリケーションから直接書き換えて使うことはできません。