Changed boot type to cold + RI/RDRAM reset (should improve game compatibility)

This commit is contained in:
Mateusz Faderewski 2023-12-06 12:57:01 +01:00
parent 553e986a38
commit cfe4f01e30
6 changed files with 36 additions and 34 deletions

@ -1 +1 @@
Subproject commit 4b38fd5618007e7ed9040107d0f7e52f2de81a22
Subproject commit e6adc2034376158ecb47e7498220336ede442ee9

View File

@ -37,15 +37,26 @@ static void boot_detect_cic_seed (boot_params_t *params) {
void boot (boot_params_t *params) {
if (params->tv_type == BOOT_TV_TYPE_PASSTHROUGH) {
params->tv_type = OS_INFO->tv_type;
switch (get_tv_type()) {
case TV_PAL:
params->tv_type = BOOT_TV_TYPE_PAL;
break;
case TV_NTSC:
params->tv_type = BOOT_TV_TYPE_NTSC;
break;
case TV_MPAL:
params->tv_type = BOOT_TV_TYPE_MPAL;
break;
default:
params->tv_type = BOOT_TV_TYPE_NTSC;
break;
}
}
if (params->detect_cic_seed) {
boot_detect_cic_seed(params);
}
OS_INFO->mem_size_6105 = OS_INFO->mem_size;
C0_WRITE_STATUS(C0_STATUS_CU1 | C0_STATUS_CU0 | C0_STATUS_FR);
while (!(cpu_io_read(&SP->SR) & SP_SR_HALT));
@ -120,7 +131,7 @@ void boot (boot_params_t *params) {
boot_device = (params->device_type & 0x01);
tv_type = (params->tv_type & 0x03);
reset_type = BOOT_RESET_TYPE_NMI;
reset_type = BOOT_RESET_TYPE_COLD;
cic_seed = (params->cic_seed & 0xFF);
version = (params->tv_type == BOOT_TV_TYPE_PAL) ? 6
: (params->tv_type == BOOT_TV_TYPE_NTSC) ? 1

View File

@ -41,7 +41,6 @@ typedef struct {
} boot_params_t;
bool boot_is_warm (void);
void boot (boot_params_t *params);

View File

@ -241,28 +241,6 @@ typedef struct {
#define ROM_CART_BASE (0x10000000UL)
#define ROM_CART ((io32_t *) ROM_CART_BASE)
/** @brief OS Information Structure. */
typedef struct {
uint32_t tv_type;
uint32_t device_type;
uint32_t device_base;
uint32_t reset_type;
uint32_t cic_id;
uint32_t version;
uint32_t mem_size;
uint8_t app_nmi_buffer[64];
uint32_t __reserved_1[37];
uint32_t mem_size_6105;
} os_info_t;
#define OS_INFO_BASE (0x80000300UL)
#define OS_INFO ((os_info_t *) OS_INFO_BASE)
/** @brief The Console was powered on using the power switch. */
#define OS_INFO_RESET_TYPE_COLD (0)
/** @brief The Console was reset using the reset button. */
#define OS_INFO_RESET_TYPE_NMI (1)
static inline uint32_t cpu_io_read (io32_t *address) {
io32_t *uncached = UNCACHED(address);

View File

@ -2,10 +2,15 @@
#define REBOOT_ADDRESS 0xA4001000
#define STACK_ADDRESS 0xA4001FF0
#define RI_ADDRESS 0xA4700000
#define RI_SELECT 0x0C
#define RI_REFRESH 0x10
.set noat
.section .text.reboot, "ax", %progbits
.type reboot, %object
reboot_start:
.global reboot_start
@ -29,6 +34,15 @@ reboot_entry:
li $sp, STACK_ADDRESS
reset_rdram:
bnez $s5, reset_rdram_skip
li $t0, RI_ADDRESS
sw $zero, RI_REFRESH($t0)
sw $zero, RI_SELECT($t0)
reset_rdram_skip:
detect_console_region:
li $t0, 1
beq $s4, $zero, pal_console
@ -37,16 +51,16 @@ detect_console_region:
pal_console:
li $ra, 0xA4001554
b reset_registers
b prepare_registers
ntsc_console:
li $ra, 0xA4001550
b reset_registers
b prepare_registers
mpal_console:
li $ra, 0xA4001554
reset_registers:
prepare_registers:
move $at, $zero
move $v0, $zero
move $v1, $zero
@ -56,7 +70,7 @@ reset_registers:
move $a3, $zero
move $t0, $zero
move $t1, $zero
move $t2, $zero
li $t2, 0x40
move $t4, $zero
move $t5, $zero
move $t6, $zero

View File

@ -157,7 +157,7 @@ static struct views_s {
void menu_run (boot_params_t *boot_params) {
menu_init(boot_params);
while (exception_reset_time() < RESET_TIME_LENGTH) {
while (exception_reset_time() == 0) {
surface_t *display = (frame_counter >= FRAMERATE_DIVIDER) ? display_try_get() : NULL;
if (display != NULL) {