"Ootake" Nonsupport BBS ノンサポート掲示板 管理:ソフト開発グループ「Finath(ファイナス)」

現在までに、10668人の方が、この書き込みをご覧になっています。

17/08/20(日)16:54 ひろ
Games Express CDについて

はじめまして

Hi-Leg Fantasy (J)の動作について
CDROM.cppの中の
CDROM_Read関数でPORT[0]のリードの際に
SIGNAL_REQを操作することで起動できるようです。

CDROM.cpp 3594行付近を
if( _bCdReqWait ){
  _bCdReqWait=FALSE;
  return _Port[0] & ~SIGNAL_REQ;
}
else {
  return _Port[0] | SIGNAL_REQ; //Ready
}
3659行付近を
_bCdReqWait = TRUE;
return read_1808();

Ootake Ver.2.82にて確認しました。


17/08/24(木)12:59 ひろ
Re)Games Express CDについて

Games Express CDのソフトではFF:180Dアドレスのwrite時に
bit2,bit3が同時に'1'になっている場合があるようです。

その場合はADPCM_SetReadAddr関数を呼ぶのですが、
_ReadBufferは1とするのが正しいようです。

下記の変更で"CD Mahjong Bishoujo Chuushinha (J)"の
起動を確認しました。

CDROM.cppの中のCDROM_Write関数
3445行付近を
if (data & 0x08)
 ADPCM_SetReadAddr((data&0x04)==0x04);

ADPCM.cppの中のADPCM_SetReadAddr関数
void
ADPCM_SetReadAddr(bool flag)
{
 _ReadAddr = _Addr;
 if(flag) _ReadBuffer = 1; //空読み1回
 else _ReadBuffer = 2; //空読み2回
}

以上です


17/08/26(土)07:34 Ootake作者
Re)v2.83近日公開できます!

こんにちは。

おかげさまで、ゲームエクスプレスCDカード対応ソフトの動作、こちらでも確認でき
ました!(めっちゃ感動です)

ただ、_bCdReqWaitでTRUEかFALSEかだけで判断すると通常のシステムカード対応ゲー
ムのいくつか(伊賀忍伝凱王,サイキックストーム等)が起動できないことがありま
した。

なので、read_1808()を呼んでから「充分に時間が経った場合」はウェイトが入らな
いように実装(read_1808()からすぐ_Port[0]を読んだ場合だけウェイトを入れる)
してうまく行きました。たぶん実機も同様の動きだと思います。

CD麻雀も教えて頂いた実装でうまくいきました。

結構大きな変更ですので、まだ他のゲームでの影響を1日か半日みっちりテストし
て、v2.83公開したいと思います。

どうせ大きな動作テストするならば、自分も何か実装してからがいいなと思い、つ
いでに割り込み関連の処理を見直して、「マンホール」と「クレイジーホスピタル」
が正常に動くようになりました。とりあえず今日の夜までテストです。

本当に助かりました。ありがとうございます。


17/08/26(土)10:49 ひろ
Re)Games Express CDについて

ご確認頂き有難うございます。

_bCdReqWaitのタイミングについては、実機の動作を見ると
下記の様になっているようでした。

待ち時間の参考にして頂ければと思います。

セクタリードの場合は、
CDから連続的に150kByte/秒でデータを読み出していて
1セクタ分(2048BYTE)データが準備できるとSIGNAL_REQを1にして
CPUが1セクタ読み込むとSIGNAL_REQを0としているようです。

SIGNAL_REQが0になる時間としては
(13.3m秒)−(CPUの読み出しに掛かった時間)
となって
(CPUの読み出しに掛かった時間)が13.3m秒を超えると200m秒程度
になっているようです。


17/08/26(土)11:41 ひろ
Re)Games Express CDについて

度々申し訳ないのですが

Port[0]に関してもう一点気になるところがあります。
Steam Heart's (J)のBGMに関連していそうな感じです。

receive_command関数の
 if (data == 0x81) の中に
  _AudioTrack.bInterrupt = FALSE; //<-追加願います。

read_1801()関数の
// _Port[0] &= ~SIGNAL_BUSY; //BUSYを解除
  _Port[0] =0; //<-変更願います


CDROM_Read関数
 case 0x0:
//下記の追加をお願いします。
  if(_AudioTrack.bInterrupt){
   //CMD 0xd9 mode 2の場合は再生終了までコマンド続行
   return SIGNAL_BUSY | SIGNAL_CD;
  }

  しばらく後の”case 1”手前を下記に変更願います。

  if( _bCdReqWait ||
   (_CheckCountAfterRead==0&&_ReadByteCount==0&&_bCommandReset==0&&_ArgsLeft==0) )
  {
   if(_bCdReqWait)_bCdReqWait=FALSE;
   return _Port[0] & ~SIGNAL_REQ;
  }
  else {
   return _Port[0] | SIGNAL_REQ; //Ready
  }

