背景にパレットの指定をして文字の色を変えてみる・・・っと、その前に💦

 

ソースコードを簡略化

前回アセンブリ言語で書いたソースコードは1160行・・・

		;1行め		LDA	#$16		STA	$2007		STA	$2007		STA	$2007		STA	$2007		STA	$2007		STA	$2007		STA	$2007		STA	$2007		STA	$2007		STA	$2007		STA	$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	#$16		LDX	#32BG1:		STA	$2007		DEX		BNE BG1
  1. Aレジスタに16H(背景17枚目)を格納
  2. Xレジスタに32を格納
  3.  
  4. $2007番地に「66」でAレジスタに格納した背景(背景17枚目)を1枚指定。
  5. Xレジスタの内容をマイナス1する。(その結果0となったらゼロフラグが1となる)
  6. ゼロフラグが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	#$00		STA	$2007		LDA	#$01		STA	$2007		LDA	#$02		STA	$2007		LDA	#$03		STA	$2007		LDA	#$04		STA	$2007		LDA	#$05		STA	$2007		LDA	#$06		STA	$2007		LDA	#$07		STA	$2007		LDA	#$08		STA	$2007		LDA	#$09		STA	$2007		LDA	#$0A		STA	$2007

 

ここは、LDX・TXA・INX・CPX・BNEを使って次のように書いてみました。

		;上段11キャラクター分		LDX	#$00	;1つ目の背景(00H)からTOP:		TXA		STA	$2007		INX		CPX	#$0B		BNE	TOP
  1. Xレジスタに00H(背景1枚目の番号)を格納
  2.  
  3. Xレジスタの内容をAレジスタに格納
  4. $2007番地にAレジスタに格納した背景を1枚指定。
  5. Xレジスタの内容をインクリメント(+1)する。
  6. Xレジスタと0BHが同じかどうか比較する。(同じ場合、ゼロフラグが1となる)
  7. ゼロフラグが0なら「83」に戻る。

というふうに、00Hから0AHまで1づつカウントアップしながら11枚目の背景を表示します。

実際にソースコードを簡略化してみる。

この2つの方法でソースコードを全体的に簡略化しました。 あと、順番に表示しているのに途中で番地を指定している部分は無駄なので削除しました。(前回のソースコード568572622626

 

1160行から129行に簡略化され、スッキリ見渡しやすくなりまし・・た?💦

;##################################################################################################;		Famicom Programming "original"	©2023 gocchan.com;##################################################################################################
START:		LDA	$2002		BPL	START
	;PPU初期化		LDA	#%00001000		STA	$2000		LDA	#%00000110		STA	$2001
	;パレットの設定		LDA	#$3F		STA	$2006		LDA	#$00		STA	$2006
		;背景用パレット1		LDA	#$0F		STA	$2007		LDA	#$11	;文字色を$11(青)に		STA	$2007		LDA	#$0F		STA	$2007		STA	$2007
		;背景用パレット2		LDA	#$0F		STA	$2007		STA	$2007		STA	$2007		STA	$2007
		;背景用パレット3		LDA	#$0F		STA	$2007		STA	$2007		STA	$2007		STA	$2007
		;背景用パレット4		LDA	#$0F		STA	$2007		STA	$2007		STA	$2007		STA	$2007
		;スプライト用パレット1		LDA	#$29	;BGの背景色・スプライトの透明色を$29(黄緑)に		STA	$2007		LDA	#$00		STA	$2007		STA	$2007		STA	$2007
	;背景書き出し		LDA	#$20		STA	$2006		LDA	#$00		STA	$2006
		;1-7行め		LDA	#$16		LDX	#224	;32x7BG1:		STA $2007		DEX		BNE BG1
		;8-15行め		LDA	#$16		LDX	#234	;32x7 + 10BG8:		STA	$2007		DEX		BNE	BG8
		;上段11キャラクター分		LDX	#$00	;1つ目の背景(00H)からTOP:		TXA		STA	$2007		INX		CPX	#$0B		BNE	TOP
		LDA	#$16		LDX	#21	;10 + 11BGYOHAKU:		STA $2007		DEX		BNE BGYOHAKU
		;下段11キャラクター分		LDX	#$0B	;12枚目の背景(0BH)からBOTTOM:		TXA		STA	$2007		INX		CPX	#$16		BNE	BOTTOM
		;16-23行め		LDA	#$16		LDX	#235	;11 + 32x7BG17:		STA	$2007		DEX		BNE	BG17
		;24-30行め		LDA	#$16		LDX	#224	;32x7BG24:		STA	$2007		DEX		BNE	BG24
	;スクロール設定(背景のスクロール座標を0, 0にセット?)		LDA	#$00		STA	$2005		STA	$2005
	;書き出した内容を画面に表示		LDA	#%00011110		STA	$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

 

フォローしてね!