
	◇＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝◇

		　　　MSX マッパメモリ対応　PCMプレーヤー

			   Mapper memory PCM player  

			　  　MPCM.COM　ver 1.07
						　  	 ｂｙ にが
	◇＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝◇


■　はじめに

	MSXでPCM再生といえば、PSGやFM音源、SCC、1ビットサウンドに至るまで
	様々な試みがなされてきましたが、あまり音質のよいものではありません
	でした。

	今回マッパメモリと8bit DAC搭載ゲームを利用して、Z80で奏でるPCM
	サウンドの限界に挑んでみました。16MBのメモリがあれば、44kHz 8bit
	モノラルでおよそ6分間の再生ができます。 


■　ver 1.00 -> 1.04 に伴う変更点

	・セカンダリマッパメモリの拡張スロット切り替えに失敗するバグをFIX
	・WAIT方式を変更し、A1-WX1.5倍速、8bit 48kHzのPCM再生に対応
	・スロット#3-0に存在するマッパメモリの使用優先度を最下位に変更

　　ver 1.04 -> 1.05 に伴う変更点

	・tRの内蔵PCMで事前に#A5hに3を書き込まないと発音しなかったバグをFIX
	・#78-7Bhに実装したOPN2(YM2612)に対応

　　ver 1.05 -> 1.06 に伴う変更点

	・#OPN2(YM2612)のIOアドレスを#78-7Bhから#14-17hに変更


　　ver 1.06 -> 1.07 に伴う変更点

	・OCM-PLD のクロック切り替えに対応（LOADを高速化、再生時3.58MHz）


