Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // - Part of GCSaver -
- // Written by Dasda.
- #include <stdio.h>
- #include <stdlib.h>
- #include <gccore.h>
- typedef struct {
- u8 gamecode[4];
- u8 company[2];
- u8 reserved01;
- u8 banner_fmt;
- u8 filename[CARD_FILENAMELEN];
- u32 time;
- u32 icon_addr;
- u16 icon_fmt;
- u16 icon_speed;
- u8 unknown1;
- u8 unknown2;
- u16 index;
- u16 filesize8;
- u16 reserved02;
- u32 comment_addr;
- } __attribute__((__packed__)) GCI;
- int Card_WriteGCI(int Slot, void* Buf)
- {
- GCI* GCI_Header = Buf;
- int FileLen = GCI_Header->filesize8 * 8192;
- CARD_Init(GCI_Header->gamecode, GCI_Header->company);
- u8* CardArea = memalign(32, CARD_WORKAREA);
- memset(CardArea, 0, CARD_WORKAREA);
- int Error = CARD_Mount(Slot, CardArea, NULL);
- if(Error)
- {
- printf("Error: Cannot mount card.\n");
- return -2;
- }
- int SectorSize = 0;
- CARD_GetSectorSize(Slot, &SectorSize);
- card_dir CardDir;
- Error = CARD_FindFirst(Slot, &CardDir, false);
- while(Error != CARD_ERROR_NOFILE)
- {
- if(strcmp(CardDir.filename, GCI_Header->filename) == 0)
- {
- printf("Error: Save already exists.\n");
- CARD_Unmount(Slot);
- return -1;
- }
- Error = CARD_FindNext(&CardDir);
- }
- card_file CardFile;
- Error = CARD_Create(Slot, GCI_Header->filename, FileLen, &CardFile);
- if(Error){
- printf("Error: Cannot open for writing.\n");
- CARD_Unmount(Slot);
- return -3;
- }
- card_stat CardStatus;
- int Offset = 0;
- int Written = 0;
- while(Offset < FileLen)
- {
- if((Offset + SectorSize) <= FileLen){
- Written = CARD_Write(&CardFile, Buf + sizeof(GCI) + Offset, SectorSize, Offset);
- }
- else
- {
- Written = CARD_Write(&CardFile, Buf + sizeof(GCI) + Offset, ((Offset + SectorSize) - FileLen), Offset);
- }
- Offset += SectorSize;
- }
- CARD_SetStatus(Slot, CardFile.filenum, &CardStatus);
- CARD_Close(&CardFile);
- CARD_Unmount(Slot);
- return 1;
- }
Add Comment
Please, Sign In to add comment