Skip to content

Commit

Permalink
refactored. added write RAM function
Browse files Browse the repository at this point in the history
  • Loading branch information
abrugsch committed Apr 7, 2016
1 parent 6125ee3 commit 5581819
Showing 1 changed file with 166 additions and 75 deletions.
241 changes: 166 additions & 75 deletions gbcartslurp.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,12 @@ const int readPins = 0x01;
const int writePins = 0x06;
int addrFD=0;
int dataFD=0;

char gameTitle[17];
int cartridgeType = 0;
int romSize = 0;
int ramSize = 0;
int romBanks = 2; // Default 32K
int ramBanks = 1;
//only going to touch bank A on the data bus chip
void changeDataBusMode(int mode)
{
Expand Down Expand Up @@ -169,36 +174,8 @@ void test()
}
//0x
}
int main(int argc, char* argv[])
void readCartInfo()
{
//init wiringpi
wiringPiSetup();
mcp23017Setup(100,0x20);
addrFD = mcpSetup(0x20);
dataFD = mcpSetup(0x21);
if(addrFD < 0 || dataFD < 0)
{
perror("I2C setup failed");
puts("Setup Failed\r\n");
return 1;
}

//mcp23017Setup(AddrBusBase,0x20);
//mcp23017Setup(DataBusBase,0x21);
setIO();
writeMCPByte(dataFD,allHigh,1);
//pinWrite(rdPin, HIGH);
//pinWrite(wrPin, HIGH);
//pinWrite(mreqPin, HIGH);

#ifdef _TEST

test();
return 0;
#endif

// Read Cartridge Header
char gameTitle[17];
char outString[255];
unsigned int addr = 0x0134;
for (; addr <= 0x0143; addr++) {
Expand All @@ -208,31 +185,12 @@ int main(int argc, char* argv[])
sprintf(outString, "game: %s",gameTitle);
puts(outString);

char gameFile[25];
sprintf(gameFile, "cart.gb");//, gameTitle);
puts(gameFile);

FILE* fp = fopen(gameFile, "w+"); //create a new file to write into. overwrite an existing
if (!fp)
{
perror("File opening failed");
return 1;
}
FILE* logfp = fopen("logfile.bin","w+");
if(!logfp)
{
perror("log opening failed");
return 1;
}
fwrite(gameTitle,25,1,logfp);
//fclose(logfp);
//fclose(fp);
//return 0;

int cartridgeType = readGBByte(0x0147);
int romSize = readGBByte(0x0148);
int ramSize = readGBByte(0x0149);
int romBanks = 2; // Default 32K

cartridgeType = readGBByte(0x0147);
romSize = readGBByte(0x0148);
ramSize = readGBByte(0x0149);
romBanks = 2; // Default 32K
switch(romSize)
{
case 1:
Expand Down Expand Up @@ -265,14 +223,35 @@ int main(int argc, char* argv[])
case 84:
romBanks = 96;
}
int ramBanks = 1; // Default 8K RAM

ramBanks = 1; // Default 8K RAM
if (ramSize == 3) { ramBanks = 4; }
if (ramSize == 4){ ramBanks = 16; } // GB Camera
}
int DumpRom()
{
char gameFile[25];
sprintf(gameFile, "%s.gb", gameTitle);
puts(gameFile);
FILE* fp = fopen(gameFile, "w+"); //create a new file to write into. overwrite an existing
if (!fp)
{
perror("File opening failed");
return 1;
}
//FILE* logfp = fopen("logfile.bin","w+");
//if(!logfp)
//{
// perror("log opening failed");
// return 1;
//}
//fwrite(gameTitle,25,1,logfp);
//fclose(logfp);
//fclose(fp);
//return 0;


addr = 0;
char infoString[100];
int addr = 0;
//char infoString[100];

printf("**********DUMPING ROM %s ************\r\n",gameFile);
//dump ROM
Expand Down Expand Up @@ -302,10 +281,10 @@ int main(int argc, char* argv[])
readData[i] = ch;
unsigned short tmp = (unsigned short)addr+i;
sprintf(buf,"%05d",tmp);
fwrite(buf,5,1,logfp);
fwrite(": ",2,1,logfp);
//fwrite(buf,5,1,logfp);
//fwrite(": ",2,1,logfp);
sprintf(buf,"%02X\n\r",ch);
fwrite(buf,4,1,logfp);
//fwrite(buf,4,1,logfp);
}
fwrite(readData, 1, 64,fp);
printf("#");
Expand All @@ -317,40 +296,112 @@ int main(int argc, char* argv[])
puts("]");

}
fclose(logfp);
//fclose(logfp);
fclose(fp);
//dump ram if there is one
return 0;
}
int WriteRam(char* FileName)
{
// MBC2 Fix (unknown why this fixes it, maybe has to read ROM before RAM?)
readGBByte(0x0134);

addr = 0;
unsigned char writeData[64];
int addr = 0;
unsigned int endaddr = 0;
if (cartridgeType == 6 && ramSize == 0)
endaddr = 0xA1FF; // MBC2 512bytes (nibbles)
if (ramSize == 1)
endaddr = 0xA7FF; // 2K RAM
if (ramSize > 1)
endaddr = 0xBFFF; // 8K RAM

endaddr = 0xBFFF; // 8K RAM
// Does cartridge have RAM
if (endaddr > 0)
{
puts("**********DUMPING RAM************");

sprintf(gameFile, "%s.sav", gameTitle);
fp = fopen(gameFile, "w+"); //create a new file to write into. overwrite an existing
if (!fp) {
//char saveFile[25];
//sprintf(saveFile, "%s.sav", gameTitle);
//puts(saveFile);
FILE* fp = fopen(FileName, "r"); //create a new file to write into. overwrite an existing
if (!fp)
{
perror("File opening failed");
return 1;
}
}
printf("**********Writing RAM %s ************\r\n",FileName);

// Initialise MBC
writeGBByte(0x0000, 0x0A);
char infoString[100];

// Switch RAM banks
int bank;
for (bank = 0; bank < ramBanks; bank++)
{
sprintf(infoString, "------Writing bank %d of %d\r\n\r\n[", bank+1, ramBanks -1);
puts(infoString);

writeGBByte(0x4000, bank);

// Read RAM
int j = 1;
for (addr = 0xA000; addr <= endaddr; addr = addr + 64)
{
int i;
fread(writeData,1,64,fp);
for (i = 0; i < 64; i++){
writeGBByte(addr+i, writeData[i]);
//readData[i] = readGBByte(addr + i);
}
//fwrite(readData, 1, 64, fp);
printf("#");
fflush(stdout);
if (j++ % 32 == 0)
puts(".");
}
puts("]");
}
fclose(fp);
// Disable RAM
writeGBByte(0x0000, 0x00);
}
else
puts("*********No RAM found************");
return 0;
}
int DumpRam()
{
// MBC2 Fix (unknown why this fixes it, maybe has to read ROM before RAM?)
readGBByte(0x0134);
unsigned char readData[64];
int addr = 0;
unsigned int endaddr = 0;
if (cartridgeType == 6 && ramSize == 0)
endaddr = 0xA1FF; // MBC2 512bytes (nibbles)
if (ramSize == 1)
endaddr = 0xA7FF; // 2K RAM
if (ramSize > 1)
endaddr = 0xBFFF; // 8K RAM
// Does cartridge have RAM
if (endaddr > 0)
{
char saveFile[25];
sprintf(saveFile, "%s.sav", gameTitle);
puts(saveFile);
FILE* fp = fopen(saveFile, "w+"); //create a new file to write into. overwrite an existing
if (!fp)
{
perror("File opening failed");
return 1;
}
printf("**********DUMPING RAM %s ************\r\n",saveFile);

// Initialise MBC
writeGBByte(0x0000, 0x0A);
char infoString[100];

// Switch RAM banks
int bank;
for (bank = 0; bank < ramBanks; bank++)
{
sprintf(infoString, "------Dumping bank %d of %d\r\n\r\n[", bank, ramBanks -1);
sprintf(infoString, "------Dumping bank %d of %d\r\n\r\n[", bank+1, ramBanks -1);
puts(infoString);

writeGBByte(0x4000, bank);
Expand All @@ -377,6 +428,46 @@ int main(int argc, char* argv[])
}
else
puts("*********No RAM found************");
return 0;

}
int main(int argc, char* argv[])
{
//init wiringpi
wiringPiSetup();
mcp23017Setup(100,0x20);
addrFD = mcpSetup(0x20);
dataFD = mcpSetup(0x21);
if(addrFD < 0 || dataFD < 0)
{
perror("I2C setup failed");
puts("Setup Failed\r\n");
return 1;
}

//mcp23017Setup(AddrBusBase,0x20);
//mcp23017Setup(DataBusBase,0x21);
setIO();
writeMCPByte(dataFD,allHigh,1);
//pinWrite(rdPin, HIGH);
//pinWrite(wrPin, HIGH);
//pinWrite(mreqPin, HIGH);

#ifdef _TEST

test();
return 0;
#endif

// Read Cartridge Header
readCartInfo();

if(DumpRom())
return 1;

//dump ram if there is one
if(DumpRam())
return 1;


puts("Done");
Expand Down

0 comments on commit 5581819

Please sign in to comment.