MSX2/2+/turboR用 16MBメモリー拡張カートリッジ ― 2016年08月10日 23:15
クラシックPC救済委員会製のMSX用16MB増設カートリッジ。
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行目辺り(追加)
604行目
614行目
765行目
781行目
1344行目
元ソースは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用DAコンバーターのスロット版。
作成方法はMPCMに同梱されている。
MSXカートリッジ基板は持っていないので汎用基板上に実装。
MSXとの接続はM.A.D.製カードエッジ基板を利用しフラットケーブルを利用。
組み上げて最初は全く音が出なくて悩んでいた。
原因は、音声をアナログRGB出力の14ピンからとっていたこと(15KHzモードで利用していた)。
スロットからの音声は音声出力端子のL(白)からしか出力されないというのが1ChipMSXの仕様の模様。
むき出しのまま利用するのも何なので、そのうちケースを用意しよう。
最近のコメント