А как наличие общего счетчика может пострадать от перевода с двухфазной модели на однофазную синхронную?
Вид для печати
А как наличие общего счетчика может пострадать от перевода с двухфазной модели на однофазную синхронную?
Убедил :) самого себя
А я бы начал с инициализации сего хитрого девайса. Это очевидно для профи. А чайники потом будут репу чухать. Тем более будет не лишним описать с чего, все стартует. И о блоках(чипа) немного.
Вроде по делу. Простите за мой ломаный английский.
Сегодня мы разберем системные регистры. Это два регистра, с индексами 0 и 1, которые задают режим работы всего PPU. Собственно, регистры как регистры, сохраняют входящие от CPU данные, синхронизируют их с ядром PPU и выдают их этому ядру. Назначение бит этих регистров следующее:
Регистр #0:
D7 - VBL Разрешение генерации на ноге #19 сигнала низкого уровня после отрисовки растра, которая подключена ко входу NMI CPU (прерывание VBlank).
D6 --- Отсутствует
D5 - O8_16 Высота спрайтов, если 0 то 8 точек, если 1 то 16 точек.
D4 - BGSEL Старший бит адреса знакогенератора для тайлов фона (0ххх/1xxx).
D3 - OBSEL Cтарший бит адреса знакогенератора для спрайтов (0xxx/1xxx).
D2 - I1_32 Приращение адреса при достпуе к VRAM: 0 - 1, 1 - 32 (для рисования горизонтальных или вертикальных линий).
D1, D0 Выбор старшего адреса для таблицы имен тайлов фона (номер экрана), эти биты обрабатываются в формирователе адреса VRAM.
Регистр #1:
D7 - EmB Приглушение синих оттенков, буржуи называют это эмпфазисом, подробнее о нем будет при разборе видео ЦАП.
D6 - EmG Приглушение зеленых оттенков, буржуи называют это эмпфазисом, подробнее о нем будет при разборе видео ЦАП.
D5 - EmR Приглушение красных оттенков, буржуи называют это эмпфазисом, подробнее о нем будет при разборе видео ЦАП.
D4 - OBE Включение отображения спрайтов.
D3 - BGE Включение отображения фона.
D2 - OBCLIP Гашение столбца из левых 8 точек на плоскости спрайтов.
D1 - BGCLIP Гашение столбца из левых 8 точек на плоскости фона.
D0 - B_W Отключение вывода оттенков (Ч/Б вывод изображения).
Оригинальная схема "влоб":
http://savepic.net/10201183m.png
Оптимизированная синхронная схема:
http://savepic.net/10212447m.png
Функциональный аналог Verilog:
Обратите внимание, что я не использую тактовый сигнал PClk (позитивный пиксельклок) как сигнал чувствительности always блока. Промежуточная модель его именно так и использовала, но в строго синхронной модели этого быть не должно. Тактовая частота должна быть одна во всем дизайне. PClk же становится сигналом разрешения, длительностью строго в 1 такт главной тактовой частоты Clk и периодичностью нужные нам 4 такта для NTSC PPU (или 5 тактов для PAL PPU). Эта же тенденция будет сохраняться и для остальных блоков.Код:// Системные регистры 0 / 1
module PPU_SYS_REGS(
// Системные входы
input Clk, // Тактовая частота
input PClk, // Пиксельклок
// Управляющие входы
input W0, // Запись в регистр 0
input W1, // Запись в регистр 1
input [7:0]DBIN, // Данные
// Выходы
output reg I1_32, // Увеличение адреса +1/+32 (H/V)
output reg OBSEL, // Старший бит адреса знакогенератора спрайтов
output reg BGSEL, // Старший бит адреса знакогенератора фона
output reg O8_16, // Высота спрайтов (0 - 8 точек, 1 - 16 точек)
output reg VBL, // Разрешение прерывания VBlank
output reg B_W, // Режим Ч/Б (обнуление младших 4х битов индекса цвета)
output reg BGCLIP, // Гашение левого столбца 8 точек у фона
output reg OBCLIP, // Гашение левого столбца 8 точек у спрайтов
output reg BGE, // Включение фона
output reg OBE, // Включение спрайтов
output reg EmR, // Эмпфазис красного цвета
output reg EmG, // Эмпфазис зеленого цвета
output reg EmB // Эмпфазис синего цвета
);
// Промежуточные регистры
reg [4:0]W0R;
reg [7:0]W1R;
// Логика
always @(posedge Clk) begin
if (PClk) begin
// Запись значения в промежуточные регистры
if (W0) W0R[4:0] <= {DBIN[7],DBIN[5:2]};
if (W1) W1R[7:0] <= DBIN[7:0];
// Обновление значений
if (~W0) {VBL,O8_16,BGSEL,OBSEL,I1_32} <= W0R[4:0];
if (~W1) {EmB,EmG,EmR,OBE,BGE,OBCLIP,BGCLIP,B_W} <= W1R[7:0];
end
end
// Конец
endmodule
Savepic сдох. Прежде чем перейти к следующему блоку, я попытаюсь восстановить картинки.
Сэйвпик ожил, дублирую фотки себе, в теме буду хостить у себя на всякий случай.
Руки дошли, схоронил все картинки. Готовлю следующую тему по мере сил и времени.
Давно я ничего сюда не постил, а время то летит....
Блоки, входными сигналами которых были только внешние сигналы, закончились. Сегодня поговорим о сердце PPU: о синхрогенераторе. Это "сердце" PPU, он дирижирует остальными блоками.
Входные сигналы:
Clk - Главный тактовый сигнал
OBCLIP - Обрезание левой части экрана спрайтов
BGCLIP - Обрезание левой части экрана фона
BGE - Активация фона
OBE - Активация спрайтов
VBL - Разрешение запроса прерывания VBlank
R2 - Чтение регистра 2
nRES - Общий сброс PPU
Выходные сигналы:
PClk - Пиксельклок
ALEGate - Гейт ALE
[5:0]HNN - Синхронизированное атомарное состояние PPU
S_EV - Запуск процесса просмотра списка спрайтов
CLIP_O - Гашение левого столбца из 8ми точек экрана для спрайтов
CLIP_B - Гашение левого столбца из 8ми точек экрана для фона
O_HPOS - Запуск счетчиков координаты X спрайтов (позиция 0 спрайтов)
EVAL - Сброс счетчика OAMT и начало процесса обработки OAMT
E_EV - Инициализация схемы адреса для вычитания графики спрайтов
I_OAM2 - Сигнал очистки OAMT
PAR_O - Вычитывание графики спрайтов
VIS - Маска активного растра (графика выводится на экран)
F_NT - Чтение Name Table
F_TB - Чтение второго байта
F_TA - Чтение первого байта
N_FO - Сигнал разрешения вывода графики фона
F_AT - Чтение атрибутов из Name Table
SC_CNT - Запуск счетчика адресов при включении растра и/или фона
BURST - Маска вывода вспышки синхронизации поднесущей цвета
SYNC - Синхросмесь видеосигнала
PICTURE - Маска выводимого изображения
N_INT - NMI прерывание по VBLANK
R2B7 - Чтение флага NMI
BLNK - Гашение
RESCL - Строка пререндера (сброс всех схем выборки)
[7:0]V - Выход вертикального счетчика (для спрайтовой машины)
HSYNC - Выход строчной синхронизации
VSYNC - Выход кадровой синхронизации
Синхрогенератор содержит 2 счетчика: горизонтальный и вертикальный. Горизонтальный считает пиксели (по пиксельклоку) а вертикальный - строки растра. Каждый сигнал имеет четкую координату Пиксель:Строка, которая в оригинальной схеме задана обычной матрицей:
http://savepic.net/10175377.png
http://savepic.net/10179473.png
Я не буду более детально расписывать каждый вырабатываемый сигнал. Это лучше сделать при описании модулей, где конкретный сигнал используется.
По традиции, схема "влоб":
http://savepic.net/10188703m.jpg
Оптимизированная схема:
http://savepic.net/10178463m.jpg
Verilog код:
Код:// Главный счетчик таймингов PPU
module PPU_HV_COUNTER(
// Системные входы
input Clk, // Главные такты
// Входные цепи
input OBCLIP, // Обрезание левой части экрана спрайтов
input BGCLIP, // Обрезание левой части экрана фона
input BGE, // Активация фона
input OBE, // Активация спрайтов
input VBL, // Разрешение запроса прерывания VBlank
input R2, // Чтение регистра 2
input nRES, // Общий сброс PPU
// Выходные цепи
output reg PClk, // Пиксельклок
output reg ALEGate, // Гейт ALE
output reg [5:0]HNN, // Синхронизированное атомарное состояние PPU
output reg S_EV, // Запуск процесса просмотра списка спрайтов
output reg CLIP_O, // Гашение левого столбца из 8ми точек экрана для спрайтов
output reg CLIP_B, // Гашение левого столбца из 8ми точек экрана для фона
output reg O_HPOS, // Запуск счетчиков координаты X спрайтов (позиция 0 спрайтов)
output reg EVAL, // Сброс счетчика OAMT и начало процесса обработки OAMT
output reg E_EV, // Инициализация схемы адреса для вычитания графики спрайтов
output reg I_OAM2, // Сигнал очистки OAMT
output reg PAR_O, // Вычитывание графики спрайтов
output reg VIS, // Маска активного растра (графика выводится на экран)
output reg F_NT, // Чтение Name Table
output reg F_TB, // Чтение второго байта
output reg F_TA, // Чтение первого байта
output reg N_FO, // Сигнал разрешения вывода графики фона
output reg F_AT, // Чтение атрибутов из Name Table
output SC_CNT, // Запуск счетчика адресов при включении растра и/или фона
output reg BURST, // Маска вывода вспышки синхронизации поднесущей цвета
output reg SYNC, // Синхросмесь видеосигнала
output PICTURE, // Маска выводимого изображения
output N_INT, // NMI прерывание по VBLANK
output reg R2B7, // Чтение флага NMI
output BLNK, // Гашение
output reg RESCL, // Строка пререндера (сброс всех схем выборки)
output [7:0]V, // Выход вертикального счетчика (для спрайтовой машины)
output reg HSYNC, // Выход строчной синхронизации
output reg VSYNC // Выход кадровой синхронизации
);
// Переменные
reg [1:0]ClkDiv; // Предделитель тактов
reg [8:0]HCnt; // Строчный счетчик
reg [8:0]VCnt; // Кадровый счетчик
reg V8R; //
reg Odd; // Чет/нечет
reg VB; // Вертикальное
reg FPORCH;
reg BPORCH;
reg N_HB;
reg BREN;
reg VSNC;
reg PEN;
reg [2:0]IFIFO;
reg IREQ;
reg R2R;
reg BLNKR;
// Комбинаторика
assign SC_CNT = ~N_HB & (BGE | OBE);
assign PICTURE = ~PEN & ~BPORCH;
assign N_INT = ~(IREQ & VBL);
assign BLNK = BLNKR | ~(BGE | OBE);
assign V[7:0] = VCnt[7:0];
// Логика
always @(posedge Clk) begin
// Синхронизация
R2R <= R2; V8R <= VCnt[8];
// Запрос прерывания
if (~IFIFO[0] & ~IFIFO[2]) IREQ <= 1'b1;
else if (R2R | RESCL) IREQ <= 1'b0;
// Флаг прерывания
if (~R2R & ~R2) R2B7 <= IREQ;
// Флаг Odd
if (V8R & ~VCnt[8]) Odd <= ~Odd;
// Делитель частоты
ClkDiv[1:0] <= ClkDiv[1:0] + 2'h1;
// Активация пиксельклока строго на 1 такт
PClk <= ClkDiv[1] & ClkDiv[0];
// Маска сигнала ALE
ALEGate <= ~ClkDiv[1];
// Пиксельклок
if (PClk) begin
// Синхронизация
HNN[5:0] <= HCnt[5:0];
// Счетчик строк
if (~nRES | (HCnt[8:0] == 9'd340) | (Odd & (HCnt[8:0] == 9'd339) & RESCL)) begin
// Строка досчитала, обрабатываем
HCnt[8:0] <= 9'd000;
// Счетчик кадров
if (~nRES | (VCnt[8:0] == 9'd261)) VCnt[8:0] <= 9'd000; else VCnt[8:0] <= VCnt[8:0] + 9'd001;
end else HCnt[8:0] <= HCnt[8:0] + 9'd001;
// Сигнал N_FO - Переключение между графикой и служебной информацией
N_FO <= ~(BLNK | (HCnt[8] & (~HCnt[6] | HCnt[5] | HCnt[4])));
// Сигнал S_EV
S_EV <= ~BLNK & (HCnt[8:0] == 9'd065);
// Сигналы отсечения
CLIP_O <= ~OBCLIP & (~(HCnt[8] | VB) & ~HCnt[7] & ~HCnt[6] & ~HCnt[5] & ~HCnt[4] & ~HCnt[3]);
CLIP_B <= ~BGCLIP & (~(HCnt[8] | VB) & ~HCnt[7] & ~HCnt[6] & ~HCnt[5] & ~HCnt[4] & ~HCnt[3]);
// Сигнал позиции
O_HPOS <= ~BLNK & (HCnt[8:0] == 9'd339);
// Сигнал EVAL
EVAL <= ~BLNK & ((HCnt[8:0] == 9'd339) | (HCnt[8:0] == 9'd063) | (HCnt[7:0] == 8'd255));
// Сигнал E_EV
E_EV <= ~BLNK & (HCnt[7:0] == 8'd255);
// Сигнал I_OAM2
I_OAM2 <= ~BLNK & ~HCnt[8] & ~HCnt[7] & ~HCnt[6];
// Сигнал PAR_O
PAR_O <= ~BLNK & HCnt[8] & ~HCnt[7] & ~HCnt[6];
// Сигнал VIS
VIS <= ~VB & ~HCnt[8] & ~BLNK;
// Сигнал F_NT - Чтение таблицы символов
F_NT <= ~BLNK & ~HCnt[2] & ~HCnt[1];
// Сигнал F_TB - Чтение второго байта графики
F_TB <= ~(BLNK | (HCnt[8] & (~HCnt[6] | HCnt[5] | HCnt[4]))) & HCnt[2] & HCnt[1];
// Сигнал F_TA - Чтение первого байта графики
F_TA <= ~(BLNK | (HCnt[8] & (~HCnt[6] | HCnt[5] | HCnt[4]))) & HCnt[2] & ~HCnt[1];
// Сигнал F_AT - Чтение атрибутов
F_AT <= ~(BLNK | (HCnt[8] & (~HCnt[6] | HCnt[5] | HCnt[4]))) & ~HCnt[2] & HCnt[1];
// Сигнал HSYNC
HSYNC <= FPORCH;
// Сигнал VSYNC
VSYNC <= ~VSNC & ~N_HB;
// Сигнал SYNC
SYNC <= FPORCH | (~VSNC & ~N_HB);
// Сигнал BURST
BURST <= BREN & (FPORCH | (~VSNC & ~N_HB));
// Сигнал PEN
if (VCnt[7:0] == 8'd241) PEN <= 1'b1;
else if (VCnt[8:0] == 9'd261) PEN <= 1'b0;
// Сигнал BPORCH
if (HCnt[8:0] == 9'd270) BPORCH <= 1'b1;
else if (HCnt[8:0] == 9'd328) BPORCH <= 1'b0;
// Сигнал VB
if (VCnt[8:0] == 9'd261) VB <= 1'b0;
else if (VCnt[7:0] == 8'd239) VB <= 1'b1;
// Сигнал BLNKR
if (VCnt[8:0] == 9'd261) BLNKR <= 1'b0;
else if (VCnt[7:0] == 8'd240) BLNKR <= 1'b1;
// Сигнал FPORCH
if (HCnt[8:0] == 9'd256) FPORCH <= 1'b1;
else if (HCnt[8:0] == 9'd279) FPORCH <= 1'b0;
// Сигнал N_HB
if (HCnt[8:0] == 9'd279) N_HB <= 1'b1;
else if (HCnt[8:0] == 9'd304) N_HB <= 1'b0;
// Сигнал BREN
if (HCnt[8:0] == 9'd308) BREN <= 1'b1;
else if (HCnt[8:0] == 9'd323) BREN <= 1'b0;
// Сигнал VSNC
if (N_HB) begin
if (VCnt[8:0] == 9'd244) VSNC <= 1'b1;
else if (VCnt[8:0] == 9'd247) VSNC <= 1'b0; // FIFO запроса прерывания
end
IFIFO[2:0] <= {~IFIFO[1],IFIFO[0],~(VCnt[7:0] == 8'd241)};
// Сигнал RESCL
RESCL <= (VCnt[8:0] == 9'd261);
end
end
// Конец
endmodule
Блок формирования управляющих сигналов локальной шины PPU.
Локальная шина PPU это отдельное адресное пространство для памяти, которая хранит текущее состояние картинки. Она состоит из младшего байта адреса и данных, мультиплексированных между собой в сигналы PPU_AD[7..0], старших 6ти бит адреса PPU_A[13..8] и сигналов управления: PPU_ALE для защелкивания адреса на шине PPU_AD[7..0], ~PPU_RD для строба чтения данных и ~PPU_WR для строба записи данных. Направление указано со стороны PPU. Для упрощения, я их буду называть так: PAD[7..0], PA[13..8], ALE, PRD и PWR (на схемах RD и WR соответственно).
- 2 знакогенератора, младшие 8 КБайт: 0000-0FFF и 1000-1FFF.
- 4 т.н. "таблицы имён" (Name Tables, это название появилось из-за тайлового метода формирования изображения PPU: в "таблице имен" заносится код символа из знакогенератора, который потом и отображается на текущем месте тайла, совсем как текст у ВГ75), по 1 КБайту на страницу: 2000-23FF, 2400-27FF, 2800-2BFF и 2C00-2FFF. В каждой странице есть сама страница тайлов x000-x3BF и таблица атрибутов 0x3C0-x3FF.
- 4 палитры фона: 3F00-3F0F
- 4 палитры спрайтов: 3F10-3F1F
Остальные неуказанные области просто не используются. Причем, так как ОЗУ палитры находится внутри PPU то генерация внешних сигналов PRD и PWR не производится, при обращении к области 3F00-3FFF, но область 3000-3EFF программно доступна через регистр #7. Вот схема "влоб":
http://savepic.net/10200834m.jpg
Сигналы обращения к регистру #7 проходят через синхронизатор и формирователь нужного тайминга для локальной шины PPU. Каждое обращение к регистру #7 формирует строб увеличения счетчика адреса TSTEP, который может влиять на счетчики даже если происходит вывод растра (тот самый конфликт при обращении к VRAM за пределами кадрового гашения). Сигнал DB_PAR сопровождает сигнал записи PWR и сигнализирует о том, что необходим проброс данных с шины CPU D[7..0] на локальную шину PAD[7..0]. Сигнал PD_RB указывает на чтение с шины PAD[7..0] внутрь PPU, и, в зависимости от источника запроса (R7 или синхрогенератор) перенаправляет данные на шину CPU D[7..0] (на это указывает сигнал XRB) или в рабочие регистры или счетчики растра PPU. Сигнал THX_MUX вырабатывается если текущий адрес PA[13..8] равен 3F (обращение к внутреннему ОЗУ палитры) и блокирует внешний сигнал записи PWR а так же сигнал XRB.
Оптимизированная схема:
http://savepic.net/10205954m.jpg
Здесь появился новый входной сигнал ALEGate, который был введен в рамках организации синхронного дизайна проекта, так как в оригинальной схеме сигнал ALE для режима синхрогенератора (чтение данных растра) организовано как OR сигнала атомарного состояния PPU H0n и инвертированного тактового сигнала PCLK. В синхронной схеме сигнал ALEGate заменяет инвертированный тактовый сигнал PCLK, делая схему строго синхронной. Verilog код модуля:
- - - Добавлено - - -Код:// Управление модулями по адресу
module PPU_ADR_CONTROL(
// Системные входы
input Clk, // Системные такты
input PClk, // Такты пикселей
input ALEGate, // Формирователь сигнала ALE
// Управляющие входы
input W7, // Запись в регистр 7
input R7, // Чтение из регистра 7
input H0n, // Слот обращения
input BLNK, // Картинка погашена
input PA8, // Адрес PA8
input PA9, // Адрес PA9
input PA10, // Адрес PA10
input PA11, // Адрес PA11
input PA12, // Адрес PA12
input PA13, // Адрес PA13
// Выходы
output PWR, // Активация записи
output TSTEP, // Счет развертки
output DB_PAR, // Данные на шину PPU
output PD_RB, // Данные в защелку
output ALE, // Сигнал ALE
output PRD, // Активация чтения
output XRB, // Данные на шину CPU
output TH_MUX // Обращение в палитру
);
// Переменные
assign TH_MUX = BLNKR & PA8 & PA9 & PA10 & PA11 & PA12 & PA13;
reg [1:0]W7Req; // Очередь запроса записи
reg [1:0]W7Queue; // Очередь сигнала записи
reg [1:0]R7Req; // Очередь запроса чтения
reg [1:0]R7Queue; // Очередь сигнала чтения
reg BLNKR; // Регистр гашения
// Выход записи
assign DB_PAR = W7Queue[1] & ~W7Queue[0];
assign PWR = TH_MUX | ~DB_PAR;
// Выход чтения
assign PD_RB = R7Queue[1] & ~R7Queue[0];
assign PRD = ~(PD_RB | (H0n & ~BLNKR));
// Выход шага счетчика растра
assign TSTEP = DB_PAR | PD_RB;
// Выход ALE
assign ALE = (~W7Queue[1] & W7Queue[0]) | (~R7Queue[1] & R7Queue[0]) | (ALEGate & ~H0n & ~BLNK);
// Данные на шину CPU
assign XRB = R7 & ~TH_MUX;
// Логика
always @(posedge Clk) begin
// Синхронизация
W7Req[0] <= W7; R7Req[0] <= R7;
// Запросы
if (W7Req[0] & ~W7) W7Req[1] <= 1'b1;
else if (W7Queue[1]) W7Req[1] <= 1'b0;
if (R7Req[0] & ~R7) R7Req[1] <= 1'b1;
else if (R7Queue[1]) R7Req[1] <= 1'b0;
// Пиксельклок
if (PClk) begin
// Ротация очереди
W7Queue[1:0] <= {W7Queue[0],W7Req[1]};
R7Queue[1:0] <= {R7Queue[0],R7Req[1]};
// Синхронизация
BLNKR <= BLNK;
end
end
// конец модуля
endmodule
Блок мультиплексирования шины данных PPU.
Это маленький блок, который работает при чтении внешним CPU внутреннего состояния PPU или его локальной шины. Схемы не было, он был сразу реализован в виде комбинаторного мультиплексора.
http://savepic.net/10210073.png
Я же его просто синхронизировал. Объяснять его работу, думаю, не требуется.
Код:// Мультиплексор шины при чтении
module PPU_BUS_MUX(
// Секция входов
input Clk, // Такты
input PClk, // Пиксельклок
input PD_RB, // Строб моста шины VRAM
input XRB, // Выбор чтения VRAM
input [7:0]PAD, // Данные VRAM
input R2, // Выбор чтения R2
input [7:0]R2DB, // Данные R2
input R4, // Выбор R4
input [7:0]OB, // Данные R4
input RPIX, // Выбор пиксельного вывода
input [7:0]PIX, // Данные пиксельного вывода
input RnW, // Выбор направления данных
input nDBE, // Строб данных
// Секция выходов
output [7:0]Q // Выход
);
// Комбинаторика
assign Q[7:0] = (RnW & ~nDBE) ? D[7:0] : 8'hZZ;
// Внутренние переменные
reg [7:0]ADR;
reg [7:0]OBR;
reg [7:0]D;
// Логика работы мультиплексора
always @(posedge Clk) begin
// Синхронизация регистра данных обьектов (спрайтов)
if (PClk) OBR[7:0] <= OB[7:0];
// Синхронизация данных чтения VRAM
if (PD_RB) ADR[7:0] <= PAD[7:0];
// Мультиплексор
if (XRB) D[7:0] <= ADR[7:0];
else if (R2) D[7:0] <= R2DB[7:0];
else if (R4) D[7:0] <= OBR[7:0];
else if (RPIX) D[7:0] <= PIX[7:0];
else D[7:0] <= 8'h00;
end
// Конец модуля
endmodule
Несколько вопросов к @HardWareMan:
1. Можно восстановить картинки? Все протухли.
2. Еще не сфоткан PAL-овский чип от Dendy 6538 (2C07)?
3. Что изменилось за 2 года?
1. Нельзя, да и желания нет.
2. Нет, и скорее всего не будет.
3. Ничего, со всех сторон прокинули, так что проект закрыт.
Денди-чип отфоткан со всех слоев:
https://zeptobars.com/en/read/UMC-UA...S-Nintendo-PPU
C остальными чипами (NES PAL PPU, 6527P Dendy CPU) нас декаперы (Zeptobars и VSLAV) опрокинули.
И с сегой тоже.
Обещали-обещали, много лет завтраками кормили, а воз и ныне там.
В прямом смысле. В 2015 я собрал все нужные чипы. Комплект Dendy, PAL NES, Sega MD1.
Собрали с ХВМом донат.
Сначала я отдал проект Зептобарсу из Москвы. Он сказал что проблемы: нужен автоматизированный столик на сервоприводах,
чтобы точно позиционировать чип перед головкой микроскопа. А без этого оборудования фотки кривые и бракованные выходят.
Обещал и клялся что вот-вот сделает. К концу 2017 это все надоело, и мы передали проект Вячеславу (VSLAV) с этого форума.
Vslav говорил что уж теперь 1000% сделает, и столик соберет. Корпуса даже растворил в кислоте. Но история повторилась 1:1.
Он просто забил и на связь толком не выходит.
Итог: с 2015 года Михаилом сделан только Dendy PPU 6538.
На дворе почти 2020.
С Новым Годом, лол.
Vslav, надеюсь, все же сфоткает. В другой ветке он писал, что в декабре к нему пришел микроскоп и он займется тем, что накопилось. У нас там тоже в очереди ХМ1515 от УКНЦ стоят.
Самое главное, что 6538 есть.
Может я немного выпал из темы, но ведь 6527P - это и есть 2A03, который ковырял товарищ ORG на эмураше?
Только там фотки тоже протухли.
По сути чип 6527P - это тот же 2А03, но с другим делителем входной частоты (/15 вместо /12)
и рассчитанный под другой кварц (26.60 вместо 21.47 МГц).
И некоторые модели 6527/6527P еще и скважность попутанную имели.
Можете в моей подписи тему глянуть, там подробно расписано.
Только про сами модели чипов информация пока разбросана по форумам:
https://forums.nesdev.com/viewtopic....=17213#p216082
https://wiki.nesdev.com/w/index.php/..._CPU_revisions
https://wiki.nesdev.com/w/index.php/..._PPU_revisions
Где есть информация еще по декапу чипов от NES и фотки?
- - - Добавлено - - -
Значит для точной эмуляции Денди этого уже достаточно, только делитель поменять и все.
- - - Добавлено - - -
Хм... про 2A03 написаны какие-то неприятные вещи. Правда, непонятно, что они значат:
Цитата:
M2 duty cycle is 3/4 instead of 5/8. Lacks tonal noise mode. Has broken and disabled programmable interval timer on-die. Other differences?
https://www.qmtpro.com/~nes/chipimages/#rp2a03
https://www.qmtpro.com/~nes/chipimages/#rp2c02
https://www.qmtpro.com/~nes/chipimages/visual2a03/
https://www.qmtpro.com/~nes/chipimages/visual2c02/
2C02 (NES NTSC PPU) и 2С07 (NES PAL PPU) не равны 6538 (Dendy/Hybrid PPU)
В нем понамешаны тайминги от NTSC и PAL и PAL'овская палитра соответственно.
В CYCLE REFERENCE CHART, это дело расписано.
Только не написано какие параметры относятся к CPU, а какие к PPU, но это и так совершенно понятно ящитаю.
Эмуляция денди щас хорошая. Тайминги правильные. И эмуляторы отличные.
Но на более низкий уровень мы не смогли спуститься из-за отсутствия декапа.
ХВМ впал в депрессию потому что СЕГУ хотели очень. Даже в приоритет ее первой поставили на декап.
А она накрылась медным тазом. Без декапа там - полный кирдык.
А раз нету сеги, значит и нету у ХВМа мотивации к денди.
А я "томат" - сисадмин-эникейщик и в этих дебрях нифига не шарю.
Нельзя. Рано или поздно получится сфоткать. А если сложить ручки, твою мечту реализует кто-то другой. И это будет его мечта, а не твоя)
Еще пара вопросов:
1) Есть инструкция по реверсу n-моп'овских чипов? (я реверсил только кмоповские).
2) Есть ли потранзисторная или поэлеметная схема других чипов от NES?
Вот тут не знаю.
Жалко, когда люди делают что-то, потом забрасывают проект, ссылки протухают, а многое приходится начинать заново, если вообще приходится начинать. Это я не только про эту ветку, а так же про тему на эмураше.
- - - Добавлено - - -
Кстати говоря, чем тогда хардвареман лучше опрокинувших декаперов, которые обещали и не сделали?
Он тоже обещал в этой теме восстановить фотки) А теперь не буду, не хочу)
- - - Добавлено - - -
Самая лучшая фотка металла в папке metal_photo1, отсутствует в максимальном разрешении.
Говорим спасибо Zeptobars/Михаилу. В тех папках лежит всё, что было доступно. Ничего другого - нет.
И я подозреваю, что эти фотки кривоваты. Без столика делались. Руками клеились.
Поэтому и три подхода было.
Вот ветка, я топикстартер:
https://forums.nesdev.com/viewtopic.php?f=3&t=13185
В сухом остатке мы имеем:
- 5 лет коту под хвост.
- Полностью подорванное доверие к обоим декаперам.
- Распотрошенный комплект чипов, которые осели где-то в/на Украине. Теперь уж на глазок не опознать, кто из них кто.
Выводы:
- Начинать всё по новой, собирать чипы, убить очередные оригинальные PAL NES и SEGA MD1 на потроха.
- Искать кого-то на Западе вслепую, без связей без знакомств, за конские деньги. Иными словами - играть в очередную лотерею.
- Мы лохи, просравшие и чипы, и килобакс доната (по старым ценам).
Так-то.
ХЗ короче.
А у вас на нашем месте была бы мотивация после такого (не побрезгую этим жаргонным словом) "кидалова"?
Я смотрю на это гораздо оптимистичнее:
1. @Vslav отфоткал множество чипов, и некоторые отреверсил, что здорово продвинуло науку в области PDP.
2. Все чипы для Денди отфотканы. 6538 есть. 2A03 (почти 6527P) тоже есть. Чего еще надо для реверса?
3. Остальное дофоткается в будущем, я думаю. И ваша Сега тоже.
Наверное вам повезло. Нам Vslav не отфоткал ни одного чипа с 2017.
При этом не посылал в сад, а говорил, что вот уж сейчас (весной/летом/осенью) УЖ ТОЧНО БУДЕТ.
Прошло 2 года. Иногда он вылезал с очередной порцией завтраков, сделал сам декап (снятие корпусов).
А потом он просто изчез из конференции скайпа в июне. Попытки достучаться через ЛС были:
Иными словами: с Новым Годом - пшёл нафиг.Цитата:
- Здравствуйте. А вы в скайп-беседу вообще больше не заходите?
- Здравствуйте, да - нечасто, когда только домашний компьютер включаю и не каждый раз.
Сорян конечно за вынесение сора из избы. Это некрасиво и все дела.
Но какие мне прикажете делать выводы?
Бугурт ХВМа мне весьма понятен.
Он перестал ХОТЕТЬ что-то делать после такого.
Вы прислали сразу 16 чипов. Я должен их все вручную фотать?
На маленький чип уходит половина рабочего дня. На большой и целый день может уйти.
А времени нет совсем, работа сложная, вечером и в выходные я никакой, на свои-то проекты сил нет.
Естественно, я захотел это дело автоматизировать, вот занимаюсь.
Можно было бы хоть ради приличия сюда написать.
Но вы просто исчезли, а нам ничего не оставалось, кроме как сделать соответствующие выводы.
Логично? Логично. Без обид, ничего личного.
Ну так можно было предложить другой вид связи, хоть РМ на форуме. Хотя, Женя через него и выходил на связь.
Короче, это тема декапа и она оффтопиком тут. Пусть админы её отрежут куда-нибудь. Что касается картинок, то я их восстановлю, когда форум обзаведётся своим хостингом картинок, если найду их у себя на компе. А пока тему кроем.
А чем google диск не вариант - 15 гигабайт бесплатно, доступ есть отовсюду.
Официальное обращение:
Здравствуйте Вячеслав.
Так как с проектом не вышло, не могли бы вы выслать чипы HWM'у пожалуйста?
Мне nesdev подсказал контакты на зарубежного декаппера.
Очередной год прошел, результатов нет - я думаю, что нет больше смысла мучать Вас этим проектом.
https://imgur.com/QiSLGke
М-м-м-м? Мы же все распилили и открыли. С Игорем посмотрели в микроскоп вместе, открытые кристаллы уже 2-3-го
поколений - нормы очень мелкие, много слоев металла. Самый простой чип с самыми крупными нормами отсняли,
сырые снимки выложены, а влазить в реверс я изначально не брался. Что еще мы можем сделать?
Пытаться шлифовать и снимать на крупном разрешении считаю бесполезным, прямой реверс маловероятным,
достаточно посмотреть как оно идет, например, с чипами PS1. Там шлифовка и снимки на х40 от "зарубежного декапера",
красивые, но оно несильно помогает. Но попробовать, конечно, можно. Я вышлю открытые кристаллы, куда скажете.
Я может что-то пропустил, тогда прошу извинить.
Но вроде как были проблемы со склейкой фрагментов фотографий в единый файл, в итоге дело ничем не закончилось.
Я точно не видел целой фотографии, как например тут: https://zeptobars.com/en/read/UMC-UA...S-Nintendo-PPU
Наверное это было в приватной беседе, я это пропустил.
Возможно ли вашими силами сделать 6527Р (CPU Dendy) или RP2C07-0 (PAL NES PPU)?
Они по идее, самые "простые" и имеют самые крупные нормы, из всего того, что у нас было.
RP2C07-0 пытался вскрывать Зептобарс примерно в то же время, когда делал фотки 6538.
Но возникли какие-то проблемы непонятного характера, тоже с автоматикой склейки
Да, по Скайпу общались. Я отснял ~400 снимков на x20 и выложил, договорились что панораму вы сами собирать будете.
https://www.1801bm1.com/files/retro/SEGA/sega_nums.jpg
Снимали чип 05 - SEGA 315-5309 6046 9048 AEAD, как имеющий хоть какие-то перспективы для анализа.
- - - Добавлено - - -
Список чего открыто и идентифицировано:
1. SEGA 315-5313 7101 9036 LAGD 208
2. RP2C02H-0
3. UMC UA6527P
4. SEGA 315-5476A 1LD41
5. SEGA 315-5309 6046 9048 AEAD
6. SEGA 315-5364 6045C 9049 ABAD
7. TA-05 9604 1548124064
8. SEGA 315-5477 9202 Q63
9. TA-06W 9606 1549458051
10. RP2A03H/TA-03NP1
11. TA-04 6604 1547596063
12. YAMAHA JAPAN YM2612 9037 IAGB
13. Fujitsu 2C31??
Видно что UA6527P имеет уже масштабированный кристалл. То есть, написано-то 6527, а внутри уже переразведенка по новому тех-процессу.
RP2C07-0 - есть отдельный кристалл, его Михаил открывал, вроде же он фото и делал?
Могу посмотреть и переснять, насчет склейки подумаю, если и там 400 кадров - то пока нет, мне надо multiblend переписать, а то Hugin неделю собирать будет.