| ILoveSpeccy |
12th March 2014 02:21 |
Привет Влад,
я некоторое время назад наконец-то победил DivMMC!
Quote:
Originally Posted by vlad
(Post 687106)
Т.е. я правильно понял, что переключение происходит после цикла M1, когда код команды был считан? И после переключения порты divmmc стают доступны?
|
Да, именно так. Переключение происходит сразу ПОСЛЕ чтения опкода из указанной области, и, например, если за опкодом следуют какие либо операнды, то они считаются уже из ROM/RAM DivMMC.
Вот куски из моего кода, надеюсь поможет...
Code:
process(CLK)
begin
if rising_edge(CLK) and TICK = "010" and CPU_MREQ = '0' then
if CPU_M1 = '0' and CPU_A(15 downto 3) = "0001111111111" then
MAPCOND <= '0';
elsif (CPU_M1 = '0' and (CPU_A = X"0000" or CPU_A = X"0008" or CPU_A = X"0038" or CPU_A = X"0066" or CPU_A = X"04C6" or CPU_A = X"0562")) or (CPU_M1 = '0' and CPU_A(15 downto 8) = X"3D") then
MAPCOND <= '1';
end if;
if MAPCOND = '1' or (CPU_M1 = '0' and CPU_A(15 downto 8) = X"3D") then
AUTOMAP <= '1';
else
AUTOMAP <= '0';
end if;
end if;
end process;
process(CLK)
begin
if rising_edge(CLK) and TICK = "010" then
if CPU_IORQ = '0' and CPU_WR = '0' then
if CPU_A(0) = '0' then
BORDER <= CPU_DO(2 downto 0);
elsif CPU_A(7 downto 0) = X"E3" then
BANK <= CPU_DO(5 downto 0);
CONMEM <= CPU_DO(7);
MAPRAM <= CPU_DO(6) or MAPRAM;
LEDG(6) <= CPU_DO(7);
end if;
end if;
end if;
end process;
CPU_NMI <= '0' when KEY(3) = '0' and MAPCOND = '0' else '1';
RAM_WR <= '1' when CPU_MREQ = '0' and CPU_WR = '0' and CPU_A(15 downto 14) /= "00" else '0';
ESXRAM1_WR <= '1' when CPU_MREQ = '0' and CPU_WR = '0' and CPU_A(15 downto 13) = "001" and (AUTOMAP = '1' or CONMEM = '1') and BANK(2) = '0' else '0';
ESXRAM2_WR <= '1' when CPU_MREQ = '0' and CPU_WR = '0' and CPU_A(15 downto 13) = "001" and (AUTOMAP = '1' or CONMEM = '1') and BANK(2) = '1' else '0';
VRAM_WR <= '1' when CPU_MREQ = '0' and CPU_WR = '0' and CPU_A(15 downto 13) = "010" else '0';
CPU_DI <= ROM_DO when CPU_A(15 downto 14) = "00" and CPU_MREQ = '0' and AUTOMAP = '0' and CONMEM = '0'
else ESXDOS_DO when CPU_A(15 downto 13) = "000" and CPU_MREQ = '0' and (AUTOMAP = '1' or CONMEM = '1') -- ESXDOS ROM
else ESXRAM1_DO when CPU_A(15 downto 13) = "001" and CPU_MREQ = '0' and (AUTOMAP = '1' or CONMEM = '1') and BANK(2) = '0' -- ESXDOS RAM 1
else ESXRAM2_DO when CPU_A(15 downto 13) = "001" and CPU_MREQ = '0' and (AUTOMAP = '1' or CONMEM = '1') and BANK(2) = '1' -- ESXDOS RAM 2
else RAM_DO when CPU_A(15 downto 14) /= "00" and CPU_MREQ = '0'
else "111" & KEYB_DO when CPU_A(0) = '0' and CPU_IORQ = '0'
else in_reg when CPU_A(7 downto 0) = X"EB" and CPU_IORQ = '0'
else "11111111";
Если нужно, могу выложить рабочий проект для DE2-115
Спек очень кастрированный, но DivMMC в связке с EsxDOS работает.
Мне в принципе только это и надо было, так как полноценный спек с обкатанными модулями будет сразу писаться под Aeon Lite.
|