pcmfilelist.dat覚え書き

mdxonline213.cfg内の設定BasePath以下にpcmfilelist.dat.szipを追加しただけですので、以前のバージョンのままでも問題ありません。
実際には、http://moonlight.servehttp.com:11080/mdxonline213/pcmfilelist.dat.szipになります。

ファイルフォーマット

pos type info
  0 word 内包するファイル名数

ヘッダ終わり。マジックコードはありません。
以下ファイル名が続きます。

pos type info
  0 byte MXDRV用PDXなら0、FMP/PMD用PCMなら1が入ります。2以降は無視するようにして下さい。
  1 byte ファイル名文字列の長さ。1文字なら1が、10文字なら10が入ります。
  2 str  ファイル名文字列

フッタはありません。

元々無いPDXファイルをリクエストしないようにすることでレスポンスの向上がある、というのが私の思う実装理由ですが、これにより、MDX内指定12345678.pdxで、サーバーに123456789.pdxを要求できるようになると思います。余りないのですがMXDRVの実装（というかHuman68kの仕様）として有効らしいので。
あ、それから大文字小文字漢字が入り乱れていますのでご注意下さいませ。

Delphiで実際に使っている読み込みコード

var
  MXDRVPDXFileList,FMPMDPCMFileList:TStringList;

procedure TNetwork.LoadPCMFileList;
var
  fname:string;
  fs:TFileStream;
  cnt,Count:integer;
  mode:byte;
begin
  MXDRVPDXFileList.Clear;
  FMPMDPCMFileList.Clear;

  fname:=CFG.PCMFileListFilename;
  if FileExists(fname)=False then exit;

  fs:=TFileStream.Create(fname,fmOpenRead or fmShareDenyWrite);
  Count:=GetStreamWord(fs);
  for cnt:=0 to Count-1 do begin
    mode:=GetStreamByte(fs);
    case mode of
      0: MXDRVPDXFileList.Add(GetStreamMString(fs));
      1: FMPMDPCMFileList.Add(GetStreamMString(fs));
    end;
  end;
  fs.Free;
end;

おまけ。Delphiで実際に使っている書き込みコード

procedure TMain.CreatePCMFile;
var
  path:string;
  FileLstCount:integer;
  cnt:integer;
  fs:TFileStream;
  res:integer;
  procedure LoadFiles(path:string;mode:byte);
  var
    res:integer;
    SearchRec: TSearchRec;
  begin
    res:=FindFirst(path, (faReadOnly or faHidden or faSysFile or faArchive), SearchRec);
    if res=0 then begin
      repeat
        if (SearchRec.Attr and faDirectory)=0 then begin
          inc(FileLstCount);
          SetStreamByte(fs,mode);
          SetStreamMString(fs,copy(SearchRec.Name,1,length(SearchRec.Name)-5));
        end;
        res:=FindNext(SearchRec);
      until (res<>0);
    end;
    FindClose(SearchRec);
  end;
begin
  LoadPCMFileTimer.Enabled:=False;

  path:=SeekPathEdt.Text;

  FileLstCount:=0;
  fs:=TFileStream.Create(path+'pcmfilelist.dat',fmCreate or fmShareDenyWrite);
  SetStreamWord(fs,FileLstCount);
  LoadFiles(path+'MXDRV_PDX\*.szip',0);
  LoadFiles(path+'FMPPMD_PCM\*.szip',1);
  fs.Position:=0;
  SetStreamWord(fs,FileLstCount);
  fs.Free;

  res:=SZipCompress(path+'pcmfilelist.dat',path+'pcmfilelist.dat.szip');
  if res<>0 then ShowMessage(inttostr(res)+' CatalogPCMFileListCompressFailed pcmfilelist.dat');
end;

汚いなぁ（汗）
