slowboot isn't working yet, doesn't work at all with lightrec,
openbios-fastboot doesn't work with ari64
{
rebootemu = 0;
SysReset();
{
rebootemu = 0;
SysReset();
- if (!Config.HLE && !Config.SlowBoot)
- {
- // skip BIOS logos
- psxRegs.pc = psxRegs.GPR.n.ra;
- }
- return;
ClosePlugins();
OpenPlugins();
SysReset();
ClosePlugins();
OpenPlugins();
SysReset();
- if (CheckCdrom() != -1) {
- LoadCdrom();
- }
static int run_bios(void)
{
static int run_bios(void)
{
+ boolean origSlowBoot = Config.SlowBoot;
+
if (bios_sel == 0)
return -1;
ready_to_go = 0;
if (reload_plugins(NULL) != 0)
return -1;
if (bios_sel == 0)
return -1;
ready_to_go = 0;
if (reload_plugins(NULL) != 0)
return -1;
+ Config.SlowBoot = origSlowBoot;
ready_to_go = 1;
return 0;
ready_to_go = 1;
return 0;
#include "misc.h"
#include "cdrom.h"
#include "mdec.h"
#include "misc.h"
#include "cdrom.h"
#include "mdec.h"
0x02000000, 0x00000000, 0x01ff03ff,
};
0x02000000, 0x00000000, 0x01ff03ff,
};
-static void fake_bios_gpu_setup(void)
psxCpu->Notify(R3000ACPU_NOTIFY_AFTER_LOAD, NULL);
}
psxCpu->Notify(R3000ACPU_NOTIFY_AFTER_LOAD, NULL);
}
+void BiosBootBypass() {
+ assert(psxRegs.pc == 0x80030000);
+
+ // skip BIOS logos and region check
+ psxCpu->Notify(R3000ACPU_NOTIFY_BEFORE_SAVE, NULL);
+ psxRegs.pc = psxRegs.GPR.n.ra;
+}
+
int LoadCdrom() {
EXE_HEADER tmpHead;
struct iso_directory_record *dir;
int LoadCdrom() {
EXE_HEADER tmpHead;
struct iso_directory_record *dir;
u8 mdir[4096];
char exename[256];
u8 mdir[4096];
char exename[256];
- // not the best place to do it, but since BIOS boot logo killer
- // is just below, do it here
- fake_bios_gpu_setup();
-
- if (!Config.HLE && !Config.SlowBoot) {
- // skip BIOS logos
- psxCpu->Notify(R3000ACPU_NOTIFY_BEFORE_SAVE, NULL);
- psxRegs.pc = psxRegs.GPR.n.ra;
- return 0;
+ if (!Config.HLE) {
+ if (!BiosBooted) return 0; // custom BIOS
+ if (psxRegs.pc != 0x80030000) return 0; // BiosBootBypass'ed
+ if (Config.SlowBoot) return 0;
}
time[0] = itob(0); time[1] = itob(2); time[2] = itob(0x10);
}
time[0] = itob(0); time[1] = itob(2); time[2] = itob(0x10);
if (GetCdromFile(mdir, time, "SYSTEM.CNF;1") == -1) {
// if SYSTEM.CNF is missing, start an existing PSX.EXE
if (GetCdromFile(mdir, time, "PSX.EXE;1") == -1) return -1;
if (GetCdromFile(mdir, time, "SYSTEM.CNF;1") == -1) {
// if SYSTEM.CNF is missing, start an existing PSX.EXE
if (GetCdromFile(mdir, time, "PSX.EXE;1") == -1) return -1;
+ strcpy(exename, "PSX.EXE;1");
memcpy(&tmpHead, buf + 12, sizeof(EXE_HEADER));
memcpy(&tmpHead, buf + 12, sizeof(EXE_HEADER));
+ SysPrintf("manual booting '%s'\n", exename);
SetBootRegs(SWAP32(tmpHead.pc0), SWAP32(tmpHead.gp0), SWAP32(tmpHead.s_addr));
tmpHead.t_size = SWAP32(tmpHead.t_size);
SetBootRegs(SWAP32(tmpHead.pc0), SWAP32(tmpHead.gp0), SWAP32(tmpHead.s_addr));
tmpHead.t_size = SWAP32(tmpHead.t_size);
extern char CdromId[10];
extern char CdromLabel[33];
extern char CdromId[10];
extern char CdromLabel[33];
+void BiosLikeGPUSetup();
+void BiosBootBypass();
+
int LoadCdrom();
int LoadCdromFile(const char *filename, EXE_HEADER *head);
int CheckCdrom();
int LoadCdrom();
int LoadCdromFile(const char *filename, EXE_HEADER *head);
int CheckCdrom();
PcsxConfig Config;
boolean NetOpened = FALSE;
PcsxConfig Config;
boolean NetOpened = FALSE;
+boolean BiosBooted = FALSE;
int Log = 0;
FILE *emuLog = NULL;
int Log = 0;
FILE *emuLog = NULL;
boolean cdr_read_timing;
boolean gpu_slow_list_walking;
} hacks;
boolean cdr_read_timing;
boolean gpu_slow_list_walking;
} hacks;
-#ifdef _WIN32
- char Lang[256];
-#endif
} PcsxConfig;
extern PcsxConfig Config;
extern boolean NetOpened;
} PcsxConfig;
extern PcsxConfig Config;
extern boolean NetOpened;
+extern boolean BiosBooted;
struct PcsxSaveFuncs {
void *(*open)(const char *name, const char *mode);
struct PcsxSaveFuncs {
void *(*open)(const char *name, const char *mode);
psxHwReset();
psxBiosInit();
psxHwReset();
psxBiosInit();
+ BiosLikeGPUSetup(); // a bit of a hack but whatever
+
+ BiosBooted = FALSE;
+ if (!Config.HLE) {
+ if (psxRegs.pc == 0x80030000 && !Config.SlowBoot)
+ BiosBootBypass();
+ }
#ifdef EMU_LOG
EMU_LOG("*BIOS END*\n");
#ifdef EMU_LOG
EMU_LOG("*BIOS END*\n");
}
void psxExecuteBios() {
}
void psxExecuteBios() {
- while (psxRegs.pc != 0x80030000)
+ int i;
+ for (i = 0; psxRegs.pc != 0x80030000 && i < 5000000; i++)
+ if (psxRegs.pc == 0x80030000)
+ BiosBooted = TRUE;
+ else
+ SysPrintf("BIOS boot timeout - custom BIOS?\n");