Correct, the Everdrive only saves files that would normally be saved to cart.
The Evedrive does however allow backing up a controller pak to SD, so you could use a bad pak, format pak, load backup, load game, save ingame, reset save backup and switch off. next time you switch on you will need to start over but you will now have a save again to continue ingame.
This however only works for some people as, as far as I am aware, Krikzz still hasnt made the 1 line of code change to support all paks. (remove check) If you need to check then a different method is needed.
Basically, Libdragon has a 'feature' to check whether a controller pak or rumble pak is inserted, while the official SDK does not.
3rd party controller paks therefor show as rumble paks (which is why Nintendo didnt use the 'check')
The official way is to treat all paks as controller paks and if you want to save data you check for a success return (which rumble will not return).
This is how nintendo check for rumble and cpak.
u8 pattern; // pretty sure Libdragon also provides pattern
int channel;
int ret; // Return. 0 (No Error) PFS_ERR_ID_FATAL = 10 (dead ram pack) PFS_ERR_DEVICE=11 (wrong device type)
osContInit(&n_siMessageQ, &pattern, contstat); //Initialise controller, return pattern
for (channel = 0 ; channel < MAXCONTROLLERS ; channel ++) { //for 0 to 3 (4 con ports)
joyport[channel] = 0;
if ((pattern >> channel) & 1) { //If port has controller plugged
if ((contstat[channel].type & CONT_JOYPORT) != 0 && (contstat[channel].status & CONT_CARD_ON) != 0) {
// if controller is normal controller and not mouse AND
// Cont_card_on = 1 if something connected to controller
ret = osPfsInitPak(&n_siMessageQ, &pfs[channel], channel); //assume CPak and attempt initialise
/* In case of game application, if PFS_ERR_ID_FATAL occurs */
/* here, ID needs to be restored by player's judgement. */
/* */
/* */
/* if (ret == PFS_ERR_ID_FATAL) */
/* if (AskPlayer()) */
/* ret = osPfsRepairId(&pfs[channel]); */
/* */
/* If only the Rumble Pak is used, Controller Pak does */
/* not need to be initialized. */
if (ret == PFS_ERR_DEVICE) { // Something other than a Controller Pak is inserted into the Controller
ret = osMotorInit(&n_siMessageQ, &pfs[channel], channel); //assume Rumble Pak
if (!ret) { /* Motor is connected */ // !ret is another way of saying ret=0 = success (No Error)
printstr(WHITE, JOY_X-1+channel*DIS_X, JOY_Y + 3, "OK");
joyport[channel] = 1;
} else { /* Device except Motor is connected */
// if wanted you could attempt initialise of GB Pak and continue untill success.
printstr(WHITE, JOY_X-1+channel*DIS_X, JOY_Y + 3, "--");
}
} else if (ret == 0){ /* CPAK is connected */
printstr(WHITE, JOY_X-1+channel*DIS_X, JOY_Y + 3, "CP");
}
}
} //next Controller
Trev