Приставки > Картриджи / диски
Mega2560 Shield NES Dumper/Writer
<< < (6/20) > >>
HardWareMan:
Cluster, кто? Я? Я держу пацанов в курсе, только и всего!  :blush:
Cluster:
Закоммитил обновления клиента.

Не стесняйтесь делать пул-реквесты, если что. В частности можете добавлять свои мапперы.
KykyPyky:
Наткнулся на некоторые мапперы которые полностью не дампятся.
Общее у них одно, они на базе mmc3 и переключение внешних банков через $5FF0, $5FF1, $5FF2
Регистры mmc3 работают хорошо, а вот игры через внешний банк не переключаются, что бы я в них не записывал.
В некоторых меню работает и можно узнать что оно пишет для переключения игр.

--- Код: ---                        $5FF0       $5FF1     $5FF2
ROBOCOP 3    128k+128k   $12         $10       $20     JMP($FFFC)
SHOW BROTHER 128k+128k   $12         $18       $30     JMP($FFFC)
TMNT 2       256k+256k   $01         $00       $00     JMP $addr
--- Конец кода ---


--- Код: ---                        $5FF0       $5FF1     $5FF2
BATMAN       128k+128k   $12         $18       $00     JMP $addr
SPIDERNAN HZ 128k+128k   $12         $00       $10     JMP($FFFC)
TMNT 1       128k+128k   $12         $08       $20     JMP($FFFC)
TMNT 4       128k+128k   $12         $10       $30     JMP($FFFC)
--- Конец кода ---

Маппер, предположительно, сильно упрощенный http://wiki.nesdev.com/w/index.php/INES_Mapper_176

Не удается с помощью регистров $5FF0, $5FF1, $5FF2 переключать игры. Пишу туда, а оно не пишется :neznayu:
У кого какие есть идеи?
supremacy:
Если речь про многоигровки, то скорее всего виновато отсутствие строба m2. Выше про это уже упоминали . Скорее всего срабатывает сброс этого регистра, либо запись в него осуществляется по низкому уровню m2.
Cluster:
При записи там делается строб, по крайней мере в моей оригинальной прошивке. Да и многие картриджи с такими регистрами я дампил. Может с таймингами что-то не то?
Ещё может быть, что картридж уходит в ресет.
HardWareMan:
Cluster, supremacy имел в виду детектор сброса, который обычно собирается на RCD цепочке. Его действие основано том факте, что ядро 6502 в нормальной работе генерирует стабильную частоту на ноге F2. И пропадание этой частоты определяется как нажатие на сброс (потому что оно реально пропадает, если активен сигнал сброса, точнее вывод уходит в Z). И многоигровки, использующие это как сброс сдампить этим программатором нельзя.

Но самая засада в том, что этот самый F2 управляет состоянием шины. Когда он = 0 шина пассивна, когда он = 1 - активна. Т.е., картридж обязан отключаться, если F2 = 0. Так же, процессор стабилизирует остальные управляющие сигналы именно когда F2 = 0: речь об адресах и сигнале направления данных R/W. И как только F2 = 1 все эти сигналы должны быть стабильны.

В моем дампере стоит STM32F4, вот он на 168МГц ядра успевает подстроиться под F2, который генерируется таймером и полностью соответствует по скважности и частоте сигналу оригинального ядра 6502. И код при этом очень тугой в плане таймингов + отключены прерывания (код проверен на соответствие таймингов логическим анализатором):

