Такой вопрос - какие сигналы от Z80 следует подтягивать к +5В, кроме шины данных?
Неактуально - всё это описано в Z80-UM...
Вид для печати
Такой вопрос - какие сигналы от Z80 следует подтягивать к +5В, кроме шины данных?
Неактуально - всё это описано в Z80-UM...
Для тестирования корректности функционирования подсистем пишу более расширенный тест, чем стандартный для ПРО.
На данный момент готовы проверки 6 видеорежимов из 8 - остались только 3-х и 4-х битные.
Результаты 4-х и 16-и цветных режимов:
Вложение 65691Вложение 65692Вложение 65693Вложение 65694
Заодно выводится номер столбца-знакоместа для проверки корректности широкоэкранного режима.
Выбор теста осуществляется DIP-переключателями конфигурации ПРО (не инверсные значения, то есть "флажок" в эмуляторе означает "0" в бите):
- Биты 0-2 - номер проверяемого видеорежима;
- Бит 3 - активация турбо-режима;
- Бит 4 - активация широкого экрана;
- Биты 5-7 - не используются. Резерв для тестирования PIO.
Пишу на С, собираю через SDCC, поэтому выходной код не самый оптимальный. Но зато легко и быстро пишутся программы).
PS: Жду CPLD'шки для сборки макетки. А пока - вот таким вот тестом буду проверять симуляцию в FPGA...
В продолжение темы о тесте - перевёл полностью на ASM. Не требует памяти, работает чисто на регистрах.
6 тестов из 8 уместил в 2Кб - без агрессивных оптимизаций и сжатия, включая шрифт 8*8 для 128 символов.
Собственно, текущая версия теста (исходник и бинарник) - в аттаче, если кому интересно.
Вложение 65698
О назначении переключателей было написано выше, потому не дублирую.
Прошивается вместо ROM1, которая на 8Кб.
- - - Добавлено - - -
PS: Это мой первый опыт на ASM'е Z80, просьба тапками не закидывать -_-
Этаж сколько эта мини платка с смд халявными микрухами (из прошлой жизни) жрет на один см квадратный. Орион-Про отдыхает:v2_dizzy_roll:
Такой вопрос - насколько актуален объём памяти в 1Мб? Или "всем хватит" 512Кб?
Просто пытаюсь максимально впихнуть в ресурсы по видеопортам и не хватает ячеек из-за "жирного" диспетчера памяти. А выносить часть портов, относящихся к памяти, в другой корпус - не очень хорошо, поскольку они только внутри и коммутируются всё равно.
Готового ПО под такой объём ОЗУ в природе нет. И ситуация тут следующая. Если бы в Орионе был 1 Мб, то это было бы классно, и, например, я бы в своей ОС с удовольствием поддержал (а точнее сказать, в таком случае вообще пересмотрел бы архитектуру ОС). Но, есть "но"... при условии популярности такой платформы среди пользователей. А мы все понимаем, что этого не случится.. увы.
Поэтому, если технически сложно сделать "метр", то я бы оставил 512 Кб.
Не то, что сложно, просто я пытаюсь вырезать до минимума необходимого, что бы уместить в 1 чип почти всё, касающееся памяти (порты F9, 08, 04, 05, 06 - стандартный, Z80-Card, Pro). Если порт F9 ещё можно вынести "наружу", то остальные будут реализованы "в чипе", что бы избавиться от ожиданий при обращении к ВВ55, на которых они реализованы в оригинале. Сооружать "эмулятор" ВВ55 на рассыпухе не вижу смысла вообще.
- - - Добавлено - - -
Очень много ячеек занимают синхронные счётчики - использовать внешние не позволит количество выводов.
Синхронность релизована "в лоб" - выдачей данных по ниспадающему фронту (счёт - по восходящему фронту). То есть на 10 битный счётчик тратится 20 ячеек, таких у нас 2...
- - - Добавлено - - -
Кстати, по портам - порты диспетчера памяти (04-06) софтом только пишутся или ещё и читаются?
Порт 0А, например, читается - тут само его назначение предписывает это (управление RAM, ROM). иначе приходилось бы это же состояние хранить отдельно в памяти для модификации отдельных битов.
Делал так - в итоге получаю глитчи в реале из-за асинхронности счётчиков и полный разлад всего видеотракта, поскольку возникают "левые" импульсы для счётчика строк. Первоначально я так и было, но при проверке оно работало через раз - наблюдалась вот такая вот картина на счётчиках:
https://image.prntscr.com/image/Dsjf...qxbEubihhg.png
На картинке не вижу ничего "нехорошего", нет других сигналов, от которых зависят счётчики...
На всякий случай напомню о синхронности: у счётчиков строк и столбцов должен быть один (!), единственный (!!), общий (!!!) клок, и это должен быть пиксельклок. А вот разрешения клока у счётчиков столбцов и строк должны быть разными, являющимися комбинаторной функцией от предыдущего состояния. Причём, функция разрешения счёта/сброса счётчика столбцов должна являться переменной для функции разрешения счёта/сброса счётчика строк. Вот посмотри и проникнись ;) :
Результат здесь.Код:module HVSync (
input wire PixClock,
output reg HSync,
output reg VSync,
output reg [2:0] R,
output reg [2:0] G,
output reg [2:0] B);
parameter HVA = 1024; // Visible Area
parameter HFP = 24; // Front Porch
parameter HST = 136; // Sync Time
parameter HBP = 160; // Back Porch
parameter VVA = 768; // Visible Area
parameter VFP = 3; // Front Porch
parameter VST = 6; // Sync Time
parameter VBP = 29; // Back Porch
//variables
reg [10:0] PC = 0; // Pixel Counter (Column, X)
reg [9:0] LC = 0; // Line Counter (Row, Y)
wire VA = (PC <HVA) & (LC < VVA); // Visible Area on screen
always @(posedge PixClock)
begin
// VA <= ((PC < HVA-1) | (PC == HVA+HFP+HST+HBP-1)) & ((LC < VVA) | (LC == VVA+VFP+VST+VBP-1));
HSync <= (PC >= HVA+HFP-1) & (PC < HVA+HFP+HST-1);
if (PC < (HVA+HFP+HST+HBP-1))
PC <= PC + 1'b1;
else begin
PC <= 0;
VSync <= (LC >= VVA+VFP-1) & (LC < VVA+VFP+VST-1);
if (LC < (VVA+VFP+VST+VBP-1))
LC <= LC + 1'b1;
else
LC <= 0;
end
end
// Color Image
always @(posedge PixClock)
begin
if (VA)
begin
if ((PC[7:0]==0) | (PC[7:0]==255) | (LC[7:0]==0) | (LC[7:0]==255))
begin
R <= 7;
G <= 7;
B <= 7;
end
else begin
if (LC[7:6]==0)
begin
R <= ~PC[9:7];
G <= 0;
B <= 0;
end
if (LC[7:6]==1)
begin
R <= 0;
G <= PC[8:6];
B <= 0;
end
if (LC[7:6]==2)
begin
R <= 0;
G <= 0;
B <= ~PC[7:5];
end
if (LC[7:6]==3)
begin
R <= PC[6:4];
G <= PC[6:4];
B <= PC[6:4];
end
end
end
else begin
R <= 0;
G <= 0;
B <= 0;
end
end
endmodule