А там обслуга ФАТ не на микроконтроллерах ли сделана?
На микроконтроллерах это просто: полно С-шных исходников обслуги ФАТ в открытом доступе - "наливай да пей". А какой смысл в реальной ВГ-93?
Вид для печати
Да, на Мега32
Голый ФАТ ничего недаст. В Спекки помимо ФАТа отработана эмуляция ВГ93 и пропатчены прошивки ПЗУ для удобной работы с SD. Весь этот комплекс огого какая вещь :)
Предполагаю, для подключения реального дисковода :) Благо, NedoPC неимоверно круты и уже давно сделали это.
---------- Post added at 17:20 ---------- Previous post was at 17:08 ----------
реальная ВГ93 отпадает, выходов GPIO не хватит :(
Пропатчены прошивки там, потому что единственный (?) порт для общения с контроллером - 1Fh.
А остальное - просто доп програмка (снапшот с флешки грузящийся).
Ну а фат сделан на этом:
http://elm-chan.org/fsw/ff/00index_e.html
Что-то не как опрос клавиатуры не работает в мониторе. Напоминаю что наверное используется не реализованный опрос, когда все выводы ВВ55 предназначенные для клавиатуры программируются на ввод. Пересечение клавиши - два нуля, соответствующие строке и столбцу нажатой клавиши. Вот выдержки кода:
Драйвер клавиатуры:Код:...
if res_n = '0' then
metod <= "00";
...
elsif (u7rd = '1') then -- запись в порты клавиатуры
if a_buff (1 downto 0) = "00" then -- порт А клавиатуры
if metod = "00" then
dataI <= scan_out0 (7 downto 0); -- код ответа
else
dataI <= scan_out (7 downto 0); -- код ответа
end if;
end if;
if a_buff (1 downto 0) = "01" then -- порт В клавиатуры
if metod = "00" then
dataI <= scan_out0 (13 downto 8) & not shift & '0'; -- код ответа
else
dataI <= scan_out (5 downto 0) & not shift & '0'; -- код ответа
end if;
end if;
if a_buff (1 downto 0) = "10" then -- порт С клавиатуры
if metod = "00" then
dataI <= "0000" & scan_out0 (17 downto 14); -- код ответа
else
dataI <= "0000" & scan_out (11 downto 8);-- код ответа
end if;
end if;
...
spetskey:spetskeyboard
port map(
...
metod => metod,-- метод опроса
sp_kb_out0 => scan_out0, -- код ответа для метода №0
...
Принцип прост: при считывании с одного из портов ВВ55 считывается код с двумя нулями, соответствующий скан-коду PS/2 клавиатуры.Код:always @(posedge clk)
begin
if (reset)
case (metod)
0:
begin
sp_kb_out0_ <= 18'h00;
end
...
else
begin
if (strobe)
case (metod)
0:
begin
case (sp_kb[7:0])
9'h005: sp_kb_out0_ <= 18'b011101111111111111; //F1
9'h006: sp_kb_out0_ <= 18'b101101111111111111; //F2
9'h004: sp_kb_out0_ <= 18'b110101111111111111; //F3
9'h00c: sp_kb_out0_ <= 18'b111001111111111111; //F4
9'h003: sp_kb_out0_ <= 18'b111101111101111111; //F5
9'h00b: sp_kb_out0_ <= 18'b111101111110111111; //F6
9'h083: sp_kb_out0_ <= 18'b111101111111011111; //F7
9'h00a: sp_kb_out0_ <= 18'b111101111111101111; //F8
9'h001: sp_kb_out0_ <= 18'b111101111111110111; //F9
9'h009: sp_kb_out0_ <= 18'b111101111111111011; //ЧФ
9'h078: sp_kb_out0_ <= 18'b111101111111111101; //БФ
9'h007: sp_kb_out0_ <= 18'b111101111111111110; //СТР
... и так далее на все 12х6 клавиш
Читаем здесь. Есть такой метод. Однако мысль понятна. Реальный ВВ55 нам преподнесёт ещё много сюрпризов. Один уже был: почему то инвертируются сигналы цвета, снимаемые со старшей тетрады порта С.
Там нет доказательств. Написать и я могу.
А если интересует метод ввода, который используется во время чтения с магнитофона, то это - А и С на вывод, В на ввод. Как задали в начале монитора, так он и не меняется (в начале монитора стоит запись 82h в РУС).
Может быть дело вот в чём. RAMFOS (ОС Специалиста_МХ) использует такой алгоритм: сначала 12 выводов программируются на вывод и засылаются все нули, а потом анализируется порт В. Если хоть один ноль появится, но включается 2-ой метод опроса клавиатуры, а именно - порт В на вывод, порты А и С на ввод. Пыхотин (ссылка на сайт выше) может действительно написал, не полностью, не подумав.
Вот за это спасибо. Хотел уже начало Монитора-2 дизасемблировать. Приму к сведению эту информацию.
В драйвере клавиатуры действительно используются оба метода, а при чтении с магнитофона по другому нельзя (если не переключать постоянно, как в драйвере клавиатуры), т.к. ввод с магнитофона тоже через порт В идёт.