150 in 1
Type | multi | Mapper | ? | Original mapper | 0 | PCB marks | 150-1 | Tags: | | Uploaded: | 2021-08-27 08:48:51 |
| |
Elements:
Chip signature:
27F080+6224+74273+7302+74153+74161+7432+74157
PCB top:
PCB bottom:
Shell top:
No photo
Shell bottom:
No photo
Screenshoots:
Extra info:
Ostatnio trafił w moje ręce pewien tajemniczy kartridż od jednego z grupowiczów. Układy w nim występujące (74*161 + 74*32 + 74*157 + 74*273 + 74*02 + 74*153) i konfiguracja pamięci (512 kB PRG-ROM + 8 kB CHR-RAM) zdradzały, że to jakaś składanka kilkunastu) prostych gier typu UNROM + NROM. Kartridż oczywiście nie działał.
Po odczytaniu ROMu i analizie częstości wystąpień poszczególnych bajtów (histogram) usterka od razu stała się jasna: w pliku występują jedynie bajty nieparzyste, zatem linia D0 od pamięci jest uszkodzona (przywarta do stanu wysokiego, a pomiar wykazał występowanie na niej stale 3.3V).
Aby uratować ten kartridż, należało odzyskać oryginalną zawartość pamięci. Napisałem prosty program, który porównuję pierwsze 16384 bajtów odczytanej kości z każdym z ROMów z popularnej bazy wszystkich gier (GoodNES), nie zwracając uwagi na przekłamany bit D0. Najbliższy okazał się plik "110-in-1 (Menu).nes", jednak nie jest to dokładnie ten sam kartridż (w pierwszych 16kB występuje 3587 bajtów różnicy, a poza tym w pliku zawarte jest jedynie menu).
Widać to zresztą na początku pliku - tam różnice występuję tez na innych bitach.
Jak więc odzyskać zawartość pamięci? Porównanie zawartości z plikiem 110-in-1 widać, że:
* pod adresem 0x58 jest wartość 0x00 (0b00000000)
* pod adresem 0x59 jest wartość 0x85 (0b10000101)
Odczyt z kości dla drugiego adresu zgadza się, a dla pierwszego nie i wynosi 0b00000001, co nie dziwi, bo bit D0 jest zwarty wewnątrz do stanu wysokiego.
Wpadłem na pewien pomysł, który zrealizowałem za pomocą "swojego" programatora (zbudowałem go kiedyś, gdy nie miałem jeszcze sklepowego):
Porównałem pobór prądu pobieranego przez pamięć, gdy na szynie adresowej wystawiamy adres do pierwszej oraz do drugiej komórki pamięci.
W pierwszym przypadku wychodzi 35.3 mA, a w drugim 7.5mA. Pobór jest większy gdyż pamięć "próbuje" wystawić na szynie wartość z bitem D0 = 0, który to jest gdzieś dalej zwierany do zasilania, co powoduje dodatkowy pobór prądu "uciekający" do zasilania. Jednak ten nadmierny pobór jest tu zbawieniem, gdyż pozwoli łatwo odróżnić, czy dla danej komórki bit D0 powinien być 0 (większy pobór) czy 1 (mniejszy pobór). Oczywiście nie miałem zamiaru wystawiania każdego z adresów ręcznego i notowania poboru prądu, gdyż zajęłoby mi to chyba resztę życia..
Wystarczyło stworzyć prosty przetwornik prąd->napięcie (na tranzystorowym kluczu) i podpiąć go do linii D0 w programatorze (a potem po sczytaniu zanegować jej wartość)...
Rezystor 39R powoduje spadek napięcia przy prądzie 35.3 mA około 300mV lub 1.3V - zależnie czy pobór prądu jest mniejszy czy większy (różnica wystarczając do załączenia lub nie załączenia tranzystora, a jednocześnie nie za duży, aby pamięć działała jeszcze poprawnie przy tak obniżonym zasilaniu) - tak naprawdę baza tranzystora i tak nie pozwala, aby napięcie zasilania spadło mniej niż ~0.7V. No i et voila - udało się odczytać zawartość, zaprogramować nową pamięć i naprawić kartridż.
Comments:
Want to leave a comment?