Symfoware

Symfowareについての考察blog

Ubuntuでファミコンプログラム その2(YY-CHR)

Ubuntuでファミコンエミュレーターで動くプログラムを作ってみてます。
Ubuntu で ファミコン(NES)プログラム その1.1(リローデット)


正直、まだ全然理解できていません。
こちらのサンプルソースとにらめっこしている状態です。
http://hp.vector.co.jp/authors/VA042397/nes/sample.html


前回までのソースは、
https://bitbucket.org/symfo/nes_sample/src
こちらのsample1においてます。





不要と思った箇所を削除



メモリやセグメントを定義している(この辺もまだよくわかっていない)cfgファイル。
自分で最低限これだけが必要なんじゃないか?というところまで削ってみました。

・sample2.cfg


# メモリマップ
MEMORY {
    HEADER:        start = $0000, size = $0010, file = %O, fill = yes;
    ROMST:        start = $8000, size = $7ffa, type = ro, file = %O, fill = yes, define = yes;
    ROMINFO:    start = $fffa, size = $0006, type = ro, file = %O, fill = yes, define = yes;
    ROMCHR:        start = $0000, size = $2000, type = rw, define = yes;
}

# セグメントマップ
SEGMENTS {
    HEADER:        load = HEADER,        type = ro;
    STARTUP:    load = ROMST,        type = ro,    define = yes;
    VECINFO:    load = ROMINFO,        type = ro,    define = yes;
    CHARS:        load = ROMCHR,        type = ro;
}



これでもちゃんとコンパイルでき、エミュレーターで動作しました。







出力する文字の変更



ちょっとずつプログラムを変更しながら覚える方向で。

「"HELLO, WORLD!"」と出力していた箇所を「"HELLO, SYMFO!"」に変更してみます。

  1. ; 表示文字列
  2. string:
  3.     ;.byte    "HELLO, WORLD!"
  4.     .byte    "HELLO, SYMFO!"



265_01.png

まあ、そりゃ動くわな。







ひらがなを表示してみる



文字を表示していますが、もちろんフォントファイルなんてものはありません。

ソースの最後で読み込んでいる「character.chr」
このファイルに文字の画像があります。


  1. ; パターンテーブル
  2. .segment "CHARS"
  3.     .incbin    "character.chr"




このファイルを開くには、「YY-CHR」というツールがオススメのようです。

ギコ猫でもわかるファミコンプログラミング - 第5章 スプライト
YY-CHR

現在C#版に移行中とのことですが、UbuntuではC#版が動かせませんでした。
※もうちょっと頑張れば動いたのかも。

C++版をダウンロードし、Wineで動かすことにします。
Ubuntu 12.04へWineのインストールと使い方


「yy-chr20120407.zip」をダウンロードし解凍。
yychr.exeを実行すると、Ubuntu + Wineで動きました。

character.chrを開いてみると、こんな表示になります。

265_02.png


左上からアドレスは
0x00,0x01,0x02,..
0x10,0x11,0x11,..
となります。

フォントファイルと同じく、上手いこと「A」のコード「0x41」にAの画像があるから
「.byte "HELLO, SYMFO!"」とすれば、その文字が表示されるわけです。


なんとなく理屈がわかってきたので、ひらがなで「こんにちは せかい!」と表示してみます。
まず「こ」は0x89。
つぎの「ん」は0xad。
・・・と調べていきます。


  1. ; 表示文字列
  2. string:
  3.     ;.byte    "HELLO, WORLD!"
  4.     ;.byte    "HELLO, SYMFO!"
  5.     .byte $89, $ad, $95, $90 ;こんにち
  6.     .byte $99, $00, $8d, $85 ;は_せか
  7.     .byte $81, $21 ;い!




もう一箇所、表示しているところのループカウンタを13から10文字に変更します。


  1.     ldx    #$00
  2.     ldy    #$0a        ; 10文字表示
  3. copymap:
  4.     lda    string, x




