Приставки > Картриджи / диски
Нужна помощь с дампом карика REALTEC
(1/1)
DrMefistO:
Дамп прикладываю. Всем желающим помочь, читать:
https://code.google.com/p/genplus-gx/source/browse/trunk/docs/REALTEC+Cart+Mapper+-+description+v1.txt?r=31
https://github.com/ekeeke/Genesis-Plus-GX/blob/341f093fb1847793846585c51324ab6d718a8534/core/cart_hw/md_cart.c (поиск по слову realtec)
Пробовал писать так же как в роме для переключения банка (скрипт на Lua, для моей дампилки):
--- Код: ---for m = 0, 0xFF do
rom.write_byte(0x402000, 4);
end
for m = 0, 0xFF do
rom.write_byte(0x404000, 0);
end
for m = 0, 0xFF do
rom.write_byte(0x400000, 1);
end
--- Конец кода ---
не помогло. С адреса 0x2000 все равно зеркалятся первые 0x2000 байт.
Rumata:
Что хоть дампишь-то? Анализ схемы картриджа делал? Может там другое переключение :-\
DrMefistO:
Rumata, игруля зовется Tom Clown. Схему не анализировал, только дамп (по нему, собственно и делал анализ), ну и плюс доку по мапперу читал. На схеме только две капли, и один кондер (не понимаю, что там можно высмотреть без распиливания капли).
Rumata:
Капли - это хуже. Просто просмотр адресных линий помогает хотя бы оценить объём и всё такое. Хорошо, если маппер такой же. Хотя по коду похоже.
Tom Clown - это этот?
DrMefistO:
Rumata, да, это он.
только вместо микрухи капля. даже дырки остались под нее.
Rumata:
Да, бывают с двойной разводкой. Кстати, на этой плате для записи используется /UWR (B29). У тебя в дампере он задействован? И сброс /VRES (B27).
DrMefistO:
Rumata, /UWR задействовали буквально сегодня) а вот /VRES не делал. Когда именно его нужно дергать?
--- Код: ---void byteWrite(unsigned long addr, byte value, int CARTState) {
int i;
CEHigh();
OEHigh();
LWRHigh();
UWRHigh();
shiftOut24bit(addrClockPin, addrLatchPin, addrDataPin, addr >> 1);
if((CARTState && addr <= 0x3FFFFF) || (!CARTState && addr >= 0x400000 && addr <= 0x7FFFFF)) {
CELow();
}
if(addr >= 0xA13000 && addr <= 0xA130FF) {
TIMELow();
}
ASLow();
value = ((value & 0xFF) | ((value & 0xFF) << 8));
for(i = 0; i <= DATA_PINS; i++) {
pinMode(dataPin[i], OUTPUT);
if(value & (1 << i)) {
digitalWrite(dataPin[i], HIGH);
} else {
digitalWrite(dataPin[i], LOW);
}
}
if(addr % 2) {
LWRLow();
} else {
UWRLow();
}
delayMicroseconds(opDelay);
LWRHigh();
UWRHigh();
TIMEHigh();
ASHigh();
CEHigh();
}
--- Конец кода ---
--- Код: ---word wordRead(unsigned long addr, int CARTState) {
word data = 0;
int i;
for(i = 0; i < DATA_PINS; i++) {
pinMode(dataPin[i], INPUT);
}
CEHigh();
OEHigh();
LWRHigh();
UWRHigh();
shiftOut24bit(addrClockPin, addrLatchPin, addrDataPin, addr >> 1);
if((CARTState && addr <= 0x3FFFFF) || (!CARTState && addr >= 0x400000 && addr <= 0x7FFFFF)) {
CELow();
}
if(addr <= 0xDFFFFF) {
OELow();
}
if(addr >= 0xA13000 && addr <= 0xA130FF) {
TIMELow();
}
ASLow();
delayMicroseconds(opDelay);
for(i = 0; i < DATA_PINS; i++) {
if(digitalRead(dataPin[i])) {
data |= (1 << i);
}
}
TIMEHigh();
ASHigh();
LWRHigh();
UWRHigh();
CEHigh();
OEHigh();
return data;
}
--- Конец кода ---
Rumata:
Ну мне эти коды мало что говорят :) На /UWR я обратил внимание потому, что в картриджах обычно задействован /LWR. Приставка-то при записи словом будет генерить оба
DrMefistO:
Rumata, ну, код я кинул, чтобы ты глянул, правильно ли я устанавливаю и сбрасываю пины перед чтением/записью.
А когда должна дергаться нога /VRES?
Rumata:
/VRES - это вообще сброс по кнопке. Но и при начальном включении тоже должен формироваться. Он же сброс процессора
HardWareMan:
--- Цитата: Rumata от 23 Апрель 2015, 01:04:15 ---/VRES - это вообще сброс по кнопке. Но и при начальном включении тоже должен формироваться. Он же сброс процессора
--- Конец цитаты ---
Он еще может быть сгенерирован самим процессором на 64 такта по команде.
DrMefistO:
Ну тогда это все есть уже.
DrMefistO:
Просьба удалить тему за ненадобностью более!
Навигация
Перейти к полной версии