今度こそ、背景にパレットの指定をして文字の色を変えてみます✊

前回作った「안녕하세요」を表示するプログラム。

今回はこれの「녕」を白に、「세」を茶色に変えてみようと思います。

 

ファミコンの色

ファミコンでは$00~$3Fまでの64色が指定できるみたい。

でも右の方の黒とか灰色とか白とか同じになっちゃって、使える色数的には52色ってことみたい。

いつか実機で自作プログラムが動かせるようになったら全色表示して色見本を作りたいなあ~

 

4色のパレットが背景用4つ、スプライト用4つ。うち色1は全パレットで共通(背景用は背景色・スプライト用は透明色)の1色だから、同時に使える色は3×8+1=25色!なのかな?

こんど、25色同時に表示してみようっと✊

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F

※ YY-CHR pal_nes_nesdev_palette_misaki171204.palの色です。

 

パレットの設定し直し

前回は文字(안녕하세요)を青で表示するため背景用パレット1のみを設定しました。

今回は3色分、3パレット(と背景色設定のためスプライト用パレット1)を設定します。

スプライト用パレット1以外の色1には何を指定しても意味がないんですが、通常は$0Fをセットしておくみたいです。

  色1 色2 色3 色4
背景用パレット1 0F 11 00 00
背景用パレット2 0F 20 00 00
背景用パレット3 0F 17 00 00
背景用パレット4 0F 00 00 00
スプライト用パレット1 29 00 00 00

これに基づいてパレットを設定し直したものがこちら。

	;パレットの設定		LDA	#$3F		STA	$2006		LDA	#$00		STA	$2006
		;背景用パレット1		LDA	#$0F		STA	$2007		LDA	#$11	;文字色を$11(青)に		STA	$2007		LDA	#$00		STA	$2007		STA	$2007
		;背景用パレット2		LDA	#$0F		STA	$2007		LDA	#$20	;文字色を$20(白)に		STA	$2007		LDA	#$00		STA	$2007		STA	$2007
		;背景用パレット3		LDA	#$0F		STA	$2007		LDA	#$17	;文字色を$17(茶)に		STA	$2007		LDA	#$00		STA	$2007		STA	$2007
		;背景用パレット4		LDA	#$0F		STA	$2007		LDA	#$00		STA	$2007		STA	$2007		STA	$2007
		;スプライト用パレット1		LDA	#$29	;BGの背景色・スプライトの透明色を$29(黄緑)に		STA	$2007		LDA	#$00		STA	$2007		STA	$2007		STA	$2007

 

パレット割り当ての書き出し

前々回「背景書き出し」をした時と同じように、画面のどこにどのパレットを割り当てるのかを書き出します。

背景書き出しの時は下の表の各アドレスに対して背景を指定しましたが、
パレットを割り当てる時は赤文字のアドレス(赤い太枠の8×8の範囲)に対して、4×4ブロックづつ、右下・左下・右上・左上の順に背景用パレットを2ビットづつで指定していきます。

 

今回は「녕」(23DBの左下、背景の21CC, 21CD, 21EC, 21ED)にパレット2を、

「세」(23DCの左下、背景の21D0, 21D1, 21F0, 21F1)にパレット3を、

それ以外のアドレスにはパレット1を割り当てるので、下記のようになります。

	;属性テーブル書き出し(パレット割り当て)
		;23C0-23DA		LDA	#$23		STA	$2006		LDA	#$C0		STA	$2006
		LDA	#%00000000	;右下、左下、右上、左上		LDX	#27	;8x3+3Z_C0:		STA	$2007		DEX		BNE	Z_C0
		;23DB		LDA	#%00010000	;右下、左下、右上、左上		STA	$2007
		;23DC		LDA	#%00100000	;右下、左下、右上、左上		STA	$2007
		;23DD-23FF		LDA	#%00000000	;右下、左下、右上、左上		LDX	#35	;3+8x4Z_DD:		STA	$2007		DEX		Z_DD

背景書き出しの時と同じように、$2006番地に開始アドレスを2つに分けて続けて格納するとパレット割り当て書き出し準備完了。

あとは$2007番地に表示する背景を指定していきます。

 

いちおう全文載せときますパー

;##################################################################################################;		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	#$00		STA	$2007		STA	$2007
		;背景用パレット2		LDA	#$0F		STA	$2007		LDA	#$20	;文字色を$20(白)に		STA	$2007		LDA	#$00		STA	$2007		STA	$2007
		;背景用パレット3		LDA	#$0F		STA	$2007		LDA	#$17	;文字色を$17(茶)に		STA	$2007		LDA	#$00		STA	$2007		STA	$2007
		;背景用パレット4		LDA	#$0F		STA	$2007		LDA	#$00		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
	;属性テーブル書き出し(パレット割り当て)
		;23C0-23DA		LDA	#$23		STA	$2006		LDA	#$C0		STA	$2006
		LDA	#%00000000	;右下、左下、右上、左上		LDX	#27	;8x3+3Z_C0:		STA	$2007		DEX		BNE	Z_C0
		;23DB		LDA	#%00010000	;右下、左下、右上、左上		STA	$2007
		;23DC		LDA	#%00100000	;右下、左下、右上、左上		STA	$2007
		;23DD-23FF		LDA	#%00000000	;右下、左下、右上、左上		LDX	#35	;3+8x4Z_DD:		STA	$2007		DEX		Z_DD
	;スクロール設定(背景のスクロール座標を0,0にセット?)		LDA	#$00		STA	$2005		STA	$2005
	;書き出した内容を画面に表示		LDA	#%00011110		STA	$2001

 

で、例の手順でアセンブル➝テキストファイル結合➝バイナリ化してエミュレーターで実行。

思った通り色を変更することが出来ました。

 

参考文献

魔法使いの森.“ファミコンの画面について”.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

 

フォローしてね!