できました。

265_03.png







文字の色を変更してみる



文字の色はパレットテーブルに何を指定したかで決まります。
もちろん、この辺もよくわかっていません。

パレットテーブルを書き込んでいる箇所。


  1. palettes:
  2.     .byte    $0f, $00, $10, $20
  3.     .byte    $0f, $0f, $0f, $0f
  4.     .byte    $0f, $0f, $0f, $0f
  5.     .byte    $0f, $0f, $0f, $0f




最初の0x0fは背景色のはず。
0x00, 0x10, 0x20が色の要素です。
※0x10は表示には使用されていない。


色番号は、YY-CHRに表示されている色を確認するか、

265_04.png


こちらが非常に詳しいです。
ファミコンの画面について

とても参考になりました。



ちゃんと色が変わるか、パレットの設定箇所を変更してみます。


  1. palettes:
  2.     .byte    $0f, $08, $0f, $28
  3.     .byte    $0f, $0f, $0f, $0f
  4.     .byte    $0f, $0f, $0f, $0f
  5.     .byte    $0f, $0f, $0f, $0f




狙い通りです。

265_05.png







文字を表示する位置を変更する



背景は「ネームテーブル」と呼ばれる領域に書きこむようです。

これがよくわからない(というか今でもわからない)のですが、
穴が開くほど見てなんとなく理解したサイトがこちらです。

ギコ猫でもわかるファミコンプログラミング - 第11章 BGスクロール
NES研究室 - グラフィック


・「ネームテーブル」はアドレス$2000から始まる。
・「ネームテーブル」は、画面サイズと同じ領域ではなく画面の4倍の領域がある。
・一つの領域は、横32(0x20)ブロック、縦30ブロック。

ネームテーブルのアドレスは$2000からのようですが、どうも手元のエミュレーターだと
一番上の領域は削られるようで表示されません。

実質使えるのは$2020から$239fまでのようでした。

横32(0x20)ブロックなので、

1行目開始:0x2020
2行目開始:0x2040
3行目開始:0x2060
4行目開始:0x2080
5行目開始:0x20a0
6行目開始:0x20c0
7行目開始:0x20e0
8行目開始:0x2100
...
となります。



この「$2020から書き始めたい」というのを依頼したい場合は、


lda    [開始アドレズの前半ビット]
sta    $2006
lda    [開始アドレスの後半ビット]
sta    $2006



という命令を実行すれば良いようです。


実際にネームテーブルへの転送開始箇所を変更して動作を確認してみます。

まずは$2020を指定して左上に。


  1. ; ネームテーブルへ転送(画面の中央付近)
  2.     ;lda    #$21
  3.     lda    #$20
  4.     sta    $2006
  5.     ;lda    #$c9
  6.     lda    #$20
  7.     sta    $2006



265_06.png



$239fを指定して左下に。


  1. ; ネームテーブルへ転送(画面の中央付近)
  2.     ;lda    #$21
  3.     ;lda    #$20
  4.     lda    #$23
  5.     sta    $2006
  6.     ;lda    #$c9
  7.     ;lda    #$20
  8.     lda    #$9f
  9.     sta    $2006



265_07.png




今回のソースは、
https://bitbucket.org/symfo/nes_sample/src
こちらのsample2においてます。



続きはこちら。
Ubuntuでファミコンプログラム その3(背景描画とパレット)



【参考URL】

ギコ猫でもわかるファミコンプログラミング - 第5章 スプライト
ギコ猫でもわかるファミコンプログラミング - 第11章 BGスクロール
ファミコンの画面について
NES研究室 - グラフィック

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/01/01(水) 19:38:24|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Ubuntuでファミコンプログラム その3(背景描画とパレット) | ホーム | Ubuntu で ファミコン(NES)プログラム その1.1(リローデット)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1198-c39c59f3
この記事にトラックバックする(FC2ブログユーザー)