mirror of
https://github.com/Polprzewodnikowy/SummerCart64.git
synced 2024-11-25 15:16:53 +01:00
more cleanup
This commit is contained in:
parent
1be4836288
commit
733cc17ba7
@ -1,14 +1,15 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
GIT_SHA=$(git rev-parse --short HEAD)
|
GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
||||||
|
GIT_SHA=$(git rev-parse HEAD)
|
||||||
GIT_TAG=$(git describe --tags --exact-match 2> /dev/null)
|
GIT_TAG=$(git describe --tags --exact-match 2> /dev/null)
|
||||||
|
|
||||||
if [ ! -z $GIT_TAG ]; then
|
if [ -z $GIT_TAG ]; then
|
||||||
__SC64_VERSION=$(printf "%.7q\ %.7q" $GIT_SHA $GIT_TAG)
|
GIT_TAG="develop"
|
||||||
else
|
|
||||||
__SC64_VERSION=$(printf "%.7q\ develop" $GIT_SHA)
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
__SC64_VERSION=$(printf "[ %q | %q | %q ]" $GIT_BRANCH $GIT_TAG $GIT_SHA)
|
||||||
|
|
||||||
docker run \
|
docker run \
|
||||||
--rm \
|
--rm \
|
||||||
--user $(id -u):$(id -g) \
|
--user $(id -u):$(id -g) \
|
||||||
|
@ -15,6 +15,7 @@ BUILD_DIR = build
|
|||||||
|
|
||||||
SRC_FILES = \
|
SRC_FILES = \
|
||||||
startup.S \
|
startup.S \
|
||||||
|
ipl2.S \
|
||||||
exception.S \
|
exception.S \
|
||||||
boot.c \
|
boot.c \
|
||||||
crc32.c \
|
crc32.c \
|
||||||
@ -23,10 +24,10 @@ SRC_FILES = \
|
|||||||
font.c \
|
font.c \
|
||||||
init.c \
|
init.c \
|
||||||
interrupt.c \
|
interrupt.c \
|
||||||
|
io.c \
|
||||||
main.c \
|
main.c \
|
||||||
sc64.c \
|
sc64.c \
|
||||||
storage.c \
|
storage.c \
|
||||||
sys.c \
|
|
||||||
syscalls.c \
|
syscalls.c \
|
||||||
fatfs/diskio.c \
|
fatfs/diskio.c \
|
||||||
fatfs/ff.c \
|
fatfs/ff.c \
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "boot.h"
|
#include "boot.h"
|
||||||
#include "crc32.h"
|
#include "crc32.h"
|
||||||
#include "sys.h"
|
#include "init.h"
|
||||||
|
#include "io.h"
|
||||||
|
|
||||||
|
|
||||||
extern uint32_t ipl2 __attribute__((section(".data")));
|
extern uint32_t ipl2 __attribute__((section(".data")));
|
||||||
@ -131,6 +132,8 @@ void boot (boot_info_t *info) {
|
|||||||
io_write(&ipl3_dst[i], pi_io_read(&ipl3_src[i]));
|
io_write(&ipl3_dst[i], pi_io_read(&ipl3_src[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deinit();
|
||||||
|
|
||||||
register void (*entry_point)(void) asm ("t3");
|
register void (*entry_point)(void) asm ("t3");
|
||||||
register uint32_t boot_device asm ("s3");
|
register uint32_t boot_device asm ("s3");
|
||||||
register uint32_t tv_type asm ("s4");
|
register uint32_t tv_type asm ("s4");
|
||||||
@ -148,10 +151,8 @@ void boot (boot_info_t *info) {
|
|||||||
stack_pointer = (void *) UNCACHED(&SP_MEM->IMEM[1020]);
|
stack_pointer = (void *) UNCACHED(&SP_MEM->IMEM[1020]);
|
||||||
|
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"mtc0 %[status], $12 \n"
|
|
||||||
"move $sp, %[stack_pointer] \n"
|
"move $sp, %[stack_pointer] \n"
|
||||||
"jr %[entry_point] \n" ::
|
"jr %[entry_point] \n" ::
|
||||||
[status] "r" (C0_SR_CU1 | C0_SR_CU0 | C0_SR_FR),
|
|
||||||
[entry_point] "r" (entry_point),
|
[entry_point] "r" (entry_point),
|
||||||
[boot_device] "r" (boot_device),
|
[boot_device] "r" (boot_device),
|
||||||
[tv_type] "r" (tv_type),
|
[tv_type] "r" (tv_type),
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
#include "error.h"
|
|
||||||
#include "exception.h"
|
#include "exception.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,62 +1,47 @@
|
|||||||
#define VECTOR_LOCATION (0xA0000000UL)
|
#include "regs.h"
|
||||||
#define VECTOR_SIZE (0x80)
|
|
||||||
#define VECTOR_NUM (4)
|
|
||||||
|
|
||||||
#define HIT_INVALIDATE_I ((4 << 2) | 0)
|
|
||||||
|
|
||||||
#define TICKS_PER_SECOND (93750000UL / 2)
|
#define WATCHDOG_TIMEOUT (10 * (93750000UL / 2))
|
||||||
#define WATCHDOG_TIMEOUT (10)
|
|
||||||
|
|
||||||
#define C0_COUNT $9
|
#define VECTOR_LOCATION (0xA0000000UL)
|
||||||
#define C0_COMPARE $11
|
#define VECTOR_SIZE (0x80)
|
||||||
#define C0_STATUS $12
|
#define VECTOR_NUM (4)
|
||||||
#define C0_CAUSE $13
|
|
||||||
#define C0_EPC $14
|
|
||||||
|
|
||||||
#define INTERRUPT_ENABLE (1 << 0)
|
#define AT_OFFSET (8)
|
||||||
#define INTERRUPT_MASK_TIMER (1 << 15)
|
#define V0_OFFSET (16)
|
||||||
|
#define V1_OFFSET (24)
|
||||||
#define EXCEPTION_CODE_MASK (0x007C)
|
#define A0_OFFSET (32)
|
||||||
#define EXCEPTION_CODE_BIT (2)
|
#define A1_OFFSET (40)
|
||||||
#define INTERRUPT_PENDING_MASK (0xFF00)
|
#define A2_OFFSET (48)
|
||||||
#define INTERRUPT_PENDING_BIT (8)
|
#define A3_OFFSET (56)
|
||||||
#define INTERRUPT_PENDING_TIMER (1 << 7)
|
#define T0_OFFSET (64)
|
||||||
|
#define T1_OFFSET (72)
|
||||||
#define AT_OFFSET (8)
|
#define T2_OFFSET (80)
|
||||||
#define V0_OFFSET (16)
|
#define T3_OFFSET (88)
|
||||||
#define V1_OFFSET (24)
|
#define T4_OFFSET (96)
|
||||||
#define A0_OFFSET (32)
|
#define T5_OFFSET (104)
|
||||||
#define A1_OFFSET (40)
|
#define T6_OFFSET (112)
|
||||||
#define A2_OFFSET (48)
|
#define T7_OFFSET (120)
|
||||||
#define A3_OFFSET (56)
|
#define S0_OFFSET (128)
|
||||||
#define T0_OFFSET (64)
|
#define S1_OFFSET (136)
|
||||||
#define T1_OFFSET (72)
|
#define S2_OFFSET (144)
|
||||||
#define T2_OFFSET (80)
|
#define S3_OFFSET (152)
|
||||||
#define T3_OFFSET (88)
|
#define S4_OFFSET (160)
|
||||||
#define T4_OFFSET (96)
|
#define S5_OFFSET (168)
|
||||||
#define T5_OFFSET (104)
|
#define S6_OFFSET (176)
|
||||||
#define T6_OFFSET (112)
|
#define S7_OFFSET (184)
|
||||||
#define T7_OFFSET (120)
|
#define T8_OFFSET (192)
|
||||||
#define S0_OFFSET (128)
|
#define T9_OFFSET (200)
|
||||||
#define S1_OFFSET (136)
|
#define K0_OFFSET (208)
|
||||||
#define S2_OFFSET (144)
|
#define K1_OFFSET (216)
|
||||||
#define S3_OFFSET (152)
|
#define GP_OFFSET (224)
|
||||||
#define S4_OFFSET (160)
|
#define SP_OFFSET (232)
|
||||||
#define S5_OFFSET (168)
|
#define FP_OFFSET (240)
|
||||||
#define S6_OFFSET (176)
|
#define RA_OFFSET (248)
|
||||||
#define S7_OFFSET (184)
|
#define C0_STATUS_OFFSET (256)
|
||||||
#define T8_OFFSET (192)
|
#define C0_CAUSE_OFFSET (260)
|
||||||
#define T9_OFFSET (200)
|
#define C0_EPC_OFFSET (264)
|
||||||
#define K0_OFFSET (208)
|
#define SAVE_REGISTERS_SIZE (272)
|
||||||
#define K1_OFFSET (216)
|
|
||||||
#define GP_OFFSET (224)
|
|
||||||
#define SP_OFFSET (232)
|
|
||||||
#define FP_OFFSET (240)
|
|
||||||
#define RA_OFFSET (248)
|
|
||||||
#define C0_STATUS_OFFSET (256)
|
|
||||||
#define C0_CAUSE_OFFSET (260)
|
|
||||||
#define C0_EPC_OFFSET (264)
|
|
||||||
#define SAVE_REGISTERS_SIZE (272)
|
|
||||||
|
|
||||||
|
|
||||||
.section .text.exception_handler
|
.section .text.exception_handler
|
||||||
@ -96,17 +81,17 @@ exception_handler:
|
|||||||
|
|
||||||
move $sp, $k0
|
move $sp, $k0
|
||||||
|
|
||||||
exception_is_fatal:
|
exception_check_type:
|
||||||
mfc0 $a0, C0_CAUSE
|
mfc0 $a0, C0_CAUSE
|
||||||
sw $a0, C0_CAUSE_OFFSET($k0)
|
sw $a0, C0_CAUSE_OFFSET($k0)
|
||||||
move $a1, $a0
|
move $a1, $a0
|
||||||
andi $a0, EXCEPTION_CODE_MASK
|
move $t0, $a0
|
||||||
srl $a0, $a0, EXCEPTION_CODE_BIT
|
andi $t0, C0_CR_IP7
|
||||||
andi $a1, INTERRUPT_PENDING_MASK
|
andi $a0, C0_CR_EC_MASK
|
||||||
srl $a1, $a1, INTERRUPT_PENDING_BIT
|
srl $a0, $a0, C0_CR_EC_BIT
|
||||||
move $t0, $a1
|
andi $a1, C0_CR_IP_MASK
|
||||||
andi $t0, INTERRUPT_PENDING_TIMER
|
srl $a1, $a1, C0_CR_IP_BIT
|
||||||
bne $t0, $zero, exception_fatal
|
# bne $t0, $zero, exception_fatal
|
||||||
beq $a0, $zero, exception_interrupt
|
beq $a0, $zero, exception_interrupt
|
||||||
|
|
||||||
exception_fatal:
|
exception_fatal:
|
||||||
@ -194,10 +179,47 @@ exception_install:
|
|||||||
bne $t4, $t5, 2b
|
bne $t4, $t5, 2b
|
||||||
addiu $t1, VECTOR_SIZE
|
addiu $t1, VECTOR_SIZE
|
||||||
bne $t1, $t2, 1b
|
bne $t1, $t2, 1b
|
||||||
mtc0 $zero, C0_COUNT
|
jr $ra
|
||||||
li $t7, (WATCHDOG_TIMEOUT * TICKS_PER_SECOND)
|
|
||||||
mtc0 $t7, C0_COMPARE
|
|
||||||
mfc0 $t7, C0_STATUS
|
.section .text.exception_disable_interrupts
|
||||||
ori $t7, (INTERRUPT_MASK_TIMER | INTERRUPT_ENABLE)
|
exception_disable_interrupts:
|
||||||
mtc0 $t7, C0_STATUS
|
.global exception_disable_interrupts
|
||||||
|
mfc0 $t0, C0_STATUS
|
||||||
|
li $t1, ~(C0_SR_IE)
|
||||||
|
and $t0, $t0, $t1
|
||||||
|
mtc0 $t0, C0_STATUS
|
||||||
|
jr $ra
|
||||||
|
|
||||||
|
|
||||||
|
.section .text.exception_enable_interrupts
|
||||||
|
exception_enable_interrupts:
|
||||||
|
.global exception_enable_interrupts
|
||||||
|
mfc0 $t0, C0_STATUS
|
||||||
|
li $t1, C0_SR_IE
|
||||||
|
or $t0, $t0, $t1
|
||||||
|
mtc0 $t0, C0_STATUS
|
||||||
|
jr $ra
|
||||||
|
|
||||||
|
|
||||||
|
.section .text.exception_enable_watchdog
|
||||||
|
exception_enable_watchdog:
|
||||||
|
.global exception_enable_watchdog
|
||||||
|
mtc0 $zero, C0_COUNT
|
||||||
|
li $t1, WATCHDOG_TIMEOUT
|
||||||
|
mtc0 $t1, C0_COMPARE
|
||||||
|
mfc0 $t0, C0_STATUS
|
||||||
|
li $t1, C0_SR_IM7
|
||||||
|
or $t0, $t0, $t1
|
||||||
|
mtc0 $t0, C0_STATUS
|
||||||
|
jr $ra
|
||||||
|
|
||||||
|
|
||||||
|
.section .text.exception_disable_watchdog
|
||||||
|
exception_disable_watchdog:
|
||||||
|
.global exception_disable_watchdog
|
||||||
|
mfc0 $t0, C0_STATUS
|
||||||
|
li $t1, ~(C0_SR_IM7)
|
||||||
|
and $t0, $t0, $t1
|
||||||
|
mtc0 $t0, C0_STATUS
|
||||||
jr $ra
|
jr $ra
|
||||||
|
@ -2,7 +2,12 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "exception.h"
|
#include "exception.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "sys.h"
|
#include "io.h"
|
||||||
|
#include "regs.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define STR(x) #x
|
||||||
|
#define XSTR(s) STR(s)
|
||||||
|
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
@ -217,8 +222,8 @@ void exception_fatal_handler (uint32_t exception_code, uint32_t interrupt_mask,
|
|||||||
exception_print(&x, &y, "s4: 0x%08lX, s5: 0x%08lX, s6: 0x%08lX, s7: 0x%08lX", e->s4.u32, e->s5.u32, e->s6.u32, e->s7.u32);
|
exception_print(&x, &y, "s4: 0x%08lX, s5: 0x%08lX, s6: 0x%08lX, s7: 0x%08lX", e->s4.u32, e->s5.u32, e->s6.u32, e->s7.u32);
|
||||||
exception_print(&x, &y, "t8: 0x%08lX, t9: 0x%08lX, k0: 0x%08lX, k1: 0x%08lX", e->t8.u32, e->t9.u32, e->k0.u32, e->k1.u32);
|
exception_print(&x, &y, "t8: 0x%08lX, t9: 0x%08lX, k0: 0x%08lX, k1: 0x%08lX", e->t8.u32, e->t9.u32, e->k0.u32, e->k1.u32);
|
||||||
exception_print(&x, &y, "gp: 0x%08lX, sp: 0x%08lX, fp: 0x%08lX, ra: 0x%08lX\n", e->gp.u32, e->sp.u32, e->fp.u32, e->ra.u32);
|
exception_print(&x, &y, "gp: 0x%08lX, sp: 0x%08lX, fp: 0x%08lX, ra: 0x%08lX\n", e->gp.u32, e->sp.u32, e->fp.u32, e->ra.u32);
|
||||||
exception_print(&x, &y, "0x%08lX: 0x%08lX = [%4s]\n", (uint32_t) (&SC64->VERSION), sc64_version, (char *) (&sc64_version));
|
exception_print(&x, &y, "0x%08lX: 0x%08lX = [%4s]", (uint32_t) (&SC64->VERSION), sc64_version, (char *) (&sc64_version));
|
||||||
exception_print(&x, &y, "------------------------------------------------------------------------\n");
|
exception_print(&x, &y, "%s\n", XSTR(__SC64_VERSION));
|
||||||
|
|
||||||
if (exception_code == EXCEPTION_INTERRUPT) {
|
if (exception_code == EXCEPTION_INTERRUPT) {
|
||||||
if (interrupt_mask & INTERRUPT_MASK_TIMER) {
|
if (interrupt_mask & INTERRUPT_MASK_TIMER) {
|
||||||
|
@ -2,10 +2,17 @@
|
|||||||
#define EXCEPTION_H__
|
#define EXCEPTION_H__
|
||||||
|
|
||||||
|
|
||||||
#define EXCEPTION_TRIGGER(code) { asm volatile ("syscall %[c]\n" :: [c] "i" (code)); }
|
#define TRIGGER_CODE_ERROR (0)
|
||||||
|
#define TRIGGER_CODE_ASSERT (16)
|
||||||
|
|
||||||
#define TRIGGER_CODE_ERROR (0)
|
#define EXCEPTION_TRIGGER(code) { asm volatile ("syscall %[c]\n" :: [c] "i" (code)); }
|
||||||
#define TRIGGER_CODE_ASSERT (16)
|
|
||||||
|
|
||||||
|
void exception_install (void);
|
||||||
|
void exception_enable_interrupts (void);
|
||||||
|
void exception_disable_interrupts (void);
|
||||||
|
void exception_enable_watchdog (void);
|
||||||
|
void exception_disable_watchdog (void);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "sys.h"
|
#include "exception.h"
|
||||||
|
#include "io.h"
|
||||||
#include "sc64.h"
|
#include "sc64.h"
|
||||||
|
|
||||||
|
|
||||||
@ -6,5 +7,14 @@ void init (void) {
|
|||||||
uint32_t pifram = si_io_read((io32_t *) (&PIFRAM[0x3C]));
|
uint32_t pifram = si_io_read((io32_t *) (&PIFRAM[0x3C]));
|
||||||
si_io_write((io32_t *) (&PIFRAM[0x3C]), pifram | 0x08);
|
si_io_write((io32_t *) (&PIFRAM[0x3C]), pifram | 0x08);
|
||||||
|
|
||||||
|
exception_install();
|
||||||
|
exception_enable_watchdog();
|
||||||
|
exception_enable_interrupts();
|
||||||
|
|
||||||
sc64_init();
|
sc64_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void deinit (void) {
|
||||||
|
exception_disable_interrupts();
|
||||||
|
exception_disable_watchdog();
|
||||||
|
}
|
||||||
|
9
sw/n64/src/init.h
Normal file
9
sw/n64/src/init.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef INIT_H__
|
||||||
|
#define INIT_H__
|
||||||
|
|
||||||
|
|
||||||
|
void init (void);
|
||||||
|
void deinit (void);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -1,4 +1,4 @@
|
|||||||
#include "sc64.h"
|
#include "io.h"
|
||||||
|
|
||||||
|
|
||||||
void exception_interrupt_handler (uint32_t exception_code, uint32_t interrupt_mask) {
|
void exception_interrupt_handler (uint32_t exception_code, uint32_t interrupt_mask) {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#include "sys.h"
|
#include "io.h"
|
||||||
|
|
||||||
|
|
||||||
uint32_t io_read (io32_t *address) {
|
uint32_t io_read (io32_t *address) {
|
@ -1,5 +1,5 @@
|
|||||||
#ifndef SYS_H__
|
#ifndef IO_H__
|
||||||
#define SYS_H__
|
#define IO_H__
|
||||||
|
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
@ -15,47 +15,6 @@ typedef volatile uint32_t io32_t;
|
|||||||
#define UNCACHED(address) ((typeof(address)) (((io32_t) (address)) | (0xA0000000UL)))
|
#define UNCACHED(address) ((typeof(address)) (((io32_t) (address)) | (0xA0000000UL)))
|
||||||
|
|
||||||
|
|
||||||
#define C0_SR_IE (1 << 0)
|
|
||||||
#define C0_SR_EXL (1 << 1)
|
|
||||||
#define C0_SR_EXR (1 << 2)
|
|
||||||
#define C0_SR_KSU0 (1 << 3)
|
|
||||||
#define C0_SR_KSU1 (1 << 4)
|
|
||||||
#define C0_SR_UX (1 << 5)
|
|
||||||
#define C0_SR_SX (1 << 6)
|
|
||||||
#define C0_SR_KX (1 << 7)
|
|
||||||
#define C0_SR_IM0 (1 << 8)
|
|
||||||
#define C0_SR_IM1 (1 << 9)
|
|
||||||
#define C0_SR_IM2 (1 << 10)
|
|
||||||
#define C0_SR_IM3 (1 << 11)
|
|
||||||
#define C0_SR_IM4 (1 << 12)
|
|
||||||
#define C0_SR_IM5 (1 << 13)
|
|
||||||
#define C0_SR_IM6 (1 << 14)
|
|
||||||
#define C0_SR_IM7 (1 << 15)
|
|
||||||
#define C0_SR_DS_DE (1 << 16)
|
|
||||||
#define C0_SR_DS_CE (1 << 17)
|
|
||||||
#define C0_SR_DS_CH (1 << 18)
|
|
||||||
#define C0_SR_DS_SR (1 << 20)
|
|
||||||
#define C0_SR_DS_TS (1 << 21)
|
|
||||||
#define C0_SR_DS_BEV (1 << 22)
|
|
||||||
#define C0_SR_DS_ITS (1 << 24)
|
|
||||||
#define C0_SR_RE (1 << 25)
|
|
||||||
#define C0_SR_FR (1 << 26)
|
|
||||||
#define C0_SR_RP (1 << 27)
|
|
||||||
#define C0_SR_CU0 (1 << 28)
|
|
||||||
#define C0_SR_CU1 (1 << 29)
|
|
||||||
#define C0_SR_CU2 (1 << 30)
|
|
||||||
#define C0_SR_CU3 (1 << 31)
|
|
||||||
|
|
||||||
#define C0_CR_IP0 (1 << 8)
|
|
||||||
#define C0_CR_IP1 (1 << 9)
|
|
||||||
#define C0_CR_IP2 (1 << 9)
|
|
||||||
#define C0_CR_IP3 (1 << 9)
|
|
||||||
#define C0_CR_IP4 (1 << 9)
|
|
||||||
#define C0_CR_IP5 (1 << 9)
|
|
||||||
#define C0_CR_IP6 (1 << 9)
|
|
||||||
#define C0_CR_IP7 (1 << 9)
|
|
||||||
#define C0_CR_BD (1 << 31)
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
io32_t DMEM[1024];
|
io32_t DMEM[1024];
|
||||||
io32_t IMEM[1024];
|
io32_t IMEM[1024];
|
15
sw/n64/src/ipl2.S
Normal file
15
sw/n64/src/ipl2.S
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
.set noat
|
||||||
|
.set noreorder
|
||||||
|
|
||||||
|
.section .text.ipl2
|
||||||
|
ipl2:
|
||||||
|
.global ipl2
|
||||||
|
lui $t5, 0xBFC0
|
||||||
|
1:
|
||||||
|
lw $t0, 0x7FC($t5)
|
||||||
|
addiu $t5, $t5, 0x7C0
|
||||||
|
andi $t0, $t0, 0x80
|
||||||
|
bnel $t0, $zero, 1b
|
||||||
|
lui $t5, 0xBFC0
|
||||||
|
lw $t0, 0x24($t5)
|
||||||
|
lui $t3, 0xB000
|
@ -13,10 +13,14 @@ void main (void) {
|
|||||||
sc64_get_info(&sc64_info);
|
sc64_get_info(&sc64_info);
|
||||||
|
|
||||||
switch (sc64_info.boot_mode) {
|
switch (sc64_info.boot_mode) {
|
||||||
case BOOT_MODE_MENU:
|
case BOOT_MODE_MENU_SD:
|
||||||
storage_run_menu(STORAGE_BACKEND_SD, &boot_info, &sc64_info);
|
storage_run_menu(STORAGE_BACKEND_SD, &boot_info, &sc64_info);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case BOOT_MODE_MENU_USB:
|
||||||
|
storage_run_menu(STORAGE_BACKEND_USB, &boot_info, &sc64_info);
|
||||||
|
break;
|
||||||
|
|
||||||
case BOOT_MODE_ROM:
|
case BOOT_MODE_ROM:
|
||||||
boot_info.device_type = BOOT_DEVICE_TYPE_ROM;
|
boot_info.device_type = BOOT_DEVICE_TYPE_ROM;
|
||||||
break;
|
break;
|
||||||
@ -25,10 +29,6 @@ void main (void) {
|
|||||||
boot_info.device_type = BOOT_DEVICE_TYPE_DD;
|
boot_info.device_type = BOOT_DEVICE_TYPE_DD;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BOOT_MODE_MENU_USB:
|
|
||||||
storage_run_menu(STORAGE_BACKEND_USB, &boot_info, &sc64_info);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
error_display("Unknown boot mode selected [%d]", sc64_info.boot_mode);
|
error_display("Unknown boot mode selected [%d]", sc64_info.boot_mode);
|
||||||
break;
|
break;
|
||||||
|
70
sw/n64/src/regs.h
Normal file
70
sw/n64/src/regs.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#ifndef REGS_H__
|
||||||
|
#define REGS_H__
|
||||||
|
|
||||||
|
|
||||||
|
#define HIT_INVALIDATE_I ((4 << 2) | 0)
|
||||||
|
|
||||||
|
|
||||||
|
#define C0_COUNT $9
|
||||||
|
#define C0_COMPARE $11
|
||||||
|
#define C0_STATUS $12
|
||||||
|
#define C0_CAUSE $13
|
||||||
|
#define C0_EPC $14
|
||||||
|
|
||||||
|
|
||||||
|
#define C0_SR_IE (1 << 0)
|
||||||
|
#define C0_SR_EXL (1 << 1)
|
||||||
|
#define C0_SR_EXR (1 << 2)
|
||||||
|
#define C0_SR_KSU0 (1 << 3)
|
||||||
|
#define C0_SR_KSU1 (1 << 4)
|
||||||
|
#define C0_SR_UX (1 << 5)
|
||||||
|
#define C0_SR_SX (1 << 6)
|
||||||
|
#define C0_SR_KX (1 << 7)
|
||||||
|
#define C0_SR_IM0 (1 << 8)
|
||||||
|
#define C0_SR_IM1 (1 << 9)
|
||||||
|
#define C0_SR_IM2 (1 << 10)
|
||||||
|
#define C0_SR_IM3 (1 << 11)
|
||||||
|
#define C0_SR_IM4 (1 << 12)
|
||||||
|
#define C0_SR_IM5 (1 << 13)
|
||||||
|
#define C0_SR_IM6 (1 << 14)
|
||||||
|
#define C0_SR_IM7 (1 << 15)
|
||||||
|
#define C0_SR_DS_DE (1 << 16)
|
||||||
|
#define C0_SR_DS_CE (1 << 17)
|
||||||
|
#define C0_SR_DS_CH (1 << 18)
|
||||||
|
#define C0_SR_DS_SR (1 << 20)
|
||||||
|
#define C0_SR_DS_TS (1 << 21)
|
||||||
|
#define C0_SR_DS_BEV (1 << 22)
|
||||||
|
#define C0_SR_DS_ITS (1 << 24)
|
||||||
|
#define C0_SR_RE (1 << 25)
|
||||||
|
#define C0_SR_FR (1 << 26)
|
||||||
|
#define C0_SR_RP (1 << 27)
|
||||||
|
#define C0_SR_CU0 (1 << 28)
|
||||||
|
#define C0_SR_CU1 (1 << 29)
|
||||||
|
#define C0_SR_CU2 (1 << 30)
|
||||||
|
#define C0_SR_CU3 (1 << 31)
|
||||||
|
|
||||||
|
|
||||||
|
#define C0_CR_EC0 (1 << 2)
|
||||||
|
#define C0_CR_EC1 (1 << 3)
|
||||||
|
#define C0_CR_EC2 (1 << 4)
|
||||||
|
#define C0_CR_EC3 (1 << 5)
|
||||||
|
#define C0_CR_EC4 (1 << 6)
|
||||||
|
#define C0_CR_IP0 (1 << 8)
|
||||||
|
#define C0_CR_IP1 (1 << 9)
|
||||||
|
#define C0_CR_IP2 (1 << 10)
|
||||||
|
#define C0_CR_IP3 (1 << 11)
|
||||||
|
#define C0_CR_IP4 (1 << 12)
|
||||||
|
#define C0_CR_IP5 (1 << 13)
|
||||||
|
#define C0_CR_IP6 (1 << 14)
|
||||||
|
#define C0_CR_IP7 (1 << 15)
|
||||||
|
#define C0_CR_CE0 (1 << 28)
|
||||||
|
#define C0_CR_CE1 (1 << 29)
|
||||||
|
#define C0_CR_BD (1 << 31)
|
||||||
|
|
||||||
|
#define C0_CR_EC_MASK (C0_CR_EC4 | C0_CR_EC3 | C0_CR_EC2 | C0_CR_EC1 | C0_CR_EC0)
|
||||||
|
#define C0_CR_EC_BIT (2)
|
||||||
|
#define C0_CR_IP_MASK (C0_CR_IP7 | C0_CR_IP6 | C0_CR_IP5 | C0_CR_IP4 | C0_CR_IP3 | C0_CR_IP2 | C0_CR_IP1 | C0_CR_IP0)
|
||||||
|
#define C0_CR_IP_BIT (8)
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -5,7 +5,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "sys.h"
|
#include "io.h"
|
||||||
|
|
||||||
|
|
||||||
#define SC64_CMD_CONFIG ('C')
|
#define SC64_CMD_CONFIG ('C')
|
||||||
@ -67,11 +67,11 @@ typedef enum {
|
|||||||
} tv_type_t;
|
} tv_type_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
BOOT_MODE_MENU = 0,
|
BOOT_MODE_MENU_SD = 0,
|
||||||
BOOT_MODE_ROM = 1,
|
BOOT_MODE_MENU_USB = 1,
|
||||||
BOOT_MODE_DDIPL = 2,
|
BOOT_MODE_ROM = 2,
|
||||||
BOOT_MODE_DIRECT = 3,
|
BOOT_MODE_DDIPL = 3,
|
||||||
BOOT_MODE_MENU_USB = 4,
|
BOOT_MODE_DIRECT = 4,
|
||||||
} boot_mode_t;
|
} boot_mode_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -1,8 +1,3 @@
|
|||||||
#define STR(x) #x
|
|
||||||
#define XSTR(s) STR(s)
|
|
||||||
#define VERSION XSTR(__SC64_VERSION)
|
|
||||||
|
|
||||||
|
|
||||||
.section .text.rom_header
|
.section .text.rom_header
|
||||||
header_pi_config:
|
header_pi_config:
|
||||||
.word 0x80371240
|
.word 0x80371240
|
||||||
@ -22,8 +17,7 @@ header_crc:
|
|||||||
.org 0x20, 0x00
|
.org 0x20, 0x00
|
||||||
header_text_info:
|
header_text_info:
|
||||||
.global header_text_info
|
.global header_text_info
|
||||||
.ascii "SummerLoader64 "
|
.ascii "n64boot SummerCart64"
|
||||||
.ascii VERSION
|
|
||||||
.org 0x40, 0x00
|
.org 0x40, 0x00
|
||||||
|
|
||||||
|
|
||||||
@ -39,9 +33,6 @@ entry_handler:
|
|||||||
la $gp, _gp
|
la $gp, _gp
|
||||||
la $sp, _sp
|
la $sp, _sp
|
||||||
|
|
||||||
la $t0, exception_install
|
|
||||||
jalr $t0
|
|
||||||
|
|
||||||
la $t0, init
|
la $t0, init
|
||||||
jalr $t0
|
jalr $t0
|
||||||
|
|
||||||
@ -50,19 +41,3 @@ entry_handler:
|
|||||||
|
|
||||||
loop:
|
loop:
|
||||||
j loop
|
j loop
|
||||||
|
|
||||||
|
|
||||||
.section .text.ipl2
|
|
||||||
ipl2:
|
|
||||||
.global ipl2
|
|
||||||
.set noat
|
|
||||||
.set noreorder
|
|
||||||
lui $t5, 0xBFC0
|
|
||||||
1:
|
|
||||||
lw $t0, 0x7FC($t5)
|
|
||||||
addiu $t5, $t5, 0x7C0
|
|
||||||
andi $t0, $t0, 0x80
|
|
||||||
bnel $t0, $zero, 1b
|
|
||||||
lui $t5, 0xBFC0
|
|
||||||
lw $t0, 0x24($t5)
|
|
||||||
lui $t3, 0xB000
|
|
||||||
|
@ -275,10 +275,10 @@ class SC64:
|
|||||||
return "Unknown"
|
return "Unknown"
|
||||||
return {
|
return {
|
||||||
0: "Load menu from SD card",
|
0: "Load menu from SD card",
|
||||||
1: "Load ROM from SDRAM through bootloader",
|
1: "Load menu from USB",
|
||||||
2: "Load DDIPL from SDRAM",
|
2: "Load ROM from SDRAM",
|
||||||
3: "Load ROM from SDRAM directly without bootloader",
|
3: "Load DDIPL from SDRAM",
|
||||||
4: "Load menu from USB",
|
4: "Load ROM from SDRAM directly without bootloader",
|
||||||
}[mode]
|
}[mode]
|
||||||
|
|
||||||
|
|
||||||
@ -723,7 +723,7 @@ class SC64ProgressBar:
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
parser = argparse.ArgumentParser(description="SummerCart64 one stop control center")
|
parser = argparse.ArgumentParser(description="SummerCart64 one stop control center")
|
||||||
parser.add_argument("-b", metavar="boot_mode", default="1", required=False, help="set boot mode (0 - 3)")
|
parser.add_argument("-b", metavar="boot_mode", default="2", required=False, help="set boot mode (0 - 4)")
|
||||||
parser.add_argument("-t", metavar="tv_type", default="3", required=False, help="set TV type (0 - 2)")
|
parser.add_argument("-t", metavar="tv_type", default="3", required=False, help="set TV type (0 - 2)")
|
||||||
parser.add_argument("-c", metavar="cic_seed", default="0xFFFF", required=False, help="set CIC seed")
|
parser.add_argument("-c", metavar="cic_seed", default="0xFFFF", required=False, help="set CIC seed")
|
||||||
parser.add_argument("-s", metavar="save_type", default="0", required=False, help="set save type (0 - 6)")
|
parser.add_argument("-s", metavar="save_type", default="0", required=False, help="set save type (0 - 6)")
|
||||||
@ -780,7 +780,7 @@ if __name__ == "__main__":
|
|||||||
os.remove(firmware_backup_file)
|
os.remove(firmware_backup_file)
|
||||||
|
|
||||||
if (not is_read):
|
if (not is_read):
|
||||||
if (boot_mode != 1):
|
if (boot_mode != 2):
|
||||||
print(f"Setting boot mode to [{sc64.get_boot_mode_label(boot_mode)}]")
|
print(f"Setting boot mode to [{sc64.get_boot_mode_label(boot_mode)}]")
|
||||||
sc64.set_boot_mode(boot_mode)
|
sc64.set_boot_mode(boot_mode)
|
||||||
|
|
||||||
|
@ -52,10 +52,11 @@ enum save_type {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum boot_mode {
|
enum boot_mode {
|
||||||
BOOT_MODE_MENU = 0,
|
BOOT_MODE_MENU_SD = 0,
|
||||||
BOOT_MODE_ROM = 1,
|
BOOT_MODE_MENU_USB = 1,
|
||||||
BOOT_MODE_DD = 2,
|
BOOT_MODE_ROM = 2,
|
||||||
BOOT_MODE_DIRECT = 3,
|
BOOT_MODE_DD = 3,
|
||||||
|
BOOT_MODE_DIRECT = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -249,7 +250,7 @@ void cfg_init (void) {
|
|||||||
|
|
||||||
p.cic_seed = 0xFFFF;
|
p.cic_seed = 0xFFFF;
|
||||||
p.tv_type = 0x03;
|
p.tv_type = 0x03;
|
||||||
p.boot_mode = BOOT_MODE_MENU;
|
p.boot_mode = BOOT_MODE_MENU_SD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user