このページ内の目次

ダウンロード

概要

printf、iprintf などで日本語を表示するためのライブラリです。 ちょっとサイズが大きいですが、デバッグ用に使えるのではないかと。

do_make.bat をダブルクリックすると ./lib に、 libjconsole.a というファイルが作られます。 これは静的リンクライブラリとして機能するもので、 devkitPro/libnds/lib に追加することでライブラリとして動作します。

使用する時は、Makefileを編集して、

LIBS  := -lnds9

の行を、

LIBS  := -lnds9 -ljconsole

に変更してください。

コード的には、 jconsole.h をインクルードして、 初期化関数を呼び出すことでコンソールで日本語文字列を 使用することができます。

画面モードは、フレームバッファモードにする必要があります。 テキスト(タイル)モードでは使用できません。

文字コードは Shift-JIS を想定しています。 EUC-JP など、他の2バイト文字列系に変更することもできますが、 文字テーブルを何らかの方法で作って置き換える必要があります。

文字テーブルファイルは、 mplus_font_10x10.c (日本語) mplus_font_10x10alpha.c (英数)

です。 ビットマップがそのまま入っています。 配列のインデックスは、そのまま文字コードを表しています。 M+フォントを使わせて頂いています。

http://mplus-fonts.sourceforge.jp/

サンプルコード

// ------------------------------------------------------------------
//
// 日本語コンソール使用サンプル (arm9)
// 2009/05/22 20:20 修正
// ------------------------------------------------------------------
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#include <nds.h>

#include "jconsole.h"

void vblank()
{
 ;
}

// メインルーチン
int main(void)
{
  int n = 0;
  
  // 画面 ON
  powerOn(POWER_ALL_2D);

  // 表示モードの選択
  videoSetMode(MODE_5_2D | DISPLAY_BG3_ACTIVE);
  videoSetModeSub(MODE_5_2D | DISPLAY_BG3_ACTIVE);

  // VRAM バンクの選択
  vramSetBankA(VRAM_A_MAIN_BG);
  vramSetBankB(VRAM_C_SUB_BG);

  // BG 3 の初期化
  bgInit(3, BgType_Bmp16, BgSize_B16_256x256, 0, 0);
  bgInitSub(3, BgType_Bmp16, BgSize_B16_256x256, 0, 0);

  // V-Blank 開始時の割り込み処理関数を登録
  irqSet(IRQ_VBLANK, vblank);
 
  // BG_GFX を使った場合、メインスクリーンに、
  // BG_GFX_SUB を使った場合、サブスクリーンに表示します。
  //init_jconsole(BG_GFX);
  init_jconsole(BG_GFX_SUB);
  
  // 日本語文字コードで、「\」(0x5C) が含まれる文字は、
  // gcc の文字列処理の関係でエスケープ文字として
  // 認識されてしまうため、エスケープ文字ではないことを
  // 示すために「ソ」の後に「\」を追加しています。
  iprintf("# 日本語コンソ\ールテスト");
  
  // devkitProUpdater-1.5.0 以降のものをご使用の場合、
  // 次のように変更してください。
  //iprintf("%s", "# 日本語コンソ\ールテスト");
  
  while (1) {
    n++;
    swiWaitForVBlank();
    iprintf("\x1b[2;3HVBlank カウンター : %05d", n);
    
    // devkitProUpdater-1.5.0 以降のものをご使用の場合、
    // 次のように変更してください。
    //iprintf("%s%05d", "\x1b[2;3HVBlank カウンター : ", n);
  }
  
  return 0;
}

(注) : devkitProUpdater-1.5.0 以降のものをご使用の場合は、日本語の文字列が直接表示できないようなので、表示する時に少し変わったことをする必要があります…。

  • × : printf("日本語");
  • ○ : printf("%s", "日本語");

このように、一旦 %s で表示する場所だけを決めておき、日本語の文字列を 2 番目以降の引数に指定するようにしてください。こうすることで一応、表示されない問題が回避できるようです。このような、とりあえずの回避策が必要ないようにするために修正しようと思いましたが、Updater-1.5.0 では、 devkit の根幹の部分で変更が起こったようなので、今のところ修正が困難な状態になっています。

使用可能なエスケープシーケンス

ESC [x;yH

カーソルを (x, y) に移動します。 x の範囲 : 0 〜 41 (全角の場合 40) y の範囲 : 0 〜 16

// カーソルを (10, 3) に移動して、 Test と表示する
printf("\x1b[10;3HTest");

ESC [nA

カーソルを n 行上に移動します。 [現在の行の値] - n が 0 より小さくなった場合、0 に修正されます。

// Test を消して、Hello World! に書き換える
printf("Test\n");
printf("\x1b[1AHello World!");

ESC [nB

カーソルを n 行下に移動します。 [現在の行の値] + n が 16 より大きくなった場合、16 に修正されます。

// Test から 3 行開けて、 Hello World! を表示する
printf("Test\n");
printf("\x1b[3BHello World!");

ESC [nC

カーソルを n 列右に移動します。 [現在の列の値] + n が 41 より大きくなった場合、41 に修正されます。

// 3 列目に Hello World! を表示する
printf("\x1b[3CHello World!");

ESC [nD

カーソルを n 列左に移動します。 [現在の列の値] - n が 0 より小さくなった場合、0 に修正されます。

// Test を 1 行目に、 Hello World! を 2 行目の 3 列目に表示します。
printf("Test\x1b[1B");
printf("\x1b[1DHello World!");

ESC [s

現在のカーソル位置を保存します。

ESC [u

ESC [s で保存したカーソル位置にカーソルを戻します。

// Test の行を、 Hello World! で上書きします。
printf("\x1b[sTest\n");
printf("\x1b[uHello World!");

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-10-27 (日) 17:45:25 (2952d)