120 lines
3.3 KiB
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:
|
|
*/
|