VBNET_NESSrcBuilderのチュートリアル
01.まずは開発環境の構築から
VBNET_NESSrcBuilderはWindowsで動くソフトなのですがNESASMを使用するにあたり
OSのCPUに対応するビット数が32ビットだったり64ビットだったりと環境が違うと困る
事になります。基本的にはエクスプローラーのPCの欄から右クリックしてプロパティ―を選択すると赤い枠で囲った
部分がOSのビット数です。
ここにNESASMの最新バージョンをハイパーリンクしておきます。
これでビルド自体は出来るようにはなりましたが、とりあえずデバッグするためのエミュレータ―が必要です。
ここでオススメなのがFCEUXです。最近のFCEUXの日本語化パッチはよく知らないですが、少なくとも数年前の日本語化パッチは
FCEUXがうまく動作しないなどの状態なのであまり使っておりません。
02.NESASMの配置と*.nesファイルの関連付け。
nesasm_2.51p_beta3.7zを解凍して出てきたexeファイルは2種類程度あるはずです。
(何故、はずと書いているかというとこの今の執筆段階でネットが開けないからです)
OSが32ビットならNESASM_x86.exeをnesフォルダに放り込んでやり、逆に
OSが64ビットならNESASM_x64.exeをnesフォルダに放り込んでください。
次に、nesファイルをファミコンのエミュレータに関連付けしたいのですが、
適当に自分が大昔作ったcc65とc言語でリバーシのファミコンソフトを入れておきました。
このファイル(reversi.nes)を右クリックして関連付けしてください。
上のようにして関連付けしてください。
うまく行かない場合はディレクトリがルートから遠すぎるか
ルートからエミュレータまでのディレクトリ名が長すぎる、といったところでしょうか。
03.まずは本体を実行してビルドするところまで
VBNET_NesSrcBuilder.exeを起動しましょう。
ファイル(F)から新規作成でblockbreakと入力して、OKボタンを押します。
すると、ソースが自動生成されます。これがひな形です。
ではビルドの上から1番目のメニューをクリックしてください。すると
ファイル保存のダイアログが出るのでProject\NES\blockbreak\stg.txtで上書き保存してください。
すると、自動的にビルドが行われて指定したnesasmとソースのアセンブルされて指定したファミコンエミュレータが
立ち上がるはずです。これが正常に行われたらこの章は終わりです。
しかし、実際には、毎回いつもソースを保存しないと実行されるプログラムが書き変わらないです。
04.YY-CHRをダウンロードして背景グラフィックを書き換えよう。
YY-CHR(OLD Version)をダウンロードしてグラフィックデータの書き換えとVRAMダンプデータを作り
ブロック崩しのマップを作りましょう。Project\NES\blockbreak\lw.bkgをYY-CHRを開いてください。
すると、このようなグラフィックになっているはずです。
左下の画像形式を2BPP NESに変更します。
すると、したのようなグラフィックが表示されます。
右上にあるBGSetのアイコンをクリックするとしたのようなウィンドウが表示されます。
これを下のように自由に書き換えてください。左側がグラフィックのパレットで右側が書き換える背景画面です。
c言語などでゲームを作るときにマップエディタ―を使った事のある方ならすぐに理解できると思います。
ただし、あまり下にすると後で出てくるパドルにとってブロックとボールが邪魔になり打ち返しにくくなりますので注意しましょう。
まあ、こんなものでしょう。ファイル->セットファイルを保存でデータをファイル名をbgname.namで保存してください。
そしたら、ソースの終わりの方のX_Pos_Initのすぐ前の行に
BGNAM: .incbin "bgname.nam"
と宣言し、バイナリファイルをインクルードします。
次にMugenLoopの上のほうにあるjsr BGONのすぐ後の行をマウスでクリックで選択した後に処理->処理NES(N)->画面をタイルで覆うを選び、
として、絶対に
lda #%11001000
sta $2000
の後に書いてはいけません。
書くと割り込み内のループに回って最悪の場合プログラムが暴走します。
それが終わったらファイル->名前を付けて保存した後にビルドしてください。
すると、うまくいけば、下の画面になります。
05.スプライトをキー入力で動かそう
0ページと1ページ(メインメモリの自由に使えるメモリアドレスの$0000から$00FFまでを0ページ、$0100から$01FFまでを1ページ)に
スプライト(背景とは異なり自由に移動できるグラフィック)のグラフィックデータを保存するのは危険なので3ページがおススメです。
(しかし、既にソース内にVBlank:の直後に
; スプライト描画(DMAを利用)
lda #$3 ; スプライトデータは$0300番地からなので、3をロードする。
sta $4014 ; スプライトDMAレジスタにAをストアして、スプライトデータをDMA転送する
と入力してあるので大丈夫です)
キー入力というと語弊があるのでここではキー入力の事をジョイパッドと呼びます。
まず、メインループのVBlank:内でジョイパッドで入力がされたらスプライトを動かす感じです。
なのでVBlank内のjsr setSprite2の前に行をクリックして
イベント(E)->NESイベント(N)->ジョイパッドで
処理->処理NES->スプライト移動で
として、やれば0番スプライト(ここでは$0300~$0303)が左ボタンを左に押すと
左に動きます。同様にすぐ下の行にマウスでクリックして
イベント(E)->NESイベント(N)->ジョイパッドでjoypad
処理->処理NES->スプライト移動で
ソースを名前を付けて保存してビルドすると
この章はこれでおしまいです。
06.自動的に動くボールを作ろう。
まずは今まで変数をデフォルトで宣言されてなかったので
スプライト変数をBall_Y,Ball_T,Ball_S,Ball_Xという変数名を3ページ内に宣言します。
また、0ページ内にBallXとBallYという変数を宣言します。
一番上の行にマウスでスクロールバーを動かして移動します。
.org $8000 ; $8000から開始のすぐ上にマウスでその行を
選択します。
処理->処理NES->OBJ宣言より
とします。
また、一番上から探すとPalIndex= $59という変数が宣言されているので
すぐ下にマウスで選択して
とします。
そのあと、
VBlank内のjsr setSprite2よりすぐ上に行を選択してCalcは、処理->処理NES->計算、変数イベントは、イベント->NESイベント->変数イベント
より選択して、下記のように書き換える
次にリセット割り込みの下の
; 0番目のスプライト座標初期化
よりすぐ上の行にスプライト情報と変数の値を書き込みます。
そしてソースを名前を付けて保存してビルドすると下の画面になります。
こんな感じで作ります。あとほんの少し続きます。
lda #112
sta Ball_Y
の後の行を選択して
として、
.Under3X
の後の行を選択して
とします。
ソースを名前を付けて保存してビルドしてください。
おや!?うまく動かないですね。後で気づきましたが、変数名が似ているとプログラミングにおいて
バグが出やすいので反転する変数をBallMXとBallMYに変更しました。なので下のようになります。
.PressRight_Right
LDA Ball_X
clc
adc BallMX
sta Ball_X
LDA Ball_Y
clc
adc BallMY
sta Ball_Y
LDA Ball_X
CMP #5
BCS .Under5X
;--------小さい処理--------
lda #5
sta Ball_X
LDA BallMX
eor #$FF
clc
adc #1
sta BallMX
.Under5X
LDA Ball_X
CMP #250
BCC .Over250
;--------以上処理--------
lda #250
sta Ball_X
LDA BallMX
eor #$FF
clc
adc #1
sta BallMX
;--------------------
.Over250
LDA Ball_Y
CMP #5
BCS .Under5Y
;--------小さい処理--------
LDA BallMY
eor #$FF
clc
adc #1
sta BallMY
;--------------------
.Under5Y
LDA Ball_Y
CMP #218
BCC .Over5Y
;--------以上処理--------
LDA BallMY
eor #$FF
clc
adc #1
sta BallMY
;--------------------
.Over5Y
jsr setSprite2
なお、ラベル以外はtabでインデントしてください。
これで、やっと上下左右で跳ね返る動きが出来ました。
以上でチュートリアルは終了です。