[SC64][SW][SB][SL] Added additional CICs, code formatting

This commit is contained in:
Polprzewodnikowy 2020-10-08 21:50:46 +02:00
parent 527160731f
commit 7025f39fcc
4 changed files with 99 additions and 75 deletions

View File

@ -323,16 +323,18 @@ class SummerBanger64:
def set_cic_type(self, cic_type=0):
cic_lut = {
6101: 0x11,
6102: 0x12,
6103: 0x13,
6105: 0x14,
6106: 0x15,
7101: 0x02,
7102: 0x01,
7103: 0x03,
7105: 0x04,
7106: 0x05,
5101: 0x11,
6101: 0x12,
6102: 0x13,
6103: 0x14,
6105: 0x15,
6106: 0x16,
7101: 0x03,
7102: 0x02,
7103: 0x04,
7105: 0x05,
7106: 0x06,
8303: 0x07,
}
self.__write_word(self.__CIC_TYPE_ADDRESS, int(cic_lut.get(cic_type) or 0))

View File

@ -4,7 +4,7 @@
#include "crc32.h"
#include "n64_regs.h"
cart_header_t global_cart_header __attribute__((aligned(8)));
static cart_header_t global_cart_header __attribute__((aligned(8)));
cart_header_t *boot_load_cart_header(void) {
cart_header_t *cart_header_pointer = &global_cart_header;
@ -18,17 +18,21 @@ cart_header_t *boot_load_cart_header(void) {
cic_type_t boot_get_cic_type(cart_header_t *cart_header) {
switch (crc32_calculate(cart_header->boot_code, sizeof(cart_header->boot_code))) {
case BOOT_CRC32_5101:
return E_CIC_TYPE_5101;
case BOOT_CRC32_6101:
case BOOT_CRC32_7102:
return E_CIC_TYPE_6101;
return E_CIC_TYPE_X101;
case BOOT_CRC32_X102:
return E_CIC_TYPE_6102;
return E_CIC_TYPE_X102;
case BOOT_CRC32_X103:
return E_CIC_TYPE_6103;
return E_CIC_TYPE_X103;
case BOOT_CRC32_X105:
return E_CIC_TYPE_6105;
return E_CIC_TYPE_X105;
case BOOT_CRC32_X106:
return E_CIC_TYPE_6106;
return E_CIC_TYPE_X106;
case BOOT_CRC32_8303:
return E_CIC_TYPE_8303;
default:
return E_CIC_TYPE_UNKNOWN;
}
@ -67,13 +71,15 @@ void boot(cic_type_t cic_type, tv_type_t tv_type) {
volatile uint64_t gpr_regs[32];
const uint8_t cic_seeds[] = {
const uint32_t cic_seeds[] = {
BOOT_SEED_X102,
BOOT_SEED_5101,
BOOT_SEED_X101,
BOOT_SEED_X102,
BOOT_SEED_X103,
BOOT_SEED_X105,
BOOT_SEED_X106,
BOOT_SEED_8303,
};
while (!(SP->status & SP_STATUS_HALT));
@ -105,15 +111,11 @@ void boot(cic_type_t cic_type, tv_type_t tv_type) {
PI->status = PI_STATUS_CLEAR_INTERRUPT | PI_STATUS_RESET_CONTROLLER;
if (cic_type == E_CIC_TYPE_6105) {
OS_BOOT_CONFIG->mem_size_6105 = OS_BOOT_CONFIG->mem_size;
}
for (size_t i = 0; i < ARRAY_ITEMS(SP_MEM->imem); i++) {
SP_MEM->imem[i] = 0;
}
if (cic_type == E_CIC_TYPE_6105) {
if (cic_type == E_CIC_TYPE_X105) {
SP_MEM->imem[0] = 0x3C0DBFC0;
SP_MEM->imem[1] = os_tv_type == E_TV_TYPE_PAL ? 0xBDA807FC : 0x8DA807FC;
SP_MEM->imem[2] = 0x25AD07C0;
@ -124,18 +126,22 @@ void boot(cic_type_t cic_type, tv_type_t tv_type) {
SP_MEM->imem[7] = 0x3C0BB000;
}
if (cic_type == E_CIC_TYPE_X105) {
OS_BOOT_CONFIG->mem_size_6105 = OS_BOOT_CONFIG->mem_size;
}
for (size_t i = 0; i < ARRAY_ITEMS(gpr_regs); i++) {
gpr_regs[i] = 0;
}
gpr_regs[CPU_REG_T3] = (0xFFFFFFFFLL << 32) | ((uint32_t) &SP_MEM->dmem[16]);
gpr_regs[CPU_REG_T3] = CPU_ADDRESS_IN_REG(SP_MEM->dmem[16]);
gpr_regs[CPU_REG_S3] = OS_BOOT_ROM_TYPE_GAME_PAK;
gpr_regs[CPU_REG_S4] = os_tv_type;
gpr_regs[CPU_REG_S6] = cic_seeds[cic_type];
if (os_tv_type == E_TV_TYPE_PAL) {
gpr_regs[CPU_REG_S7] = 6;
}
gpr_regs[CPU_REG_SP] = (0xFFFFFFFFLL << 32) | ((uint32_t) &SP_MEM->imem[ARRAY_ITEMS(SP_MEM->imem) - 4]);
gpr_regs[CPU_REG_RA] = (0xFFFFFFFFLL << 32) | ((uint32_t) &SP_MEM->imem[(os_tv_type == E_TV_TYPE_PAL) ? 341 : 340]);
gpr_regs[CPU_REG_S5] = OS_BOOT_CONFIG->reset_type;
gpr_regs[CPU_REG_S6] = BOOT_SEED_IPL3(cic_seeds[cic_type]);
gpr_regs[CPU_REG_S7] = (os_tv_type == E_TV_TYPE_PAL) ? OS_BOOT_VERSION_PAL : OS_BOOT_VERSION_NTSC;
gpr_regs[CPU_REG_SP] = CPU_ADDRESS_IN_REG(SP_MEM->imem[ARRAY_ITEMS(SP_MEM->imem) - 4]);
gpr_regs[CPU_REG_RA] = CPU_ADDRESS_IN_REG(SP_MEM->imem[(os_tv_type == E_TV_TYPE_PAL) ? 341 : 340]);
__asm__ (
".set noat \n\t"
@ -203,7 +209,7 @@ void boot(cic_type_t cic_type, tv_type_t tv_type) {
"nop"
:
: [gpr_regs] "r" (gpr_regs)
: "t0"
: "t0", "ra"
);
while (1);

View File

@ -1,26 +1,34 @@
#ifndef BOOT_H__
#define BOOT_H__
#define BOOT_CRC32_5101 (0x587BD543)
#define BOOT_CRC32_6101 (0x6170A4A1)
#define BOOT_CRC32_7102 (0x009E9EA3)
#define BOOT_CRC32_X102 (0x90BB6CB5)
#define BOOT_CRC32_X103 (0x0B050EE0)
#define BOOT_CRC32_X105 (0x98BC2C86)
#define BOOT_CRC32_X106 (0xACC8580A)
#define BOOT_CRC32_8303 (0x0E018159)
#define BOOT_SEED_X101 (0x3F)
#define BOOT_SEED_X102 (0x3F)
#define BOOT_SEED_X103 (0x78)
#define BOOT_SEED_X105 (0x91)
#define BOOT_SEED_X106 (0x85)
#define BOOT_SEED_5101 (0x0000AC00)
#define BOOT_SEED_X101 (0x00043F3F)
#define BOOT_SEED_X102 (0x00003F3F)
#define BOOT_SEED_X103 (0x0000783F)
#define BOOT_SEED_X105 (0x0000913F)
#define BOOT_SEED_X106 (0x0000853F)
#define BOOT_SEED_8303 (0x0000DD00)
#define BOOT_SEED_IPL3(x) (((x) & 0x0000FF00) >> 8)
typedef enum cic_type_e {
E_CIC_TYPE_UNKNOWN,
E_CIC_TYPE_6101,
E_CIC_TYPE_6102,
E_CIC_TYPE_6103,
E_CIC_TYPE_6105,
E_CIC_TYPE_6106,
E_CIC_TYPE_5101,
E_CIC_TYPE_X101,
E_CIC_TYPE_X102,
E_CIC_TYPE_X103,
E_CIC_TYPE_X105,
E_CIC_TYPE_X106,
E_CIC_TYPE_8303,
E_CIC_TYPE_END,
} cic_type_t;
@ -68,6 +76,12 @@ typedef struct os_boot_config_s os_boot_config_t;
#define OS_BOOT_CONFIG_BASE (0xA0000300)
#define OS_BOOT_CONFIG ((os_boot_config_t *) OS_BOOT_CONFIG_BASE)
#define OS_BOOT_ROM_TYPE_GAME_PAK (0)
#define OS_BOOT_ROM_TYPE_DD (1)
#define OS_BOOT_VERSION_NTSC (0)
#define OS_BOOT_VERSION_PAL (6)
cart_header_t *boot_load_cart_header(void);
cic_type_t boot_get_cic_type(cart_header_t *cart_header);
tv_type_t boot_get_tv_type(cart_header_t *cart_header);

View File

@ -5,6 +5,8 @@
#define ARRAY_ITEMS(x) (sizeof(x) / sizeof(x[0]))
#define CPU_ADDRESS_IN_REG(x) ((0xFFFFFFFFULL << 32) | ((uint32_t) (&(x))))
#define CPU_REG_Z0 (0)
#define CPU_REG_AT (1)
#define CPU_REG_V0 (2)