あーさん日記

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

libmy

自分のライブラリでCpuFastSet使っているのですけどなんでメモリ転送にDMA使っていなんだ?と思って調べてみました。結果はtonc先生が教えてくれたのですけれど当時こういうことを考慮していたかというと全く記憶にございません(爆。DMAでバグったからCpuFastSetを使った・・・?。ま、まあ気にしないで作業に戻ります。以下google翻訳です。

Tonc: DMA
14.3.2. DMA; 消耗しないでください

DMA が高速であることには疑問の余地がありません。 配列のコピーよりも最大 10 倍高速になります。 ただし、すべてのコピーにこれを使用するかどうかはよく考えてください。 高速ではありますが、他のすべての転送ルーチンを完全に吹き飛ばすわけではありません。 CpuFastSet() はコピーの場合は 10% 以内で、フィルの場合は実際に 10% 高速です。 速度の向上はそれほど大きな問題ではありません。 もう 1 つの問題は、CPU を停止させることで割り込みが台無しになり、一見ランダムなバグが発生する可能性があることです。 通常、タイマーや割り込みと組み合わせて使用する特定の用途がありますが、一般的なコピーの場合は、他のことも考慮することをお勧めします。 CpuFastSet() は優れたルーチンですが、tonclib には、それより安全で制限の少ない memcpy16()/32() および memset16()/32() ルーチンも付属しています。 ただし、これらはアセンブリ ルーチンであるため、ライブラリのアセンブル方法や使用方法を知る必要があります。


うーんbiosかtoncかagbapiのmemcpyを使う方が安全かもしれません。butanoライブラリの方もクラッシュしたと報告しているので間違いないでしょう。
github.com