あーさん日記

https://akkera102.sakura.ne.jp/gbadev/ の中の人

リハビリ14

flash対応完了。実機動作も確認しました。
以下の関数でsramかどうか判定しています。

EWRAM_CODE bool BakIsFlash(void)
{
	u8 t1 = BakRead2(0x7FFF);
	u8 t2 = ~t1;

	BakWrite2(0x7FFF, t2);
	BakWrite2(0x7FFF, t2+1); // もう一度書き込む(flash erase済みの可能性もあるので)

	if(BakRead2(0x7FFF) == t2+1)
	{
		BakWrite2(0x7FFF, t1);

		return FALSE;
	}

	return TRUE;
}

flashはセクタ削除や書き込むにウェイト使うのでちょっとプチフリします。

リハビリ12

セーブ機能の前に、後回ししていたエフェクト処理を追加しました。
・・・作業としてはこんな感じです。


1.ゲームをキャプチャ録画してフレーム単位で動作を見てみる。
2.変化しているドットを色分けする。1フレーム目は黒、2フレーム目はオレンジ、3フレーム目は緑(以下略。
f:id:akkera102:20181031001834p:plain
3.エフェクト用のコードに落とす。

IWRAM_CODE void Mode3DrawFadeMask(s32 step)
{
	const s32 sx[8] = { 0, 2, 1, 3, 1, 3, 0, 2 };
	const s32 sy[8] = { 0, 0, 1, 1, 0, 0, 1, 1 };

	s32 x, y;

	for(y=0; y<SCREEN_CY; y+=4)
	{
		u16* s1 = Mode3.buf  + sx[step] + (y + sy[step]) * SCREEN_CX;
		u16* d1 = (u16*)VRAM + sx[step] + (y + sy[step]) * SCREEN_CX;

		u16* s2 = s1 + 2 + SCREEN_CX * 2;
		u16* d2 = d1 + 2 + SCREEN_CX * 2;

		for(x=0; x<SCREEN_CX; x+=4)
		{
			*d1 = *s1;
			s1 += 4;
			d1 += 4;

			*d2 = *s2;
			s2 += 4;
			d2 += 4;
		}
	}
}

4.動作確認のため、VBAをキャプチャ録画。
f:id:akkera102:20181031002051p:plain
5.最後にVCOUNTを測定して画面がちらつかないか調べる。
今回は167->217なので大丈夫でした。


正直いって地味作業すぎますね・・・。(^^;

リハビリ11

この書き方まずいような気もしないでもなく。
別案が浮かんだら書き換えよう。。

EWRAM_CODE char* SioriGetStr(u32 no)
{
	if(SioriIsItem(no) == FALSE)
	{
		return "-----------";
	}

	SramSeek(0x1000 + 0x1000 * no + 2 + sizeof(ST_NV) + sizeof(ST_TEXT) - TEXT_SIORI_SIZE);

	return (char*)SramGetPointer();
}