Rename Cart.cpp/h to gamecart.c/h, actually use its header file
This commit is contained in:
parent
c4959d20a5
commit
2c131f4c63
@ -1,12 +0,0 @@
|
||||
#pragma once
|
||||
#include "types.h"
|
||||
|
||||
void Cart_Init();
|
||||
int Cart_IsInserted();
|
||||
void Cart_ReadSectorSD(uint8_t* aBuffer,uint32_t aSector);
|
||||
u32 SendReadCommand( uint32_t adr, uint32_t length, uint32_t blocks, void * buffer );
|
||||
u32 GetHeader( void * buffer );
|
||||
u32 CTR_SendCommand( uint32_t command[4], uint32_t pageSize, uint32_t blocks, uint32_t latency, void * buffer );
|
||||
int Cart_Nin_Init();
|
||||
uint32_t Cart_GetID();
|
||||
// void Cart_Secure_Init(uint32_t *buf,uint32_t *out);
|
12
include/gamecart.h
Normal file
12
include/gamecart.h
Normal file
@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
#include "common.h"
|
||||
|
||||
void Cart_Init();
|
||||
int Cart_IsInserted();
|
||||
void Cart_ReadSectorSD(u8* aBuffer, u32 aSector);
|
||||
u32 SendReadCommand(u32 adr, u32 length, u32 blocks, void * buffer);
|
||||
u32 GetHeader(void* buffer);
|
||||
u32 CTR_SendCommand(u32 command[4], u32 pageSize, u32 blocks, u32 latency, void* buffer);
|
||||
int Cart_Nin_Init();
|
||||
u32 Cart_GetID();
|
||||
void Cart_Secure_Init(u32* buf, u32* out);
|
@ -8,7 +8,7 @@
|
||||
//#include "DrawCharacter.h"
|
||||
#include "misc.h"
|
||||
|
||||
extern "C" void ioDelay( u32 us );
|
||||
void ioDelay( u32 us );
|
||||
extern u8* bottomScreen;
|
||||
|
||||
int CartInited=0;
|
||||
@ -163,7 +163,7 @@ void NTR_SendCommand( u32 command[2], u32 pageSize, u32 latency, void * buffer )
|
||||
//lastCmd[0] = command[0];lastCmd[1] = command[1];
|
||||
}
|
||||
|
||||
extern "C" void CTR_SendCommand( u32 command[4], u32 pageSize, u32 blocks, u32 latency, void * buffer )
|
||||
void CTR_SendCommand( u32 command[4], u32 pageSize, u32 blocks, u32 latency, void * buffer )
|
||||
{
|
||||
REG_CTRCARDCMD[0] = command[3];
|
||||
REG_CTRCARDCMD[1] = command[2];
|
||||
@ -301,12 +301,12 @@ void Cart_ReadSectorSD(u8* aBuffer,u32 aSector)
|
||||
CTR_SendCommand( readheader_cmd, 0x200, 1, 0x100802C, aBuffer );
|
||||
}
|
||||
|
||||
extern "C" u32 Cart_GetID()
|
||||
u32 Cart_GetID()
|
||||
{
|
||||
return CartID;
|
||||
}
|
||||
|
||||
extern "C" void Cart_Init()
|
||||
void Cart_Init()
|
||||
{
|
||||
//Skip init if its already been done
|
||||
//if(CartInited) return;
|
||||
@ -374,13 +374,13 @@ extern "C" void Cart_Init()
|
||||
CartInited = 1;
|
||||
}
|
||||
|
||||
extern "C" void SendReadCommand( u32 sector, u32 length, u32 blocks, void * buffer )
|
||||
void SendReadCommand( u32 sector, u32 length, u32 blocks, void * buffer )
|
||||
{
|
||||
u32 read_cmd[4] = { (0xBF000000 | (u32)(sector>>23)), (u32)((sector<<9) & 0xFFFFFFFF), 0x00000000, 0x00000000 };
|
||||
CTR_SendCommand( read_cmd, length, blocks, 0x100822C, buffer );
|
||||
}
|
||||
|
||||
extern "C" void GetHeader( void * buffer )
|
||||
void GetHeader( void * buffer )
|
||||
{
|
||||
u32 readheader_cmd[4] = { 0x82000000, 0x00000000, 0x00000000, 0x00000000 };
|
||||
CTR_SendCommand( readheader_cmd, 0x200, 1, 0x4802C, buffer );
|
||||
@ -438,9 +438,11 @@ void ctr_set_sec_seed(u32 *seed, bool flag) {
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" void AES_SetKeyControl(u32 a);
|
||||
void AES_SetKeyControl(u32 a) {
|
||||
*((volatile u8*)0x10009011) = a | 0x80;
|
||||
}
|
||||
|
||||
extern "C" void Cart_Secure_Init(u32 *buf,u32 *out)
|
||||
void Cart_Secure_Init(u32 *buf,u32 *out)
|
||||
{
|
||||
AES_SetKeyControl(0x3B);
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "framebuffer.h"
|
||||
#include "hid.h"
|
||||
#include "fatfs/ff.h"
|
||||
#include "gamecart.h"
|
||||
|
||||
extern s32 CartID;
|
||||
extern s32 CartID2;
|
||||
@ -26,22 +27,13 @@ void wait_key() {
|
||||
InputWait();
|
||||
}
|
||||
|
||||
void AES_SetKeyControl(u32 a) {
|
||||
*((volatile u8*)0x10009011) = a | 0x80;
|
||||
}
|
||||
|
||||
void print_status(u8 *Str, u32 x, u32 y, u8 color)
|
||||
{
|
||||
Debug(Str);
|
||||
}
|
||||
|
||||
int main() {
|
||||
|
||||
// Setup boring stuff - clear the screen, initialize SD output, etc...
|
||||
ClearTop();
|
||||
Debug("");
|
||||
Debug("Hello world from ARM9!");
|
||||
print_status("ROM dump tool v0.2", 1, 1, 0xFF);
|
||||
Debug("ROM dump tool v0.2", 1, 1, 0xFF);
|
||||
wait_key();
|
||||
|
||||
u8 file_path[38];
|
||||
@ -59,7 +51,7 @@ int main() {
|
||||
volatile u8* header = (vu8*)0x23000000;
|
||||
u32 *ptr = (u32*)(target + 0x0100);
|
||||
|
||||
print_status("ROM dump tool v0.2", 1, 1, 0xFF);
|
||||
Debug("ROM dump tool v0.2", 1, 1, 0xFF);
|
||||
memset((u8*)target, 0x00, 0x100000); // Clear our 1 MB buffer
|
||||
// clear_screens(0x00);
|
||||
|
||||
@ -73,7 +65,7 @@ int main() {
|
||||
return 0;
|
||||
}
|
||||
Debug("Successfully f_mounted");
|
||||
print_status("cleared stuff! Initializing game card...", 1, 1, 0xFF);
|
||||
Debug("cleared stuff! Initializing game card...", 1, 1, 0xFF);
|
||||
|
||||
|
||||
|
||||
@ -84,7 +76,7 @@ int main() {
|
||||
Debug("Done! Cart id is %08x, press A...", (u32)Cart_GetID());
|
||||
|
||||
while((*((vu16*)0x10146000) & 1)); // Wait for button A
|
||||
print_status("Done waiting :)...", 1, 1, 0xFF);
|
||||
Debug("Done waiting :)...", 1, 1, 0xFF);
|
||||
|
||||
GetHeader(header);
|
||||
Debug("Done reading header: %08x :)...", *(u32*)&header[0x100]);
|
||||
@ -97,19 +89,19 @@ int main() {
|
||||
wait_key();
|
||||
return 0;
|
||||
}
|
||||
print_status("Done checking NCSD magic:)...", 1, 1, 0xFF);
|
||||
Debug("Done checking NCSD magic:)...", 1, 1, 0xFF);
|
||||
*/
|
||||
|
||||
|
||||
|
||||
uint32_t sec_keys[4];
|
||||
u32 sec_keys[4];
|
||||
Cart_Secure_Init((u32*)header,sec_keys);
|
||||
|
||||
uint32_t mediaUnit = 0x200;
|
||||
uint32_t ramCache = 0xC000; //24MB/s - 0x1000000
|
||||
u32 mediaUnit = 0x200;
|
||||
u32 ramCache = 0xC000; //24MB/s - 0x1000000
|
||||
|
||||
uint32_t dumpSize = 0x100000; //1MB
|
||||
uint32_t blocks = dumpSize / mediaUnit; //1MB of blocks
|
||||
u32 dumpSize = 0x100000; //1MB
|
||||
u32 blocks = dumpSize / mediaUnit; //1MB of blocks
|
||||
|
||||
// Read out the header 0x0000-0x1000
|
||||
SendReadCommand( 0, mediaUnit, 8, (void*)(target) );
|
||||
@ -132,29 +124,29 @@ int main() {
|
||||
wait_key();
|
||||
|
||||
// Write header to file
|
||||
uint32_t written = 0;
|
||||
u32 written = 0;
|
||||
f_write(&file, target, 0x4000, &written);
|
||||
f_sync(&file);
|
||||
Debug("Wrote header");
|
||||
wait_key();
|
||||
|
||||
|
||||
uint32_t cartSize = (*((uint32_t*)&target[0x104]));
|
||||
u32 cartSize = (*((u32*)&target[0x104]));
|
||||
Debug("Cart size: %d MB", cartSize * 0x200 / 1024/1024);
|
||||
wait_key();
|
||||
|
||||
// Dump remaining data
|
||||
for(uint32_t adr=0x20; adr<cartSize; adr+=ramCache)
|
||||
for(u32 adr=0x20; adr<cartSize; adr+=ramCache)
|
||||
{
|
||||
ClearTop();
|
||||
Debug("Wrote 0x%x bytes, e.g. %08x",bytes_written, *(u32*)target);
|
||||
uint32_t dumped = cartSize - adr;
|
||||
u32 dumped = cartSize - adr;
|
||||
if(dumped > ramCache) dumped = ramCache;
|
||||
|
||||
for(uint32_t adr2=0; (adr2 < dumped); adr2+=blocks)
|
||||
for(u32 adr2=0; (adr2 < dumped); adr2+=blocks)
|
||||
{
|
||||
uint32_t currentSector = (adr+adr2);
|
||||
uint32_t percent = ((currentSector*100)/cartSize);
|
||||
u32 currentSector = (adr+adr2);
|
||||
u32 percent = ((currentSector*100)/cartSize);
|
||||
if ((adr2 % (blocks*3)) == blocks*2)
|
||||
Debug("Dumping %08X / %08X - %03d%%",currentSector,cartSize,percent);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user