背景にパレットの指定をして文字の色を変えてみる・・・っと、その前に💦
ソースコードを簡略化
前回アセンブリ言語で書いたソースコードは1160行・・・
;1行めLDA #$16STA $2007STA $2007STA $2007STA $2007STA $2007STA $2007STA $2007STA $2007STA $2007STA $2007STA $2007 ︙
みたいに「STA $2007」の同じ繰り返しが多くて扱いずらいので、これをループでまとめられないかな?っと。
他にいいやり方があるかもしれないし間違えてるかもしれないけど、とりまやってみる✊
今回使用する命令(オペコード)はこちら。
(黄色いのが今回新たに使用するオペコード)
| オペコード | 機械語 (16進数) |
種類 | 処理内容 |
|---|---|---|---|
| LDA | A9 (数値) AD (番地) |
転送命令 | オペランドをAレジスタに格納 |
| LDX | A2 (数値) AE (番地) |
転送命令 | オペランドをXレジスタに格納 |
| STA | 8D | 転送命令 | Aレジスタの内容をオペランドに格納 |
| TXA | 8A | 転送命令 | Xレジスタの内容をAレジスタに格納 |
| CPX | E0 (数値) EC (番地) |
算術命令 | Xレジスタとオペランドが同じかどうか比較する |
| DEX | CA | 算術命令 | Xレジスタの内容をデクリメント(-1)する |
| INX | E8 | 算術命令 | Xレジスタの内容をインクリメント(+1)する |
| BNE | D0 | 分岐命令 | ゼロフラグが0ならオペランドに移動 |
| BPL | 10 | 分岐命令 | ネガティブフラグが0ならオペランドに移動 |
- オペランド:演算の対象。数値とか番地
- Aレジスタ, Xレジスタ:CPU内部にある記憶素子
- ゼロフラグ:演算結果が0なら1になる
- ネガティブフラグ:演算結果がマイナス(7ビット目が1)の時1になる
- キャリーフラグ:算術命令で桁上がりが起きた時1になる?
同じ処理を繰り返す①
例えば先ほどの例のように、17枚目の背景(16H)を1列分(32枚)表示するコードは、LDX・DEX・BNEを使って次のように書くことができます。
;1行めLDA #$16LDX #32BG1:STA $2007DEXBNE BG1
- Aレジスタに16H(背景17枚目)を格納
- Xレジスタに32を格納
- $2007番地に「66」でAレジスタに格納した背景(背景17枚目)を1枚指定。
- Xレジスタの内容をマイナス1する。(その結果0となったらゼロフラグが1となる)
- ゼロフラグが0なら「68」に戻る。
というふうに「69」を32回実行して17枚目の背景(16H)を1列分(32枚)表示します。
じゃあ「67」でXレジスタに448(32×14)を格納すれば1列目から14列目まで一気に表示できる?と思ったら・・・ Xレジスタは1バイトしかないので最大255(FFH)までしか格納できないみたい![]()
なので例えばこの場合だと、7列(32×7=224)づつに分けたりしなければなりません。
同じ処理を繰り返す②
次に、안녕하세요の上、11枚目の背景を00H~0AHまで順番に表示する部分。
LDA #$00STA $2007LDA #$01STA $2007LDA #$02STA $2007LDA #$03STA $2007LDA #$04STA $2007LDA #$05STA $2007LDA #$06STA $2007LDA #$07STA $2007LDA #$08STA $2007LDA #$09STA $2007LDA #$0ASTA $2007
ここは、LDX・TXA・INX・CPX・BNEを使って次のように書いてみました。
;上段11キャラクター分LDX #$00 ;1つ目の背景(00H)からTOP:TXASTA $2007INXCPX #$0BBNE TOP
- Xレジスタに00H(背景1枚目の番号)を格納
- Xレジスタの内容をAレジスタに格納
- $2007番地にAレジスタに格納した背景を1枚指定。
- Xレジスタの内容をインクリメント(+1)する。
- Xレジスタと0BHが同じかどうか比較する。(同じ場合、ゼロフラグが1となる)
- ゼロフラグが0なら「83」に戻る。
というふうに、00Hから0AHまで1づつカウントアップしながら11枚目の背景を表示します。
実際にソースコードを簡略化してみる。
この2つの方法でソースコードを全体的に簡略化しました。 あと、順番に表示しているのに途中で番地を指定している部分は無駄なので削除しました。(前回のソースコード568~572と622~626)
1160行から129行に簡略化され、スッキリ見渡しやすくなりまし・・た?💦
;##################################################################################################; Famicom Programming "original" ©2023 gocchan.com;##################################################################################################START:LDA $2002BPL START;PPU初期化LDA #%00001000STA $2000LDA #%00000110STA $2001;パレットの設定LDA #$3FSTA $2006LDA #$00STA $2006;背景用パレット1LDA #$0FSTA $2007LDA #$11 ;文字色を$11(青)にSTA $2007LDA #$0FSTA $2007STA $2007;背景用パレット2LDA #$0FSTA $2007STA $2007STA $2007STA $2007;背景用パレット3LDA #$0FSTA $2007STA $2007STA $2007STA $2007;背景用パレット4LDA #$0FSTA $2007STA $2007STA $2007STA $2007;スプライト用パレット1LDA #$29 ;BGの背景色・スプライトの透明色を$29(黄緑)にSTA $2007LDA #$00STA $2007STA $2007STA $2007;背景書き出しLDA #$20STA $2006LDA #$00STA $2006;1-7行めLDA #$16LDX #224 ;32x7BG1:STA $2007DEXBNE BG1;8-15行めLDA #$16LDX #234 ;32x7 + 10BG8:STA $2007DEXBNE BG8;上段11キャラクター分LDX #$00 ;1つ目の背景(00H)からTOP:TXASTA $2007INXCPX #$0BBNE TOPLDA #$16LDX #21 ;10 + 11BGYOHAKU:STA $2007DEXBNE BGYOHAKU;下段11キャラクター分LDX #$0B ;12枚目の背景(0BH)からBOTTOM:TXASTA $2007INXCPX #$16BNE BOTTOM;16-23行めLDA #$16LDX #235 ;11 + 32x7BG17:STA $2007DEXBNE BG17;24-30行めLDA #$16LDX #224 ;32x7BG24:STA $2007DEXBNE BG24;スクロール設定(背景のスクロール座標を0, 0にセット?)LDA #$00STA $2005STA $2005;書き出した内容を画面に表示LDA #%00011110STA $2001
このテキストファイルを「prg.txt」とし、前回と同じようにファミコンエミュレーター用のファイルを作成。問題なく動作する(안녕하세요が表示される)ことが確認出来ました。
※背景の表示が1枚足りていませんでした。プログラム108行目「LDX #234 ;10 + 32x7」➝「LDX #235 ;11 + 32x7」に修正しました。(2023.2.14)
参考文献
魔法使いの森.“ファミコンの画面について”.https://www.wizforest.com/OldGood/ntsc/famicom.html
AnayaSoft.“ファミコンゲーム製作入門(SPECIAL版)“.書籍
ギコ猫でもわかるファミコンプログラミング.“第4章 パレット”.http://gikofami.fc2web.com/nes/nes004.html
NES研究室.“6502”.http://hp.vector.co.jp/authors/VA042397/nes/6502.html
