MSX2/2+/turboR用 16MBメモリー拡張カートリッジ2016年08月10日 23:15


MSX用16MB増設カートリッジ

クラシックPC救済委員会製のMSX用16MB増設カートリッジ。
MSXにそんなにメモリ積んでどうするんだ?と思たりもしたんだけど、とりあえず購入。

んでこちらの掲示板で話題になっているDAコンバーターで8bit44KHzのPCMをMSXで再生というのがとても興味深く色々試してみた。

PCM再生にはにが氏作のMPCMというソフトとDAコンバーターを使用する。
MPCMはメモリマッパに曲データを読み込んで再生するのでメモリマッパが広く取れればとれるほど長時間の曲再生が可能となる。(16Mあれば約5分)
その為このような大容量増設メモリはもってこいだ。

まず、上記の掲示板にも出ているんだけど、内蔵メモリと比べるとこのメモリは遅い。
1ChipMSX(互換機)上で計測したところ、標準(3.58MHz)動作時で約95%しか速度が出ない。
MPCMは再生速度がメモリ速度に依存するのでそのまま利用すると内蔵メモリと増設メモリに跨るような曲データの場合、使用するメモリが切り替わった瞬間に再生速度が変わってしまう。

また、1ChipMSXの隠し高クロックモード(10.74MHz)だと認識しない。
1ChipMSXは動作中にクロック切り替えもできるのだけれど、このメモリを利用中に切り替えると再起動する。
しかし、標準(3.58MHz)動作時は至極安定して利用ができ、前述のDAコンバーターを利用してのPCM再生も何の問題もなく行える。
ただし、3.58MHzだと曲データの読み込みに非常に時間がかかるのがちょっと辛い。
A1STで利用すれば読込速度はかなり改善されるんだろうけど、こっちは大きなファイルを持ち込む術を持っていない。

そこで、どうにか1ChipMSXの高クロックモードでこのメモリが利用できないか試していたんだけど、結果スロットへのアクセス時に1クロック以上のWaitを入れることで7.16MHzで安定動作した。
※ノーウェイトでも5.36MHzなら安定した。

16MBのファイルを再生しても最後まで再生してくれる(もちろんリセット等がかかることはない)し、読込速度も約倍になるのでずいぶん待ち時間が減った。

ただ、今度はMPCMのWait指定でちょうどいい値が指定できなくなってテンポがすごく早いかすごく遅いかになってしまった…
う~ん、あちらをたてればこちらが立たず…

1ChipMSX クロック追加及びWait回路調整2016年08月11日 00:00

前項のクロック追加及びWait回路調整のソース修正箇所
元ソースはHRA! 氏の1chipMSX改 開発最新版(2008/07/12 24:27)

この修正により、DIP-SW6の意味が変わり
ON->クロック3.58MHzと10.72MHzで切り替え
OFF->クロック3.58MHzと7.16MHzで切り替え
初期値は両方とも3.58MHz設定、F12で切り替えとなる。

7.16MHz時、スロットアクセス時のWaitは1クロックでも良いのだけれど、16MBカートリッジを使用する際、2クロック入れているとなぜか内蔵メモリと外部メモリのアクセス速度がほぼ同等(3.58MHz対比で内部:165.31%と外部:164.82%)となるので2クロックとしてみた。
※ちなみに1クロックだと3.58MHz対比で内部:190.16%と外部:164.82%だった。増設メモリは速度限界?

また、Wait回路だけど16M増設メモリをスロットにさしていると正常に動作しなかった(CPUに対してWait発行しても無視されてた)ので回路の切り離しを行って確実にWaitが発行されるよう修正した。
想像だけど、WaitはCPUからカセットまで直結しているのでカセット内のプルアップとFPGA内のWait回路が競合してWait回路側で論理値0に落としても電圧下がらないんだと思われる。


クロックモード追加&Wait回路調整

one_chip_msx_board\emsx_top.vhd
511行目辺り(追加)

                   ↓
	SIGNAL CPU_WAIT		: STD_LOGIC;


604行目
				IF( CLKMODE = '0' )THEN
					FF_CLKSEL <= FF_CLKMODE;
				ELSE
					FF_CLKSEL <= NOT FF_CLKMODE;
				END IF;
                   ↓
--				IF( CLKMODE = '0' )THEN
					FF_CLKSEL <= FF_CLKMODE;
--				ELSE
--					FF_CLKSEL <= NOT FF_CLKMODE;
--				END IF;

