Podgląd pojedynczego posta
Stary 14.04.2008, 13:17   #4
ffgriever
Stały bywalec ;)
 
Data rejestracji: 02.12.2006
Posty: 100
ffgriever zaczyna zdobywać reputację <1 - 49 pkt>
Cytat:
Napisany przez Berion Podgląd Wiadomości
[...]*.sub to dane pochodzące z subkanałów. Tylko nie wiem na cholerę to, jak *.bin takowe dane przechowuje.[...]
Bin nie przechowuje danych subkanałowych. Subkanały to trochę danych, które normalnie dość rzadko się przydają (głównie przy odtwarzaniu audio). Najważniejsza część to struktura subq. Wygląda to mniej więcej tak:

Kod:
typedef struct SubQ {
	u8 ControlAndADR; //opisuje z czym mamy do czynienia, ewentualnie bit "copy protected"
	u8 TrackNumber; //mówi samo za siebie
	u8 IndexNumber; //podobnie
	u8 TrackRelativeAddress[3]; //odległość M:S:F (BCD) od początku ścieżki
	u8 Filler; //powinno byćzerem
	u8 AbsoluteAddress[3]; //odległość M:S:F (BCD) od początku płyty

} SubQ_t;

typedef struct SubChan {
	s8 trx1[12]; //zwykle zere
	SubQ_t SubQData; //struktura subq
	s8 trx2[74]; //zwykle zera
} SubChan_t;
Z tym, że psx potrafi przekazać tylko niewielką część tej całości. W psx przekazywane są (czyli dostępne dla programisty) tylko:

TrackNumber
IndexNumber
TrackRelativeAddress
AbsoluteAddress

Do tego napęd psx nie zwraca błędnych danych subkanałowych w ogóle! Jeśli dane są błędne, zwracane są ostatnie poprawne dane, jakie udało się odczytać. To ogranicza możliwość stosowania subkanałów - nie można w nich zapisać jakiejś informacji i na psx ją odczytać...

Przykładowo, squaresoft w swoich grach zastosował bardzo prostą metodę zabezpieczania przed kopiowaniem (cóż, wtedy subkanały były jeszcze problemem). Jako akumulator i rejestry kontrolne wykorzystuje niektóre rejestry cop0 (tylko cztery z nich BPC - breakpoint PC, BPD - breakpoint data, BPCM - breakpoint PC mask, BDAM - breakpoint data mask; z tym, że wyższe bity są tak ustawione, aby "przy okazji" spowodować breakpoint, jeśli wykonuje się jakiś kod w obszarze parallel... tak poza tym rejestry te są wykorzystywane wbrew ich przeznaczeniu ). Za każdym przebiegiem mnoży akumulator przez dwa, dodając uprzednio lub nie jeden do akumulatora (w zależności, czy dane otrzymane z odczytu subkanałów zgadzają się czy nie z zapisanymi w tablicy - jeśli wypalarka poprawiła dane subkanałowe to zostają zwrócone poprawne, nowe dane, co brane jest jako błąd i jedynka nie jest dodawana... jeśli dane są błędne, tak jak powinny, to jedynka jest dodana). Na koniec sprawdzana jest wartość z akumulatora i porównywana... tak mamy całe "superprzebiegłe" ( ) zabezpieczenie subkanałowe w psx (jak do tej pory wszystkie gry na psx, zabezpieczone subkanałami korzystały z tego rozwiązania lub wariantu z niewielkimi zmianami). We wszystkich grach można to złamać zmieniając co najwyżej 4 bajty (a w FF8, FF9, Saga Frontier 2, zmieniając tylko jeden BIT).

No ale na tym skończę wykład o zabezpieczeniach subkanałowych w psx, bo zostanę wyklęty przez tutejszego inkwizytora (szara strefa ).

Reasumując: Berion, nie masz racji .
ffgriever jest offline   Odpowiedz cytując ten post