mirror of
https://github.com/ApacheThunder/XuluMenu.git
synced 2025-06-19 03:55:32 -04:00

* Can now boot stage2 (in safe block mode) if holding L-Shoulder + R-Shoulder + A + B + DPAD Up on boot. This allows using built in stage2 usb update mode for "bootleg" style N-Cards that have Xulumenu installed. * This button combo will not do anything for regular N-Card users as they already have a proper stage2 section on nand and it will always end up booting to USB update mode with this button combo before xulumenu can boot.
96 lines
2.9 KiB
C
96 lines
2.9 KiB
C
/*
|
|
main.arm9.c
|
|
|
|
By Michael Chisholm (Chishm)
|
|
|
|
All resetMemory and startBinary functions are based
|
|
on the MultiNDS loader by Darkain.
|
|
Original source available at:
|
|
http://cvs.sourceforge.net/viewcvs.py/ndslib/ndslib/examples/loader/boot/main.cpp
|
|
|
|
License:
|
|
NitroHax -- Cheat tool for the Nintendo DS
|
|
Copyright (C) 2008 Michael "Chishm" Chisholm
|
|
|
|
This program 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 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#define ARM9
|
|
#undef ARM7
|
|
#include <nds/memory.h>
|
|
#include <nds/arm9/video.h>
|
|
#include <nds/arm9/input.h>
|
|
#include <nds/interrupts.h>
|
|
#include <nds/dma.h>
|
|
#include <nds/timers.h>
|
|
#include <nds/system.h>
|
|
#include <nds/ipc.h>
|
|
|
|
#include "common.h"
|
|
volatile u32 arm9_BLANK_RAM = 0;
|
|
|
|
/*-------------------------------------------------------------------------
|
|
External functions
|
|
--------------------------------------------------------------------------*/
|
|
extern void arm9_clearCache (void);
|
|
extern void arm9_reset (void);
|
|
|
|
/*-------------------------------------------------------------------------
|
|
arm9_main
|
|
Clears the ARM9's icahce and dcache
|
|
Clears the ARM9's DMA channels and resets video memory
|
|
Jumps to the ARM9 NDS binary in sync with the ARM7
|
|
Written by Darkain, modified by Chishm
|
|
--------------------------------------------------------------------------*/
|
|
void arm9_main (void) {
|
|
register int i;
|
|
//set shared ram to ARM7
|
|
WRAM_CR = 0x03;
|
|
REG_EXMEMCNT = 0xE880;
|
|
// Disable interrupts
|
|
REG_IME = 0;
|
|
REG_IE = 0;
|
|
REG_IF = ~0;
|
|
// Synchronise start
|
|
ipcSendState(ARM9_START);
|
|
while (ipcRecvState() != ARM7_START);
|
|
ipcSendState(ARM9_MEMCLR);
|
|
arm9_clearCache();
|
|
for (i=0; i<16*1024; i+=4) { //first 16KB
|
|
(*(vu32*)(i+0x00000000)) = 0x00000000; //clear ITCM
|
|
(*(vu32*)(i+0x00800000)) = 0x00000000; //clear DTCM
|
|
}
|
|
for (i=16*1024; i<32*1024; i+=4) { //second 16KB
|
|
(*(vu32*)(i+0x00000000)) = 0x00000000; //clear ITCM
|
|
}
|
|
(*(vu32*)0x00803FFC) = 0; //IRQ_HANDLER ARM9 version
|
|
(*(vu32*)0x00803FF8) = ~0; //VBLANK_INTR_WAIT_FLAGS ARM9 version
|
|
// Clear out FIFO
|
|
REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_SEND_CLEAR;
|
|
REG_IPC_FIFO_CR = 0;
|
|
// Clear out ARM9 DMA channels
|
|
for (i=0; i<4; i++) {
|
|
DMA_CR(i) = 0;
|
|
DMA_SRC(i) = 0;
|
|
DMA_DEST(i) = 0;
|
|
TIMER_CR(i) = 0;
|
|
TIMER_DATA(i) = 0;
|
|
}
|
|
// set ARM9 state to ready and wait for instructions from ARM7
|
|
ipcSendState(ARM9_READY);
|
|
while (ipcRecvState() != ARM7_BOOTBIN);
|
|
arm9_reset();
|
|
}
|
|
|