--- Код: ---// Чтение данных PRG в буфер
__attribute__ ((naked)) void Read_PRG( uint8_t *PBuf, uint32_t Start, uint32_t Size )
{ // Начинаем
__asm volatile
( "PUSH {R0-R8}\n"
// R0 = PBuf
// R1 = Start
// R2 = Size
// R3 = GPIOA_IDR (Для чтения F2)
"MOVW R3, #0x0010\n"
"MOVT R3, #0x4002\n"
// R4 = GPIOE_ODR (Для вывода адреса)
"MOVW R4, #0x1014\n"
"MOVT R4, #0x4002\n"
        // R5 = GPIOD_IDR (Для ввода данных)
"MOVW R5, #0x0C10\n"
"MOVT R5, #0x4002\n"
// R6 = Маска $0000FFFF
"MOVW R6, #0xFFFF\n"
"MOVT R6, #0x0000\n"
// Выделим
"AND R1, R1, R6, LSL #0\n"
"AND R2, R2, R6, LSL #0\n"
// Синхронизируемся
"CPSID f\n"
"Read_PRG_Syn0:\n"
"LDR R7, [R3, #0]\n"
"ANDS R7, R7, #1\n"
"IT EQ\n"
"BEQ Read_PRG_Syn0\n"
"Read_PRG_Syn1:\n"
"LDR R7, [R3, #0]\n"
"ANDS R7, R7, #1\n"
"IT NE\n"
"BNE Read_PRG_Syn1\n"
        // Цикл чтения
"Read_PRG_Loop:\n"
// Выставляем адрес
"STR R1, [R4, #0]\n"
// Ждем F2 = 1
"Read_PRG_LWt0:\n"
"LDR R7, [R3, #0]\n"
"ANDS R7, R7, #1\n"
"IT EQ\n"
"BEQ Read_PRG_LWt0\n"
// Увеличиваем адрес чтения
"ADD R1, R1, #1\n"
// Ждем F2 = 0
"Read_PRG_LWt1:\n"
"LDR R8, [R5, #0]\n"
"LDR R7, [R3, #0]\n"
"ANDS R7, R7, #1\n"
"IT NE\n"
"BNE Read_PRG_LWt1\n"
// Сохраняем данные
"AND R8, R8, #0x00FF\n"
"STRB R8, [R0, #0]\n"
// Следующий байт
"ADDS R0, R0, #1\n"
// Счетчик байт
"SUB R2, R2, #1\n"
"ANDS R2, R2, R6, LSL #0\n"
"IT NE\n"
"BNE Read_PRG_Loop\n"
"CPSIE f\n"
// Обнулим адрес
"MOVW R6, #0x0000\n"
"STR R6, [R4, #0]\n"
"POP {R0-R8}\n"
"BX LR\n"
);
}
--- Конец кода ---
А вот AVR, скорее всего, не успеет программно это сделать. Причем, проблема будет острее для режима записи. Хотя, конечно, попробовать можно реализовать. Я подумаю на будущее.
RetHunter:
Ребята, как продвигается работа с перезаписью кулбоев без пайки?
bgr:
RetHunter, уже никак.
HardWareMan:
Уже 9 дней как никак.
Cluster:

--- Цитата: HardWareMan ---В моем дампере стоит STM32F4, вот он на 168МГц ядра успевает подстроиться под F2, который генерируется таймером и полностью соответствует по скважности и частоте сигналу оригинального ядра 6502. И код при этом очень тугой в плане таймингов + отключены прерывания (код проверен на соответствие таймингов логическим анализатором):

