
Сообщение от
valerium
... Причем только на Ленине, а на Sizif128, где вчера я видел сплэш ESXDOS, почему-то нет даже его - возможно из-за того, что версию 0.8.5 сменил на 0.8.8.
Все было совсем не так. Версия ESXDOS не имела значения, а повлияло то, что кроме него я свою дебаговую прошивку CPLD сменил на "некопанную" первоначальную.
Сейчас нормально пускается и на ленине, и на sizif128, и даже на втором ленине (который Веста).
Поэтому пришлось в первоначальную прошивку CPLD внести одну незначительную, как я вначале думал, правку.
Это проверка уровня сброса (/RESET) и при его активности - обнуление конфигурационного регистра divmmc.
Код:
...
process(divideio,poweron)
begin
-- if poweron ='0' then -- исходно было вот так
if poweron ='0' or reset = '0' then -- тут добавил условие проверки уровня reset
bank <= "000000";
mapram <= '0';
conmem <= '0';
elsif rising_edge(divideio) then
bank(5 downto 0) <= D(5 downto 0);
mapram <= D(6) or mapram;
conmem <= D(7);
end if;
end process;
...
Что это и зачем это.
У DivIDE, а значит и у DivMMC есть бит mapram в конфигурационном регистре (порт E3h), он отвечает за маппирование третьей страницы ОЗУ DivMMC в качестве подмены его ПЗУ. При включении питания, пока poweron активен (кондер заряжается), все биты конфигурации обнуляются и включается страница ПЗУ, где у нас esxdos, например. Но можно в третью страницу ОЗУ загрузить нечто альтернативное и использовать это вместо ПЗУ - но эту настройку (mapram=1) изменить нельзя до выключения, т.к. сброс mapram в 0 возможен только по активности poweron. Сделано видимо для того, чтобы подмена ПЗУ (друга версия esxdos, например), давала стартовать себя при нажатии сброса и не слетала обратно на ПЗУ.
Теперь пытаюсь разобраться, почему в некоторых случаях это криво работает.
По какой-то причине не отрабатывает условие сброса по poweron=0, а когда стартует процессор, у нас в регистре конфигурации находится мусор и включена непонятна какая страница ПЗУ/ОЗУ. Спек рисует зюки и не стартует.
Импульс /RESET в спеке заметно длиннее poweron в DivMMC (формируются RC-цепочками) - при примерно одинаковом R у нас C отличается на 3 порядка (10 нф в DivMMC и ~10мкф в обычных схемах сброса спека). Возможно, что нужно было удлинить poweron.
В исправленном варианте прошивки CPLD сброс регистра конфигурации DivMMC сбрасывается при активном /RESET и к старту DivMMC включается нужная страница ПЗУ. Теперь при этом нельзя залить ОЗУ DivMMC подмененным кодом и поставить его вместо ПЗУ на сброс - но я не могу придумать, зачем мне такое было бы нужно применить. Поэтому пока потестирую этот костыль.
Не исключено что причина распространенного незапуска divmmc на русских клонах именно в этом.
Я потом попробую поправить прошивку в xilinx-версии платы, которую раньше так и не смог запустить, не исключено, что и она заработает.
Еще один эксперимент - вместо процессорного CLK на CPLD подавал 4МГц с отдельного генератора. DivMMC работает, карта читается. Так что в той статье на Tynemouth (этот пост, правда ссылка там, кажется, уже неактуальна) была правда - можно использовать отдельный генератор на 3,9-4,2Мгц.
Так что для работы divmmc вместо всех доделок по коррекции штатного CLK можно просто собрать генератор на трех TTL-инверторах. На 4,0Мгц проверил.