BizHawk/yabause/src/psp/misc.c

120 lines
3.3 KiB
C

/* src/psp/misc.c: PSP support routines
Copyright 2009 Andrew Church
This file is part of Yabause.
Yabause is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Yabause is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Yabause; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "common.h"
#include "../memory.h"
#include "config.h"
#include "misc.h"
#include "sys.h"
/*************************************************************************/
/************************** Interface routines ***************************/
/*************************************************************************/
/**
* save_backup_ram: Save the contents of backup RAM to the configured
* file.
*
* [Parameters]
* None
* [Return value]
* Nonzero on success, zero on failure
*/
extern int save_backup_ram(void)
{
const char *path = config_get_path_bup();
if (!path || !*path) {
DMSG("No backup RAM file configured!");
goto error_return;
}
/* Lock the power switch while writing so the user (hopefully) can't
* shut the PSP off on us. */
scePowerLock(0);
int fd = sceIoOpen(path, PSP_O_WRONLY | PSP_O_CREAT | PSP_O_TRUNC, 0600);
if (fd < 0) {
DMSG("open(%s): %s", path, psp_strerror(fd));
goto error_unlock_power;
}
int res = sceIoWrite(fd, BupRam, 0x10000);
if (res != 0x10000) {
DMSG("write(%s): %s", path, psp_strerror(fd));
sceIoClose(fd);
goto error_unlock_power;
}
res = sceIoClose(fd);
if (res != 0) {
DMSG("close(%s): %s", path, psp_strerror(fd));
goto error_unlock_power;
}
/* All done--don't forget to unlock the power switch before returning! */
scePowerUnlock(0);
return 1;
error_unlock_power:
scePowerUnlock(0);
error_return:
return 0;
}
/*************************************************************************/
/**
* psp_writeback_cache_for_scsp: Write back all dirty data from the SC's
* cache for an ScspExec() call, depending on the writeback frequency
* selected by the user.
*
* [Parameters]
* None
* [Return value]
* Nonzero if writeback was executed, zero if writeback was skipped
*/
int psp_writeback_cache_for_scsp(void)
{
static uint32_t counter;
counter++;
if (!(counter & (config_get_me_writeback_period() - 1))) {
sceKernelDcacheWritebackAll();
return 1;
} else {
return 0;
}
}
/*************************************************************************/
/*************************************************************************/
/*
* Local variables:
* c-file-style: "stroustrup"
* c-file-offsets: ((case-label . *) (statement-case-intro . *))
* indent-tabs-mode: nil
* End:
*
* vim: expandtab shiftwidth=4:
*/