--- Код: ---// Чтение данных PRG в буфер
__attribute__ ((naked)) void Read_PRG( uint8_t *PBuf, uint32_t Start, uint32_t Size )
{ // Начинаем
__asm volatile
( "PUSH {R0-R8}\n"
// R0 = PBuf
// R1 = Start
// R2 = Size
// R3 = GPIOA_IDR (Для чтения F2)
"MOVW R3, #0x0010\n"
"MOVT R3, #0x4002\n"
// R4 = GPIOE_ODR (Для вывода адреса)
"MOVW R4, #0x1014\n"
"MOVT R4, #0x4002\n"
        // R5 = GPIOD_IDR (Для ввода данных)
"MOVW R5, #0x0C10\n"
"MOVT R5, #0x4002\n"
// R6 = Маска $0000FFFF
"MOVW R6, #0xFFFF\n"
"MOVT R6, #0x0000\n"
// Выделим
"AND R1, R1, R6, LSL #0\n"
"AND R2, R2, R6, LSL #0\n"
// Синхронизируемся
"CPSID f\n"
"Read_PRG_Syn0:\n"
"LDR R7, [R3, #0]\n"
"ANDS R7, R7, #1\n"
"IT EQ\n"
"BEQ Read_PRG_Syn0\n"
"Read_PRG_Syn1:\n"
"LDR R7, [R3, #0]\n"
"ANDS R7, R7, #1\n"
"IT NE\n"
"BNE Read_PRG_Syn1\n"
        // Цикл чтения
"Read_PRG_Loop:\n"
// Выставляем адрес
"STR R1, [R4, #0]\n"
// Ждем F2 = 1
"Read_PRG_LWt0:\n"
"LDR R7, [R3, #0]\n"
"ANDS R7, R7, #1\n"
"IT EQ\n"
"BEQ Read_PRG_LWt0\n"
// Увеличиваем адрес чтения
"ADD R1, R1, #1\n"
// Ждем F2 = 0
"Read_PRG_LWt1:\n"
"LDR R8, [R5, #0]\n"
"LDR R7, [R3, #0]\n"
"ANDS R7, R7, #1\n"
"IT NE\n"
"BNE Read_PRG_LWt1\n"
// Сохраняем данные
"AND R8, R8, #0x00FF\n"
"STRB R8, [R0, #0]\n"
// Следующий байт
"ADDS R0, R0, #1\n"
// Счетчик байт
"SUB R2, R2, #1\n"
"ANDS R2, R2, R6, LSL #0\n"
"IT NE\n"
"BNE Read_PRG_Loop\n"
"CPSIE f\n"
// Обнулим адрес
"MOVW R6, #0x0000\n"
"STR R6, [R4, #0]\n"
"POP {R0-R8}\n"
"BX LR\n"
);
}
--- Конец кода ---
А вот AVR, скорее всего, не успеет программно это сделать. Причем, проблема будет острее для режима записи. Хотя, конечно, попробовать можно реализовать. Я подумаю на будущее.

--- Конец цитаты ---
Ты что, на асме под STM32 пишешь?
Вообще я сейчас как раз хочу их осваивать, можно практиковаться и сделать дампер...



--- Цитата: HardWareMan от 13 Август 2018, 21:54:21 ---Уже 9 дней как никак.

--- Конец цитаты ---
Я сейчас постепенно занимаюсь новым сборщиком ромов для кулбоев, который использует новый функционал. Но это лучше в отдельной теме обсуждать.
HardWareMan:

--- Цитата: Cluster от 16 Август 2018, 21:25:14 ---Ты что, на асме под STM32 пишешь?
Вообще я сейчас как раз хочу их осваивать, можно практиковаться и сделать дампер...
--- Конец цитаты ---
Нет, только критичные ко времени кусочки кода. Собственно, ты всегда можешь сам посмотреть, что там и как.
RetHunter:

--- Цитата: Cluster от 16 Август 2018, 21:25:14 ---Я сейчас постепенно занимаюсь новым сборщиком ромов для кулбоев, который использует новый функционал. Но это лучше в отдельной теме обсуждать.

--- Конец цитаты ---
Сборщик ромов - это чудесно. Где можно почитать о нововведениях?
А именно запись кулбоев без пайки както продвинулась?
Cluster:

--- Цитата: HardWareMan от 16 Август 2018, 22:12:29 ---Нет, только критичные ко времени кусочки кода. Собственно, ты всегда можешь сам посмотреть, что там и как.

--- Конец цитаты ---
О, я как раз хотел у тебя ссылку на твой проект попросить.


--- Цитата: RetHunter от 19 Август 2018, 23:39:55 ---Сборщик ромов - это чудесно. Где можно почитать о нововведениях?
А именно запись кулбоев без пайки както продвинулась?

--- Конец цитаты ---
А что там продвигать? Всё за один вечер сделано было...

