• 裏で新しい背景を描きながら画面スクロールします。
  • SetPPUにてflag1の2bit目を1(32bitインクリメント)にして背景を縦一列に出力しています。
  • .asmを$01=Vertical Mirrorにしておきましょう。
  • その他は基本縦スクロールの処理と同じですが、背景を書き換えている様子が見切れるのを防ぐため、スクロールよりも8ドット遅れて背景を書き換えるように変更を加えています。
#include <kihon.h>
 
char init;
 
//NMI割り込み
void NMIProc(void)
{
	static unsigned char bgx,no,mode,wno[2],scr,amari,flg;
	unsigned char pos[2],x[2];
 
	if (init) {
		bgx=0;
		no=2;
		mode=1;
		scr=0;
		init=0;
		flg=0;
	}
 
	amari = bgx % 8;
 
	if (bgx==8) {
		flg=1;
		if (mode) {
			scr=0;
		} else {
			scr=2;
		}
	}
 
	if (amari == 1) {
		x[1] = x[0];
		x[0] = bgx / 8;
		wno[1] = wno[0];
		wno[0] = no + 48;
	} else if (amari > 0 && flg) {
		GetBackgroundAddress(scr, x[1], (amari - 2) * 5 , pos);
		FillBackground(*(pos + 0),*(pos + 1) ,wno[1],5);
	}
 
	if (bgx==255) {
		no++;
		mode^=1;
	}
 
	bgx++;
 
	if (mode) {
		SetPPU(0x8c,0x1e);
	} else {
		SetPPU(0x8d,0x1e);
	}
 
	SetScroll(bgx,0);
 
	if (no > 9) { no=1; }
}
 
// メイン処理
void NesMain()
{
	unsigned char i,j,pos[2];
	const char bgpalette[] = {
		0x0f, 0x21, 0x11, 0x20, 0x0f, 0x21, 0x11, 0x20,
		0x0f, 0x21, 0x11, 0x20, 0x0f, 0x21, 0x11, 0x20 };
	const char sppalette[] = {
		0x0f, 0x0a, 0x37, 0x20, 0x0f, 0x0a, 0x25, 0x20,
		0x0f, 0x0a, 0x11, 0x20, 0x0f, 0x0a, 0x2a, 0x20 };
 
	VBlank();
	InitPPU();
 
	init = 1;
 
	// パレット設定
	SetPalette((char *)bgpalette ,0);
	SetPalette((char *)sppalette, 1);
 
	for (j = 0; j < 2; j++)
	{
		for (i = 0; i < 30; i++)
		{
			GetBackgroundAddress(j * 2, 0, i, pos);
			FillBackground(*(pos + 0), *(pos + 1), 48 + j, 32);
		}
	}
 
	SetPPU(0x8c,0x1e);
 
	while (1);
}