2001/1/25 井桁 健一郎

タイトル

  • ワンダースワンソフト開発補助ツール
  • 作者情報

  • 井桁 健一郎
  • 使用方法

  • WWCTool.lzhを解凍する。

    WWCTool.exeを起動する。

    プログラムを作成する。

  • 動作環境

  • WWCTool.exe

     ペンタ以降のPC

    WWCTool.exeで開発したプログラム

     ワンダースワンカラー専用

  • バージョン

  • 2.0
  • その他

  • 開発環境

     セレロン850MHz、256MByte、WinMe

     C++Builder Ver5.0

    確認した環境

     ペンタ三800MHz、768MByte、Win98

     日立フローラ、セレロン?MHz、128MByte、Win95

  • コンセプト

  • 誰でも簡単にワンダースワンカラーのプログラムを開発出来るツール。
  • アピールポイント

    技術解説

  • 最後に解説します。
  • 開発チュートリアル

    ハローワールド

    1.最初に

  • Helloというフォルダーを作成します。(開発したプログラムのソース等を保存するため)

    WWCTool.exeを起動しファイルメニューの新規作成を選択します。

    保存ダイアログが出るので先程のHelloフォルダーにHello.cで保存します。

  • 2.フォームの設定

  • 左パネルにあるFormタブを選択します。

    StartCloseの右の入力欄にtrueを入力します。

    FormColorの右の入力欄に(BLUE<<4)|BLUEを入力します。

    FormのOnCreateの右の入力欄をダブルクリックします。(EFormCreateが自動で入ります)

    もう一度ダブルクリックすると編集画面のvoid EFormCreate(void)に移動しますので、太字の部分

    void EFormCreate(void)

    {

    ImagePuts(Image1, 1, 1, "Hello, World!", WHITE, BLACK);

    }

    以上のように入力します。

  • 3.イメージの設定

  • 左パネルにあるImageタブを選択します。

    Image1

    OnKeyUp

    左上座標 1 1

    幅高さ 15 5

    Image ImageBuf1

    Image幅高さ 15 5

    Enabled true

    以上のように入力します。

    編集画面のグローバル変数に

    UCHAR ImageBuf1[15*5*32];

    以上のように入力します。

    画面タブでイメージバッファーと表示される領域の関係がわかります。

  • 4.仕上げ

  • ここでファイルを上書き保存し、コンパイルボタンを押します。

    転送ボタンでワンダースワンに転送し実行します。

     Hello, World!

    と表示され、startボタンを押すと終了すれば成功です。

  • ロール

    1.最初に

  • Rollというフォルダーを作成します。(開発したプログラムのソース等を保存するため)

    WWCTool.exeを起動しファイルメニューの新規作成を選択します。

    保存ダイアログが出るので先程のRollフォルダーにRoll.cで保存します。

  • 2.フォームの設定

  • 左パネルにあるFormタブを選択します。

    StartCloseの右の入力欄にtrueを入力します。

    FormColorの右の入力欄に(BLUE<<4)|BLUEを入力します。

    FormのOnCreateの右の入力欄をダブルクリックします。(EFormCreateが自動で入ります)

    もう一度ダブルクリックすると編集画面のvoid EFormCreate(void)に移動しますので、太字の部分

    void EFormCreate(void)

    {

    ImagePuts(Image1, 0, 0, "ロールのサンプル", WHITE, BLACK);

    ImagePuts(Image1, 0, 1, "トリプルバッファー使用?", WHITE, BLACK);

    ImagePuts(Image1, 0, 2, "横表示モードの時", WHITE, BLACK);

    ImagePuts(Image1, 0, 3, " Aキーで縦表示に", WHITE, BLACK);

    ImagePuts(Image1, 0, 4, " Bキーで表示領域変更", WHITE, BLACK);

    ImagePuts(Image1, 0, 5, " Xキーでロール", WHITE, BLACK);

    ImagePuts(Image1, 0, 6, "縦表示モードの時", WHITE, BLACK);

    ImagePuts(Image1, 0, 7, " X3キーで横表示に", WHITE, BLACK);

    ImagePuts(Image1, 0, 8, " X4キーで表示領域変更", WHITE, BLACK);

    ImagePuts(Image1, 0, 9, " Yキーでロール", WHITE, BLACK);

    chdir("/rom0/");

    ImageLoadFromFile(Image1, "Map.bmp");

    Form->Focused = 1;

    }

    以上のように入力します。

  • 3.イメージの設定

  • 左パネルにあるImageタブを選択します。

    Image1のOnKeyUpの右の入力欄をダブルクリックします。(EImage1KeyUpが自動で入ります)

    Image1

    OnKeyUp EImage1KeyUp

    左上座標 1 1

    幅高さ 12 12

    Image ImageBuf1

    Image幅高さ 32 32

    Enabled true

    以上のように入力します。

    編集画面のグローバル変数に

    UCHAR ImageBuf1[32*32*32];

    以上のように入力します。

    Image0のOnKeyUpの右の入力欄をダブルクリックします。

  • void EImage1KeyUp(UINT Keys)

    {

    static int Mode=0;

    if(Keys & Key->Enter){

    FormViewChange(!Form->TateView);

    ImageTateYoko(Image1);

    }

    if(Keys & Key->Esc){

    if(Mode == 0){

    Image1->Width = 20;

    Image1->Height = 16;

    Mode=1;

    }else{

    Image1->Width = 12;

    Image1->Height = 12;

    Mode=0;

    }

    }

    }

  • 以上のように入力します。
  • 3.タイマーの設定

  • 左パネルにあるTimerタブを選択します。

    TimerのOnTimerの右の入力欄をダブルクリックします。(ETimerTimerが自動で入ります)

    Interval 200;

    Enabled true;

    以上のように入力します。

    TimerのOnKeyUpの右の入力欄をダブルクリックします。

    void ETimerTimer(void)

    {

    if(Form->Key & Key->Right){

    Image1->ImageLeft++;

    }

    if(Form->Key & Key->Left){

    Image1->ImageLeft--;

    }

    if(Form->Key & Key->Up){

    Image1->ImageTop--;

    }

    if(Form->Key & Key->Down){

    Image1->ImageTop++;

    }

    }

    以上のように入力します。

  • 4.仕上げ

  • map.bmpファイルをTransMagic等で/rom0領域にコピーしておきます。

    ここでファイルを上書き保存し、コンパイルボタンを押します。

    転送ボタンでワンダースワンに転送し実行します。

    説明がでて、落書きが表示され、startボタンを押すと終了すれば成功です。

    ロールしたときに画像が乱れるのは画面更新と同期が取れていない為で3.のタイマーを

    フォームのVBlankイベントに変更すると乱れなくなります。(Rool2フォルダーに有ります)

  • 画像ビュアの開発(24ビットbmpファイルを4096色に減色表示する)

    1.最初に

  • BmpViewというフォルダーを作成します。(開発したプログラムのソース等を保存するため)

    WWCTool.exeを起動しファイルメニューの新規作成を選択します。

    保存ダイアログが出るので先程のBmpViewフォルダーにBmpView.cで保存します。

  • 2.フォームの設定

  • 左パネルにあるFormタブを選択します。

    StartClose右の入力欄にtrueを入力します。

    FormのOnCreateの右の入力欄をダブルクリックします。(EFormCreateが自動で入ります)

    もう一度ダブルクリックすると編集画面のvoid EFormCreate(void)に移動しますので、太字の部分

    void EFormCreate(void)

    {

    chdir("/rom0/");

    ImagePuts(Image0, 0, 0,"テストプログラム", WHITE, BLACK);

    }

    と入力します。

    編集画面のグローバル変数に

    UCHAR ImageBuf0[WWC_FORM_WIDTH*WWC_FORM_HEIGHT*32];

    と入力します。

  • 3.テスト1

  • ここでファイルを上書き保存し、コンパイルボタンを押します。

    転送ボタンでワンダースワンに転送し実行します。

     テストプログラム

    と表示され、startボタンを押すと終了すれば成功です。

    ImagePuts(Image0, 0, 0,"テストプログラム", WHITE, BLACK);この文を

    EImage0KeyUp(Key->ExUp);こちらの文に置き換えます。

  • 4.ファイル選択部分の作成

  • 左パネルにあるImageタブを選択します。

    Image0のOnKeyUpの右の入力欄をダブルクリックします。(EImage0KeyUpが自動で入ります)

    Image0

    OnKeyUp EImage0KeyUp

    Image ImageBuf0

    Enabled true

    以上のように入力します。

    UCHAR FileList[18][MAXFNAME];

    int FileListPos;

    と入力します。

    Image0のOnKeyUpの右の入力欄をダブルクリックします。

    void EImage0KeyUp(UINT Keys)

    {

    int Size, n;

    if(Keys & Key->ExUp){

    ImageFill(Image0, (WHITE<<4)|WHITE);

    Size = FileGetName(FileList, "", 18);

    for(n=0;n < Size;n++){

    FileList[n][MAXFNAME-1] = 0;

    ImagePuts(Image0, 0, n, FileList[n], BLACK, WHITE);

    }

    }

    ImagePuts(Image0, 0, FileListPos, FileList[FileListPos], BLACK, WHITE);

    if(Keys & Key->Up){

    if(FileListPos > 0){

    FileListPos--;

    }

    }

    if(Keys & Key->Down){

    if(FileListPos < 18-1){

    FileListPos++;

    }

    }

    ImagePuts(Image0, 0, FileListPos, FileList[FileListPos], WHITE, BLACK);

    /* if(Keys & Key->Enter){

    Image12Fill(0, 0, 0);

    if(Image12LoadFromFile(FileList[FileListPos]) == true){

    Form->Color12bit=true;

    Form->Focused = 1;

    }

    }*/

    }

    以上のように入力します。

  • 5.テスト2

  • ここでファイルを上書き保存し、コンパイルボタンを押します。

    転送ボタンでワンダースワンに転送し実行します。

    ファイル一覧が表示され、startボタンを押すと終了すれば成功です。

    コメントの部分を解除してください。

  • 6.画像表示部分の作成

  • 左パネルにあるImageタブを選択します。

    Image1のOnKeyUpの右の入力欄をダブルクリックします。(EImage1KeyUpが自動で入ります)

    Image1

    OnKeyUp EImage1KeyUp

    左上座標 5 5

    幅高さ 10 10

    Image ImageBuf1

    Image幅高さ 10 10

    Image2

    OnKeyUp

    左上座標 5 5

    幅高さ 10 10

    Image ImageBuf2

    Image幅高さ 10 10

    Image3

    OnKeyUp

    左上座標 5 5

    幅高さ 10 10

    Image ImageBuf3

    Image幅高さ 10 10

    以上のように入力します。

    編集画面のグローバル変数に

    UCHAR ImageBuf1[10*10*32];

    UCHAR ImageBuf2[10*10*32];

    UCHAR ImageBuf3[10*10*32];

    と入力します。

    Image0のOnKeyUpの右の入力欄をダブルクリックします。

    void EImage1KeyUp(UINT Keys)

    {

    if(Keys & Key->ExUp){

    Form->Color12bit=false;

    Form->Focused = 0;

    }

    if(Keys & Key->Right){

    Image1->Left++;

    }

    if(Keys & Key->Left){

    Image1->Left--;

    }

    if(Keys & Key->Up){

    Image1->Top--;

    }

    if(Keys & Key->Down){

    Image1->Top++;

    }

    if(Keys & Key->Esc){

    FormViewChange(!Form->TateView);

    Form->Color12bit=false;

    Form->Focused = 0;

    EImage0KeyUp(Key->ExUp);

    }

    }

    以上のように入力します。

  • 7.仕上げ

  • ここでファイルを上書き保存し、コンパイルボタンを押します。

    転送ボタンでワンダースワンに転送し実行します。

    24bit bmpファイルを表示出来ます。(横幅256まで)

  • テキストビュア

  • ソースファイルを参照してください。
  • 技術解説

    1章 プログラムの起動、終了

    1)プログラム開始時の起動順番

  • 1.WWCInit();

    2.WWCmain内初期化

    3.Form->OnCreate();

  • 2)プログラム終了時の起動順番

  • 1.Form->OnClose();

    2.WWCmain内終了処理

  • 2章 フォーム(WWCForm)

    1)イベント

  • 1.OnCreate プログラム起動時に呼び出し

    2.OnIdle アイドリング中に呼び出し

    3.OnVBlank VBlank発生時呼び出し

    4.OnKeyUp キーが放された時呼び出し

    5.OnClose プログラム終了時呼び出し

  • 2)変数

  • 1.Width 画面幅(縦表示:18 横表示:28)

    2.Height 画面高さ(縦表示:28 横表示:18)

    3.MouseX マウスX軸座標

    4.MouseY マウスY軸座標

    5.MouseFont マウスのフォントデータ

    6.MouseEnabled マウス有効

    7.Key キーの状態

    8.StartClose STARTキー入力でプログラム終了

    9.Tateview 縦表示

    10.FormColor フォーム色表示

    11.color12 12bitカラーモード(Image1~3を使用)

    12.color Image0->Enabled=false時のフォームの色

    13.Focused フォーカス設定

  • 3章 キー(Key) 横表示時と縦表示でキー割り当てが変わります。

  • 1.Up 横表示:X1 縦表示:Y2

    2.Down 横表示:X3 縦表示:Y4

    3.Left 横表示:X4 縦表示:Y1

    4.Right 横表示:X2 縦表示:Y3

    5.Enter 横表示:A 縦表示:X3

    6.Esc 横表示:B 縦表示:X4

    7.ExUp 横表示:Y1 縦表示:X2

    8.ExDown 横表示:Y3 縦表示:B

    9.ExLeft 横表示:Y4 縦表示:X1

    10.ExRight 横表示:Y2 縦表示:A

  • 4章 イメージ(WWCImage0~3)

    1)イベント

    2)変数

  • 1.Top 上座標(キャラクタ単位)

    2.Left 左座標(キャラクタ単位)

    3.Height 高さ(キャラクタ単位)

    4.Width 幅(キャラクタ単位)

    5.Image イメージが格納されるバッファ

    6.ImageTop Imageバッファーの上座標(キャラクタ単位)

    7.ImageLeft Imageバッファーの左座標(キャラクタ単位)

    8.ImageHeight Imageバッファーの高さ(キャラクタ単位)

    9.ImageWidth Imageバッファの幅(キャラクタ単位)

    10.Enabled 有効

  • 5章 タイマー(WWCTimer)

    1)イベント

  • 1.OnTimer 繰り返し時間後に呼び出し
  • 2)変数

  • 1.Interval 繰り返し時間[ms]

    2.Enabled 有効

  • 6章 画面構成(スクリーン)

    1)横置き(screen_set_char関数使用)

    ---|000|001|002|003|004|005|006|007|008|009|010|011|012|013|014|015|016|017|018|019|020|021|022|023|024|025|026|027

    000|000|018|036|054|072|090|108|126|144|162|180|198|216|234|252|270|288|306|324|342|360|378|396|414|432|450|468|486

    001|001|019|037|055|073|091|109|127|145|163|181|199|217|235|253|271|289|307|325|343|361|379|397|415|433|451|469|487

    002|002|020|038|056|074|092|110|128|146|164|182|200|218|236|254|272|290|308|326|344|362|380|398|416|434|452|470|488

    003|003|021|039|057|075|093|111|129|147|165|183|201|219|237|255|273|291|309|327|345|363|381|399|417|435|453|471|489

    004|004|022|040|058|076|094|112|130|148|166|184|202|220|238|256|274|292|310|328|346|364|382|400|418|436|454|472|490

    005|005|023|041|059|077|095|113|131|149|167|185|203|221|239|257|275|293|311|329|347|365|383|401|419|437|455|473|491

    006|006|024|042|060|078|096|114|132|150|168|186|204|222|240|258|276|294|312|330|348|366|384|402|420|438|456|474|492

    007|007|025|043|061|079|097|115|133|151|169|187|205|223|241|259|277|295|313|331|349|367|385|403|421|439|457|475|493

    008|008|026|044|062|080|098|116|134|152|170|188|206|224|242|260|278|296|314|332|350|368|386|404|422|440|458|476|494

    009|009|027|045|063|081|099|117|135|153|171|189|207|225|243|261|279|297|315|333|351|369|387|405|423|441|459|477|495

    010|010|028|046|064|082|100|118|136|154|172|190|208|226|244|262|280|298|316|334|352|370|388|406|424|442|460|478|496

    011|011|029|047|065|083|101|119|137|155|173|191|209|227|245|263|281|299|317|335|353|371|389|407|425|443|461|479|497

    012|012|030|048|066|084|102|120|138|156|174|192|210|228|246|264|282|300|318|336|354|372|390|408|426|444|462|480|498

    013|013|031|049|067|085|103|121|139|157|175|193|211|229|247|265|283|301|319|337|355|373|391|409|427|445|463|481|499

    014|014|032|050|068|086|104|122|140|158|176|194|212|230|248|266|284|302|320|338|356|374|392|410|428|446|464|482|500|

    015|015|033|051|069|087|105|123|141|159|177|195|213|231|249|267|285|303|321|339|357|375|393|411|429|447|465|483|501|

    016|016|034|052|070|088|106|124|142|160|178|196|214|232|250|268|286|304|322|340|358|376|394|412|430|448|466|484|502|

    017|017|035|053|071|089|107|125|143|161|179|197|215|233|251|269|287|305|323|341|359|377|395|413|431|449|467|485|503

    2)縦置き(screen_set_char関数使用)

  • ---|000|001|002|003|004|005|006|007|008|009|010|011|012|013|014|015|016|017

    000|000|028|056|084|112|140|168|196|224|252|280|308|336|364|392|420|448|476

    001|001|029|057|085|113|141|169|197|225|253|281|309|337|365|393|421|449|477

    002|002|030|058|086|114|142|170|198|226|254|282|310|338|366|394|422|450|478

    003|003|031|059|087|115|143|171|199|227|255|283|311|339|367|395|423|451|479

    004|004|032|060|088|116|144|172|200|228|256|284|312|340|368|396|424|452|480

    005|005|033|061|089|117|145|173|201|229|257|285|313|341|369|397|425|453|481

    006|006|034|062|090|118|146|174|202|230|258|286|314|342|370|398|426|454|482

    007|007|035|063|091|119|147|175|203|231|259|287|315|343|371|399|427|455|483

    008|008|036|064|092|120|148|176|204|232|260|288|316|344|372|400|428|456|484

    009|009|037|065|093|121|149|177|205|233|261|289|317|345|373|401|429|457|485

    010|010|038|066|094|122|150|178|206|234|262|290|318|346|374|402|430|458|486

    011|011|039|067|095|123|151|179|207|235|263|291|319|347|375|403|431|459|487

    012|012|040|068|096|124|152|180|208|236|264|292|320|348|376|404|432|460|488

    013|013|041|069|097|125|153|181|209|237|265|293|321|349|377|405|433|461|489

    014|014|042|070|098|126|154|182|210|238|266|294|322|350|378|406|434|462|490

    015|015|043|071|099|127|155|183|211|239|267|295|323|351|379|407|435|463|491

    016|016|044|072|100|128|156|184|212|240|268|296|324|352|380|408|436|464|492

    017|017|045|073|101|129|157|185|213|241|269|297|325|353|381|409|437|465|493

    018|018|046|074|102|130|158|186|214|242|270|298|326|354|382|410|438|466|494

    019|019|047|075|103|131|159|187|215|243|271|299|327|355|383|411|439|467|495

    020|020|048|076|104|132|160|188|216|244|272|300|328|356|384|412|440|468|496

    021|021|049|077|105|133|161|189|217|245|273|301|329|357|385|413|441|469|497

    022|022|050|078|106|134|162|190|218|246|274|302|330|358|386|414|442|470|498

    023|023|051|079|107|135|163|191|219|247|275|303|331|359|387|415|443|471|499

    024|024|052|080|108|136|164|192|220|248|276|304|332|360|388|416|444|472|500

    025|025|053|081|109|137|165|193|221|249|277|305|333|361|389|417|445|473|501

    026|026|054|082|110|138|166|194|222|250|278|306|334|362|390|418|446|474|502

    027|027|055|083|111|139|167|195|223|251|279|307|335|363|391|419|447|475|503

  • 3)イメージ(WWCImage)との関係

  • 1.Image?はImage?->Imageで確保されたバッファーから対応する画面の位置に定期的に転送されることで表示されます。

    2.方法としてImage0->ImageからImage3->Imageを重ねた後wwc_font_set_colordata関数で画面に転送されます。

    3.Image0->Enabled=falseのときはForm->Colorで指定された色が代わりに使用されます。

    4.12bitカラーモードはスクリーン2の screen2_set_window関数で表示範囲を制限しVBALNAK後とにwwc_palette_set_color関数でRGBを切り替えています。

     (リフレッシュ周波数は1/75から1/25に遅くなる)

  • 7章 関数

  • void MemSet32(void far *des, UCHAR src, int Len);

     desの先頭からLen*32バイトsrcをセットします。

    void MemCpy32(void far *des, void far *src, int Len);

    void MemCpy32Roll(void far *des, void far *src, int Len, void *End, int RoolLen);

     srcの領域からdesの領域にLen*32バイトコピーします。

  •   MemCpy32Rollロールに対応します。

  • void FormClose(void);

     フォームを閉じる要求をします。(プログラム終了要求)

    void FormViewChange(int Mode);

     縦置き、横置きを切り替えます。

     Mode=true:縦置き、

     Mode=false:横置き

     key->?の内容は更新されます。

     Image?の内容は更新されません。

    void ImagePutc(TWWC_IMAGE *Img, int x, int y, UINT Src, UCHAR FColor, UCHAR BColor);

     Imgの座標(x,y)に文字Srcを描画します。(漢字も指定できます。)

     文字色はFColorで、背景色はBColorで指定します。

    void ImagePuts(TWWC_IMAGE *Img, int x, int y, UCHAR far *Src, UCHAR FColor, UCHAR BColor);

    void ImagePutsH(TWWC_IMAGE *Img, int x, int y, UCHAR far *Src, UCHAR FColor, UCHAR BColor);

     Imgの座標(x,y)に文字列Srcを描画します。(漢字も指定できます。)

     文字色はFColorで、背景色はBColorで指定します。

     ImagePutsHは縦書きします。

    void ImageWPuts(TWWC_IMAGE *Img, int x, int y, UINT far *Src, UCHAR FColor, UCHAR BColor);

    void ImageWPutsH(TWWC_IMAGE *Img, int x, int y, UINT far *Src, UCHAR FColor, UCHAR BColor);

     Imgの座標(x,y)に文字列Srcを描画します。(漢字も指定できます。)

     文字色はFColorで、背景色はBColorで指定します。

     ImagePutsとの違いは漢字も1文字として扱います。

     ImageWPutsHは縦書きします。

    void ImagePSet(TWWC_IMAGE *Img, int x, int y, UCHAR Color);

     Imgの座標(x,y)にColor色で点を打ちます。

    void ImageTateYoko(TWWC_IMAGE *Img);

     FormViewChange使用後に呼び出すとImgの内容を補正します。

    int ImageLoadFromFile(TWWC_IMAGE *Img, UCHAR far *path);

     Pathで指定された4色bmpファイルをImgにロードします。

    void ImageFill(TWWC_IMAGE *Img, UCHAR Color);

     ImgをColor色で埋めます。Colorは8bit指定で(WHITE<<4)|WHITEの用に指定します。

    int FileGetName(UCHAR far Name[][MAXFNAME], UCHAR far *Path, int Size);

     Pathで指定されたフォルダーのファイル名をSize個Nameに入れます。

  •  

    以下WwcTool.exeの実行画面