
        午後のこ〜だ(コンソール版/Win DLL)の作り方

                                                updated '00/1/25
 ◆ 概要

   ここではTownsOS, Linux, FreeBSD, Windows-console, BeOS, OS/2での
   午後のこ〜だの作り方や注意点を説明します。
   Solaris for x86でも作れたそうです。cygwinでも出来たとか。

 ◆ 必要なもの

   NASM-0.98以降が必要です。各自入手してください。
   >http://www.web-sites.co.uk/nasm/

   MASM系アセンブラ(386asm, tasm, lasm等)では文法が違うためアセンブル
   出来ません。また、UNIX系のgasでもアセンブル出来ません。

 ◆ グローバルな定義

   (1) DONT_USE_KANJIを定義するとメッセージが英語になります。
       定義しないと日本語メッセージになります。
       ファイル名に日本語(SJIS)を使う人は定義しないで下さい。
       ( `\' の処理をしなくなるため )

   (2) DUSE_E3DNを定義するとAthlon用Enhanced 3D Now!命令を使います。

   但し、NASMにパッチを当てる必要があります。
   あるいは
   http://www.kurims.kyoto-u.ac.jp/~shigeo/soft/3dnow18.lzh
   を取ってきて
   % lha x 3dnow18.lzh
   % gcc -DONLY_E3DN *.c
   % ./a.out mdct3dn.nas
   % mv -f mdct3dn.asm mdct3dn.nas
   の様にしてEnhanced 3D Now!命令のみを事前にアセンブルして下さい。

   (3) USE_VBR, LAME355を定義するとVBRを使えるようになります。

   但し、元にしたのがlame3.28betaなため音質はあまり期待できないようです。
   今後のバージョンアップに期待(本当か?)
   #現在lame3.55betaのVBRを接ぎ木しました。多少は音質良くなったかも。

   (4) RAW_INPUTを定義するとwavファイル以外のPCMデータ対応オプションが
   使えるようになります。

   (5) USE_{PTHREAD, WINTHREAD, BTHREAD, OS2THREAD}を定義すると
   並列CPU対応になります。
   FreeBSDやLinux libc5, Win 95/98では使えない、またライブラリも
   マルチスレッド対応のを使う必要があります。各自修正してください。

 ◆ 各OSについて

   (1) Windows-console

   ソースのwinディレクトリの中身をソースと同じディレクトリに移してください。
   VC++の場合、添加のgogo.dswをプロジェクトを選んでから
   [アクティプな構成の設定]で{console,DLL}-Releaseを選択してください。
   他のCコンパイラでは
   *.nasに対して

   [コマンド] nasm -f win32 -DWIN32 $(InputName).nas
   [出力]     $(InputName).obj

   に相当する設定をしてください。その後普通にビルドするだけです。

   Cで定義されていると仮定するマクロはWIN32, _CONSOLEです。

   VC++以外でのDLLの作り方はどなたかお願いします。
   Borland C++を使うときは nasm -f obj -DWIN32 -D__BORLANDC__ *.nas
   として下さい。
   cygwin-gccでも同様(?)

   Watcom-C/C++ 10.5J の場合 ( savaさんに感謝! )

   TGT_ENV のうちどれかひとつを有効にして、コマンドライン上から
   wmake -f makefile.wc
   を実行。環境変数 WATCOM を正しく設定しておく必要がある。

    現状での制限
    マルチスレッド版は作成できない。
    （Watcom-C/C++ 10.5J のライブラリが、gettimeofday
      をサポートしていないため。 11.0 については未確認）
   
   (2) Linux, FreeBSD 3.x, FreeBSD 2.x, NetBSD

   makefile.unxをMakefileという名前でコピーしてください。
   コンパイラに egcs を使用する場合はMakefileを適宜編集してください。

   先頭付近に egcs 使用例をコメントアウトしてあります。
   MT版は現在Linux libc6とBeOSで対応しています。
   使用する場合はUSE_MTを有効にして下さい。
   Cで定義されていると仮定するマクロは__unix__です。

   FreeBSD 2.x系、NetBSD/i386でもmake出来るそうです。
   CC に -D__unix__ を追加する。(FreeBSDでは不要かも)
   ASFLAGS = -f aoutb -D__unix__ -DAOUT
   .nas.o: $(AS) $(ASFLAGS) $< -o $@
   と変更する。( 原田さん情報ありがとうございます。 )

   またgogo.specを使って
   % rpm -ta --clean gogo224a.tgz
   で RPM ファイルを作成できます。

   (3) TownsOSの場合

   makefile.tosをmakefileという名前でコピーしてから、
   makefileの先頭のpathの設定を各自の環境に合うよう変えて下さい。
   makeはLSI-C試食版のを想定しています。
   MamiyaさんがPharLap簡易OMF-386objフォーマットに対応したEXP版を
   作ってくださっています (http://www.proc.org.tohoku.ac.jp/befis/)
   そのNASMを使う時は-f objではなく-f pharlapとしてください。
   Cで定義されていると仮定するマクロは__HIGHC__です。

   (4) BeOS

   ソースのBeOSディレクトリの中のMakeGOGO.shをシェル上から実行してください。
   実行ファイル`gogo'が出来ますのでシンボリックリンク`drop gogo here'に
   コピーしてください。

   (5) OS/2

   make -f makefile.os2
   で多分いけると思います。SMP対応です。Samuel Audetさんに感謝。

   ◆ 大雑把な構成
 
   musui.c      起動時のオプション解析 & 設定
   musenc.c     メインループ(Win DLL版と共有)
   readsmpl.c   PCMデータ入力
   formatbs.c等 MP3データ出力
   haveunit.nas CPU判別(setup.cで分岐)
   quantize.nas 量子化など(loop.cのasm化)
   sband*.nas   バンド枠処理(encode.cのasm化)
   fft*.nas     FFT関連(subs.cのasm化)
   mdct*.nas    MDCT関連(mdct.cのasm化)
   huffmana.nas Huffman圧縮
   等々

 ◆その他

   ソースに関する質問や改良方法、バグ報告などありましたら、掲示板又は
   メールでお願いします。

   shigeo@kurims.kyoto-u.ac.jp, http://www.kurims.kyoto-u.ac.jp/~shigeo/