Steam Heart's (J)のBGM再生箇所でPort[0]に0を返すと
CD再生コマンドが再発行されます。

しかし、単に0を返すと再生開始後に直ぐに同じコマンドがまた来てしますので、
ブロックしています。

つい先ほど気づいたので、まだよくわからないですが、
可能であればこちらも対応していただけないでしょうか?

また、他の部分の影響を調べています。
再度こちらの掲示板にご連絡いたします。


17/08/26(土)12:59 ひろ
Re)Games Express CDについて

こんにちは

先程の件ですが、
すでに_AudioTrack.playMode = 2で処理はされている様でした。
ソースを読み間違えました。すみません。

_bDriveBusyの際に返す値とCD-ROMに対してのコマンド非実行時の値を
変更することでBGMが再生されました。

この状態でほかのゲームを動かしてみます。

変更としては下記の様にしました。

read_1801()関数の
// _Port[0] &= ~SIGNAL_BUSY; //BUSYを解除
  _Port[0] =0; //<-変更願います


CDROM_Read関数
 case 0x0:の先の

  else if (_bDriveBusy)
  {
//  return _Port[0] | SIGNAL_BUSY;
   return SIGNAL_BUSY | SIGNAL_CD;//<-変更願います
  }

  しばらく後の”case 1”手前を下記に変更願います。

  if( _bCdReqWait ||
   (_CheckCountAfterRead==0&&_ReadByteCount==0&&_bCommandReset==0&&_ArgsLeft==0) )
  {
   if(_bCdReqWait)_bCdReqWait=FALSE;
   return _Port[0] & ~SIGNAL_REQ;
  }
  else {
   return _Port[0] | SIGNAL_REQ; //Ready
  }


17/08/26(土)15:15 ひろ
Re)Games Express CDについて

こんにちは

REQのウェイトの件ですが
1セクタ毎にREQを0にすることで
他のソフトも動作するようです。

CDROM_Read関数 case 0:の最後の
return _Port[0] | SIGNAL_REQ; //Ready
部分を下記に変えることで時間待ちの処理が無くても良いようです。

 if(_CheckCountAfterRead==0&&_ReadByteCount==0&&
   _bCommandReset==0&&_ArgsLeft==0)
 {
  //$1801の$81書き込みから_CheckCountAfterRead==1の
  //$1801読み込みまではSIGNAL_REQは0とする。
  ret = _Port[0] & ~SIGNAL_REQ;
 }

 if(_bCdReqWait && (_ReadByteCount%2048)==0 )
 {
  //1Sector読み出し毎に1回SIGNAL_REQは0とする。
  ret = _Port[0] & ~SIGNAL_REQ;
 }
 else
 {
  ret = _Port[0] | SIGNAL_REQ; //Ready
 }
 _bCdReqWait=FALSE;
 return(ret);


17/08/27(日)07:59 Ootake作者
Re)スチームハーツもOK

こんにちは。

まだテスト不足ですが、おかげでスチームハーツのBGMがバッチリ鳴りました!

もう少し動作テストしてv2.83を公開できると思います。

ゲームエクスプレスCDとスチームハーツ。待ってくれていたユーザーの方もきっと嬉し
いと思います。ありがとうございます。


17/08/27(日)08:06 Ootake作者
Re)スチームハーツ

それから、スチームハーツで修正もう一つできました。

デフォルトのCDアクセスが速いままだと、1面のBGMが早く終了してしまってリピート
してしまうので、v2.83では自動でCD-DAトラックへのアクセス時に実機並のウェイトを
入れることで、実機同様の動作(BGMが1ループだけでちょうど終わる)になりました。


17/08/27(日)18:55 ひろ
Re)スチームハーツ

こんばんは

早急に対応していただきありがとうございます。

今更ですが、17/08/26(土)15:15の書き込みの
>if(_bCdReqWait && (_ReadByteCount%2048)==0 )

else if(_bCdReqWait && (_ReadByteCount%2048)==0 )
の間違いです。


Ootake作者>こちらこそありがとうございます![08/28(月)08:10 Mail

17/08/31(木)06:39 ひろ
Re)ソフトによっては問題がありました。

おはようございます

PLAY AUDIO2 MODE2の修正でバグを入れてます。
すみません。

下記の追加をお願いします。

CDROM_AdvanceClock関数

if (_CDDAReadByteCount == 0)

if (_AudioTrack.playMode == 2)
{
 _bDriveBusy = FALSE;// 追加願います


メッセージ一覧へ戻る

Copyright(C)1997-2007 Kitao Nakamura.