614行目
	PCPUCLK <=	CPUCLK		WHEN( FF_CLKSEL = '0' )ELSE
				CLKDIV(0);
                   ↓
	PCPUCLK <=	CPUCLK		WHEN( FF_CLKSEL = '0' )ELSE	--:3.58MHz
				CLKDIV(0)	WHEN( CLKMODE = '1' AND FF_CLKSEL = '1' ) ELSE	--DIP_SW6=ON:10.72MHz
				CLKDIV3(1);								--DIP_SW6=OFF:7.16MHz


765行目
			COUNT		:= (OTHERS => '0');
			PSLTWAIT_N	<= 'Z';
		ELSIF (PSLTCLK'EVENT AND PSLTCLK = '1') THEN

			IF (PSLTMERQ_N = '0' AND JSLTMERQ_N = '1') THEN
				IF( FF_CLKSEL = '1' )THEN
					COUNT := "0010";
				END IF;
			ELSIF (PSLTIORQ_N = '0' AND JSLTIORQ_N = '1') THEN
				IF( FF_CLKSEL = '1' )THEN
					COUNT := "0011";
				END IF;
                   ↓
			COUNT		:= (OTHERS => '0');
			CPU_WAIT	<= '1';
		ELSIF (PSLTCLK'EVENT AND PSLTCLK = '1') THEN

			IF (PSLTMERQ_N = '0' AND JSLTMERQ_N = '1') THEN
				IF( CLKMODE = '1' AND FF_CLKSEL = '1' )THEN
					COUNT := "0010";
				ELSIF ( CLKMODE = '0' AND FF_CLKSEL = '1' ) THEN
					COUNT := "0010";
				END IF;
			ELSIF (PSLTIORQ_N = '0' AND JSLTIORQ_N = '1') THEN
				IF( CLKMODE = '1' AND FF_CLKSEL = '1' )THEN
					COUNT := "0011";
				ELSIF ( CLKMODE = '0' AND FF_CLKSEL = '1' ) THEN
					COUNT := "0010";
				END IF;

781行目
			IF (CPUM1_N = '0' AND ICPUM1_N = '1') THEN
				PSLTWAIT_N <= '0';
			ELSIF (COUNT /= "0000") THEN
				PSLTWAIT_N <= '0';
			ELSIF (FF_CLKSEL = '1' AND OPLLREQ = '1' AND OPLLACK = '0') THEN
				PSLTWAIT_N <= '0';
			ELSIF (ERMREQ = '1' AND ADR(15 DOWNTO 13) = "010" AND MMCACT = '1') THEN
				PSLTWAIT_N <= '0';
			ELSIF (SDPAUS = '1') THEN
				PSLTWAIT_N <= '0';
			ELSE
				PSLTWAIT_N <= 'Z';
			END IF;
                   ↓
			IF (CPUM1_N = '0' AND ICPUM1_N = '1') THEN
				CPU_WAIT <= '0';
			ELSIF (COUNT /= "0000") THEN
				CPU_WAIT <= '0';
			ELSIF (FF_CLKSEL = '1' AND OPLLREQ = '1' AND OPLLACK = '0') THEN
				CPU_WAIT <= '0';
			ELSIF (ERMREQ = '1' AND ADR(15 DOWNTO 13) = "010" AND MMCACT = '1') THEN
				CPU_WAIT <= '0';
			ELSIF (SDPAUS = '1') THEN
				CPU_WAIT <= '0';
			ELSE
				CPU_WAIT <= PSLTWAIT_N;
			END IF;

1344行目
		WAIT_N		=> PSLTWAIT_N,
                   ↓
		WAIT_N		=> CPU_WAIT,

MSX用 DAコンバーター2016年08月11日 08:21


MSX用PCM再生DAコンバーター
にが氏考案のMSX用DAコンバーターのスロット版。
作成方法はMPCMに同梱されている。

MSXカートリッジ基板は持っていないので汎用基板上に実装。
MSXとの接続はM.A.D.製カードエッジ基板を利用しフラットケーブルを利用。
組み上げて最初は全く音が出なくて悩んでいた。
原因は、音声をアナログRGB出力の14ピンからとっていたこと(15KHzモードで利用していた)。

スロットからの音声は音声出力端子のL(白)からしか出力されないというのが1ChipMSXの仕様の模様。

むき出しのまま利用するのも何なので、そのうちケースを用意しよう。