1ChipMSX クロック追加及びWait回路調整
2016-08-11


前項のクロック追加及び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行目


続きを読む

[MSX]

コメント(全17件)
コメントをする


記事を書く
powered by ASAHIネット