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 に割り当てたいのでそっち向けのゲートも作らねばならぬ。(めんどい)