RAM テストソース

static bool ram_fill(uint32_t *ram, int size, uint32_t d)
{
	uint32_t *r = ram;
	int s = size;
	while(s != 0){
		*r++ = d;
		*r++ = d;
		*r++ = d;
		*r++ = d;
		s -= 4;
	}
	while(size != 0){
		int result;
		result = *ram++ == d;
		result &= *ram++ == d;
		result &= *ram++ == d;
		result &= *ram++ == d;
		if(result == 0){
			return false;
		}
		size -= 4;
	}
	return true;
}

4 long word 単位でループをまわす。最初のループが書き込みで、次のループが読み込みと比較とポインタインクリメントをやる。なんとなく書いてみたんだが、 &= と *++ と == を同時に書くというのはあまりない気がする。

アセンブラ出力を見たら書き込みは move.l %d1,%a0@+ で、読み込みは cmp.l %a1@+,%d1 をやってるんだが、result は and で取らずに最適化しててよくわからなかった。

アドレス線がおかしくなってないか、上位アドレスだけ書いてみるソースも一応書いてこっちでもエラーは出なかったので 4M byte の増量ができたと思われる。

bool ramtest_mirror(uint8_t *ram)
{
	int i;
	uint8_t d = 0x00;
	ram += 0x1aaa;
	uint8_t *r = ram;
	for(i = 0; i < 0x40; i++){
		*r = d;
		r[3] = d ^ 0xff;
		r += 0x10000;
		d += 1;
	}
	int result = 1;
	d = 0x00;
	for(i = 0; i < 0x40; i++){
		result &= *ram == d;
		result &= ram[3] == (d ^ 0xff);
		ram += 0x10000;
		d += 0x01;
	}
	return result == 0 ? false : true;
}

4M byte 増量したのはいいんだが、8bit 系統の program data や PCM sample ROM に割り当てたいのでそっち向けのゲートも作らねばならぬ。(めんどい)