■　必要な物

	◇下記 8bit D/Aコンバータ搭載デバイスのいずれか１つ

	　・フリートコマンダーII（ASCII）
	　・新世SIZER (KONAMI)
	　・牌の魔術師（KONAMI）　※　/o50オプションが必要
	　・MSX TurboR　（#A4hにPCMポートを造設していれば非tRでも可）
	　・自作DACカートリッジ(#4000h-7FFFhへの出力で発音するもの)
	　・只PCM（仮）
	　・DAC付きプリンタI/F　MOS-PIF1（M.A.D.社製）
	　・似非P6ROM上のYM2612(OPN2)
	

	◇ＭＳＸ−ＤＯＳ（２）
	　または　DOS1+マッパーサポートルーチンμ（よっしゅさん作）
		　MU.COMを常駐することでMSX1でも使えます

	◇十分な容量のマッパメモリ
　　　　　　メモリはあればあるだけ長時間の再生が可能です。
	　　最大46MBまで使いきれることが確認されています。

	◇8ビットモノラルリニアPCM（WAV）ファイルとそれをMSXに読み
	　込ませるデバイス（MSX用SDカードリーダー等）



■　使い方

◇１：8bit モノラルのwavファイルを用意しておきます。WindowsPC等で適当
　　　な音源からコンバートして作成してください。対応しているのはリニア
　　　PCMのみです。圧縮してはいけません。ステレオもダメです。ヘッダ部分
　　　もそのままDACに流し込みますが音としては聞こえませんので弄る必要は
　　　ありません。
　
　　　サンプリングレートは44kHzを推奨しますが、速度調節機能があります
　　　ので低いレートで変換してファイル容量を減らすこともできます。
　　　レートを下げた分、音質は低下します。レート上限は計算上、約52kHz
　　　です。



◇２：ファイルをMPCM.COMを用いてマッパメモリにロードします。

	
	書式：　MPCM filename.wav [/Option1 /Option2 /....]
              　~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

　　　ファイル名は必ず指定して下さい。指定がないと簡単な使い方を表示して停止
　　　します。

　　　出力スロットまたはポートの指定も必須です。

　　　DOS1でマッパーサポートルーチンμを使う場合はあらかじめ常駐してから実行
　　　してください。


		◇ /Sxx オプション：スロット指定（１６進数で記述）

		DAC搭載ゲームの挿さったスロットを指定します。ゲームカート
		リッジを使う場合は後挿ししてください（無保証）。
		スロット番号の省略はできません。

		自作DACカートリッジを使う時もこのオプションでスロットを
		指定してください。


		◇ /P オプション：　プリンタポート出力

		プリンタポートに只PCM（仮）を接続して使用するときに指定します。
		IOポートの#91hにデータを流し込みます。
		只PCM（仮）については同梱の別ファイルを参照してください。

		M.A.D.社のDAC付きプリンタI/Fを使ってPCM再生するときもこの /P
		オプションを指定してください。


		◇ /T オプション：　ターボR　PCMポート出力

		ターボRのPCMポート（#A4h）にデータを流し込みます。ターボRでなく
		てもこのポートにDACを造設すれば使えるように機種チェックはして
		いません。

		◇ /N オプション：　YM2612 OPN2 PCMポート出力

		OPN2を実装した似非P6ROM用のオプションです。IOアドレスは#14h〜
		17hです。


		◇ /Wxx オプション：WAIT時間指定

		再生時のWAITを指定します。16進数で記述。指定可能な範囲は0から
		FFまで。デフォルトは9です。

		デフォルトの/w9(省略可)でノーマル3.58MHzのZ80でサンプリング
		レート44kHzのソースが違和感無く聞こえるようにチューニングして
		います。数字を減らすと速くなり、増やすと遅くなります。

		ノーマルZ80、WX1.5倍速、WX3倍速でも使えるように、内部のWAIT数
		はそれぞれのクロック用に微調整しています。
		目安として下記のように指定してみてください。
		---------------------------------------------------------------
		 Normal Z80：/w3-4 48kHz /w9-A 44kHz /w19-1A 22kHz 
				/w29-2A 11kHz /w39-3A 8kHz 

		 WX 1.5倍速：/wC-D 48kHz /wE-F 44kHz /w1E-1F 22kHz 
				/w39-3A 11kHz 

		 WX 3.0倍速：/w1C-1D 48kHz /w1E-1F 44kHz /w39-3A 22kHz

		---------------------------------------------------------------

		/w0から/w3Fまでは各クロック用に調整した値を割り当てていますが、
		/w40以上は15クロック刻みでWAIT数がUPします。
		ターボRの高速モードで使う場合は、実際に聞いてみて適当な値に
		増やしてみてください（リプレイ時にカーソルキーで設定可能）。


		◇ /Oxx オプション：出力アドレス指定

		スロットのゲームカートリッジを使う場合にデータを流し込むアド
		レスの上位１バイトを16進数で指定します。デフォルトは40h
		となっており、4000hにデータを流し込みます。

		新世SIZERとフリートコマンダー２の場合はデフォルトのまま指定不要
		ですが、牌の魔術師は5000hに設定されていますので、/o50と指定が
		必要です。

		指定できるのはページ1（4000-7FFFh）のみです。それ以外を指定して
		も勝手にページ１に変換されます。
		

	ソフトが起動すると一度データをすべてマッパメモリにロードします。ロード
	中は書き込んでいるマッパメモリのスロットとセグメント番号を表示します。
	容量が大きい場合は相当の時間を要しますので覚悟してください（笑。
	１ChipMSXでSDカードから46MBのファイルをロードすると15分くらいかかるよう
	です。

	ロードが完了、あるいはマッパ容量を使い切った時点で再生が始まります。
	再生中の中断はできません。どうしても中断したい場合はリセットしてくだ
	さい。



◇３：リプレイ
	
	再生が終わると、「Hit ENTER key to REPLAY.」と表示されます。
	ここでカーソルキーの上下を押すとWAIT時間の調節ができます。
	ENTERキー押下でリプレイが始まります。


	ENTER以外のキーを押下するとDOSに戻ります。同時に確保したマッパ
	セグメントは解放されます。








■　諸注意

	
	後差しするときは、ポーズボタンを押した状態で抜き差しすると、暴走す
	る確率が低くなります。自己責任でお願いします。
	
	システムで使用中のセグメントには書き込みませんので、不要なソフトは常駐
	解除してフリーセグメントを増やしておくと読み込める容量が増えます。

	同一スロットで使用できるセグメント番号は連続している必要があります。	
	フリーセグメント番号が飛び飛びの値になっている場合はロードできる容量が
	減ります。

	ターボR内蔵PCMのDACはS1990が担当しているようですが、44kHzで出力しても
	音質は悪いです。おそらくローパスフィルターが効きすぎているのだろうと
	思います。元々高レートでの発音は考慮していないのかも知れません。

	セカンダリメモリの存在するターボRで、高速モードで使用した場合、セカン
	ダリメモリを使い切ったタイミングで再生速度が速くなります。ターボRの
	プライマリRAMはR800直結のファーストページモードで動作しているため
	アクセスが高速ですが、外付けRAMは通常のバス経由で相対的に遅いので
	このようなことになります。本来システムタイマーでタイミングを合わせる
	べきですが、ターボRでの再生はオマケ機能なのでご容赦を。CPU切り替えして
	Z80モードにすれば速度一定になります。ロードは遅くなりますが。

	Classic PC & GAME Rescue Committee(旧クラシックPC救済委員会）さんから
	発売された16MB拡張カートリッジを使った場合、再生速度が少し遅くなるよう
	です。WAIT数を減らして再生してください。



■　内部の話

	マッパメモリの使用はマッパーサポートルーチンを介して行っています。
	サポートルーチンで使えるセグメントは1スロットあたり255個であり、
	4096kBではなく4080kBです。4MBメモリを使っていると16kB損した気分に
	なりますがシステムの都合なので致し方ありません。おそらくフリーセグ
	メント数を0-FFhで表現するためにそうなったものと思われます。

	同一スロット、同一セグメント内（16kB）においてはZ80の3.58MHzの処理速
	度でも多少の余裕をもって44kHzのPCMを再生することができました。その余裕
	をWAIT処理に使っています。

	セグメントやスロットをまたがる処理は大変時間がかかるため、正攻法のBIOS
	コールやサポートルーチンのコールだと処理の遅延がノイズとなって現れます。
	そこでやむなくIOや拡張スロット選択レジスタを直に操作して速度を稼いで
	います。ステートを限界まで削ったつもりですが、それでも多少の「間」は
	ありますので厳密なタイミングでの再生はできません。
	
	ソースはアセンブラで書いています。目標としたのはノーマルZ80と3倍速機で
	の違和感のない再生です。両方でレート44kHzに合うようにWAIT時間を調節する
	のは意外と骨が折れました。


	


■　諸注意

	このソフトはフリーソフトウェアです。

	このソフトの使用は個人の責任において行って下さい。使用によって何らか
	の損害を生じた場合でも、当方は責任を負いかねます。

	個人的な配布や転載も自由ですが、なるべくバージョンアップがあった時は
	対応してください。あと、バグ情報など報告してくると助かります。

	配布に関わる費用での実費を越える徴収は控えてください。




■　謝辞


	Re:糠を足せ(仮)のmosakuさん、牌の魔術師、只PCM、MSX1、自作DACカート
	リッジでの動作確認とご報告ありがとうございました。
	
	ゆうじろうさん、フリートコマンダーII、16MBメモリーカートリッジでの
	動作報告ありがとうございました。

	ゆうくんさん、1ChipMSXを利用した46MBメモリの使いきり実証のご報告
	ありがとうございました。

	M.A.D.さん、DAC付きプリンタI/Fでの対応ありがとうございます。



■　終わりに

	よもやDOS2マッパーサポートルーチンが46MBにも対応可能だったとは
	思わなかった。

	48MBやそれ以上に対応できるのかは未だ検証されていない・・・




■　一次配布、および連絡先			にがHP on PS2Linux'

					website:http://niga2.sytes.net/
				にがBBS:http://niga2.sytes.net/bbs/upb.cgi

