Guest User

Untitled

a guest
Mar 17th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.93 KB | None | 0 0
  1. // - Part of GCSaver -
  2. // Written by Dasda.
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <gccore.h>
  7.  
  8. typedef struct {
  9. u8 gamecode[4];
  10. u8 company[2];
  11. u8 reserved01;
  12. u8 banner_fmt;
  13. u8 filename[CARD_FILENAMELEN];
  14. u32 time;
  15. u32 icon_addr;
  16. u16 icon_fmt;
  17. u16 icon_speed;
  18. u8 unknown1;
  19. u8 unknown2;
  20. u16 index;
  21. u16 filesize8;
  22. u16 reserved02;
  23. u32 comment_addr;
  24. } __attribute__((__packed__)) GCI;
  25.  
  26. int Card_WriteGCI(int Slot, void* Buf)
  27. {
  28. GCI* GCI_Header = Buf;
  29. int FileLen = GCI_Header->filesize8 * 8192;
  30. CARD_Init(GCI_Header->gamecode, GCI_Header->company);
  31.  
  32. u8* CardArea = memalign(32, CARD_WORKAREA);
  33. memset(CardArea, 0, CARD_WORKAREA);
  34. int Error = CARD_Mount(Slot, CardArea, NULL);
  35. if(Error)
  36. {
  37. printf("Error: Cannot mount card.\n");
  38. return -2;
  39. }
  40.  
  41. int SectorSize = 0;
  42. CARD_GetSectorSize(Slot, &SectorSize);
  43.  
  44. card_dir CardDir;
  45. Error = CARD_FindFirst(Slot, &CardDir, false);
  46. while(Error != CARD_ERROR_NOFILE)
  47. {
  48. if(strcmp(CardDir.filename, GCI_Header->filename) == 0)
  49. {
  50. printf("Error: Save already exists.\n");
  51. CARD_Unmount(Slot);
  52. return -1;
  53. }
  54. Error = CARD_FindNext(&CardDir);
  55. }
  56.  
  57. card_file CardFile;
  58. Error = CARD_Create(Slot, GCI_Header->filename, FileLen, &CardFile);
  59. if(Error){
  60. printf("Error: Cannot open for writing.\n");
  61. CARD_Unmount(Slot);
  62. return -3;
  63. }
  64.  
  65. card_stat CardStatus;
  66.  
  67. int Offset = 0;
  68. int Written = 0;
  69. while(Offset < FileLen)
  70. {
  71. if((Offset + SectorSize) <= FileLen){
  72. Written = CARD_Write(&CardFile, Buf + sizeof(GCI) + Offset, SectorSize, Offset);
  73. }
  74. else
  75. {
  76. Written = CARD_Write(&CardFile, Buf + sizeof(GCI) + Offset, ((Offset + SectorSize) - FileLen), Offset);
  77. }
  78. Offset += SectorSize;
  79. }
  80.  
  81. CARD_SetStatus(Slot, CardFile.filenum, &CardStatus);
  82. CARD_Close(&CardFile);
  83. CARD_Unmount(Slot);
  84. return 1;
  85. }
Add Comment
Please, Sign In to add comment