mxdrvgを64ビット化

MDXPlayer for iOSをいじっていますが、mxdrvgの制約で64ビット化できないとのことです。

mxdrv.h, mxdrv_core.hをみてみると、ポインタはポインタとして宣言されていますし、大体なんとかなりそうですがこんなところがあります:

static void L000788(
  void
) {

// L000788:;
/*
  move.l  a0,(L001e28)
  move.w  (a0),(L001e22)
  movea.l $0002(a0),a1
  move.l  (a1),(L00221c)
  addq.w  #4,a1
  move.w  (a1),d0
  not.w   d0
  move.w  $0002(a1),d1
  not.w   d1
  move.b  d0,(L002230)
  move.b  d1,(L002231)
  move.l  a1,(L002218)
  clr.w   (L001e1c)
  bra     L0007c0
*/
	G.L001e28 = A0;
	G.L001e22 = GETBWORD( A0 );
	A1 = (UBYTE *)GETBLONG( A0+2 );
	G.L00221c = (UBYTE *)GETBLONG( A1 );

最後の2行は完全にアウトです。
またpcm8.cppには

int Pcm8::DmaArrayChainSetNextMtcMar() {
	if ( DmaBtc == 0 ) {
		return 1;
	}
	--DmaBtc;

	int mem0,mem1,mem2,mem3,mem4,mem5;
	mem0 = MemRead((unsigned char *)DmaBar++);
	mem1 = MemRead((unsigned char *)DmaBar++);
	mem2 = MemRead((unsigned char *)DmaBar++);
	mem3 = MemRead((unsigned char *)DmaBar++);
	mem4 = MemRead((unsigned char *)DmaBar++);
	mem5 = MemRead((unsigned char *)DmaBar++);
	if ((mem0|mem1|mem2|mem3|mem4|mem5) == -1) {
		return 1;
	} 
	DmaMar = (volatile unsigned char *)((mem0<<24)|(mem1<<16)|(mem2<<8)|(mem3));  // MAR

最後の1行もダメですね。それでも直せるところだけ直してみて、これらのまずいところにはブレークポイントを設定してその時に考えよう、としてみたところ・・・ブレークポイントには到達することなく曲が再生されます。(・・?

私はMDXファイルの知識が殆ど無いですが、上のケースはMXDRVG_Contコマンドで呼ばれるルーチンですがMDXPlayer for iOSではMXDRVG_Contコマンドは使っていないようです。なので大丈夫なのかもしれません。もう一箇所も同様です。

下のケースはADPCMへのDMAが連鎖するときのようですが・・・やはりそのような使い方は殆ど行われないということで良いのでしょうか。

とりあえずGitHubには変更を上げておきました。コンパイル時にワーニングが出るところは、上記のように本来大問題となるところです。

もう少しいろんな曲を聞いてみて不具合がないか確かめてみます。あと、明らかにおかしいところに来た時には再生を中止するようにしたほうが安全かもしれません。

コメントを残す