А с нововведениями позже отдельную тему создам.
RetHunter:
Алексей, что у меня не так с прошивкой кулбоя?
Пишет, что не знает команды write-coolboy, при этом write-coolgirl пытается выполнить, test-coolboy - получает информацию.
Вот ошибка:
D:\Dumper NO SOLDERING>famicom-dumper write-coolboy
Famicom Dumper Client v1.0
  (c) Cluster, 2018
  http://clusterrr.com
  clusterrr@clusterrr.com

Searhing for dumper (FTDI device with name "Famicom Dumper/Programmer")...
Number of FTDI devices: 1

Device Index: 0
Flags: 0
Type: FT_DEVICE_232R
ID: 4036001
Location ID: 13
Serial Number: 0018AKQ2
Description: Famicom Dumper/Programmer

PRG reader initialization... OK
CHR reader initialization... OK
Unknown command: write-coolboy

Добавлено позже:
Разлбрался. Надо писать write-coolboy-direct.
Испрвь в описании.
Картридж c BGA флешкой пошёл на запись! :)


Добавлено позже:
Картридж записался.
Нашёл ещё ошибку, пропущена буква "С": Searhing for dumper (FTDI device with name "Famicom Dumper/Programmer")...
Cluster:
Это прям две мои беды - не успеваю писать документацию и не перечитываю написанный текст :)
Всё поправлю, наверное сегодня уже зарелизю. Я там ещё сделал поддержку альтернативных кулбоев, с регистрами на $500x (определяются автоматически) и вывод информации информации о flash-памяти (размер, вольтаж и пр.)

А что за кулбой с BGA флешкой? Можно фото? Какие игры там были?

Добавлено позже:
Ещё вопрос: выложен ли проект шилда из этой темы куда-нибудь ещё, например на гитхаб? Я ссылку в описании клиента оставил бы.
postal2201:
Cluster, каждый раз как делаю новый проект собираюсь завести себе страницу на github :blush:
Сегодня обязательно заведу и все выложу, схемы, герберы и прочее.
RetHunter:

--- Цитата: Cluster от 25 Август 2018, 15:08:14 ---
А что за кулбой с BGA флешкой? Можно фото? Какие игры там были?


--- Конец цитаты ---

Вот тема, там фото и дамп.
http://www.emu-land.net/forum/index.php/topic,80413.0.html
Там картридж Pocket Game 150в1, с вырезанным стартовым экраном с рекламой.
Спасибо за твою работу!
Cluster:
А вот первый релиз клиента: https://github.com/ClusterM/famicom-dumper-client/releases :)
KykyPyky:

--- Цитата: KykyPyky от 11 Август 2018, 21:14:18 ---Не удается с помощью регистров $5FF0, $5FF1, $5FF2 переключать игры. Пишу туда, а оно не пишется :neznayu:
--- Конец цитаты ---
Мне удалось сдампить эти карики. Я подпаял к карику m2 с внешнего генератора 1.7мгц, а сигнал с дампера отключил(вставил зубочистку в слот). Считывается все на удивление очень надежно.
До этого пытался прошивкой ардуиной держать m2 все время в высоком или низком состояниии, а изменять состояние в нужное только при записи. Не помогало.
А вот высокая частота помогла.

Второе. Есть оказывается неправильные карики которые этим дампером корректно считать нельзя. У этих кариков либо не распаян контакт PPU /RD, либо распаян но не работает.
О таких кариках я писал уже на форуме и жаловался что они артефачат на ремейках http://www.emu-land.net/forum/index.php/topic,75737.msg1337411.html#msg1337411
Подключение к шине PPU выбирается подачей PPU A13, а PPU /RD не участвует вообще. Причем бывает чтоPPU /RD подключен к капле, даже звонится защитный диод, но к пзу он не подключен.
Т.к. CPU A13 и PPU A13 обьединены, то при считывании адреса с установленным A13 на шину данных подключены обе пзу, получается мусор каждые несколько килобайт.
В следующей версии дампера логичнее было бы не объединять, а завести PPU A13 на отдельный пин.



Cluster:
Да надо будет заморочиться. Но наверное уже на STM32 буду пробовать.
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии