akmenu-next/arm7/source/main.cpp
2024-10-04 22:35:39 -07:00

179 lines
4.6 KiB
C++

/*
main.cpp
Copyright (C) 2008-2009 somebody
Copyright (C) 2009 yellow wood goblin
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/>.
*/
#include <nds.h>
#include <string.h>
#include "../../share/fifotool.h"
#include "../../share/memtool.h"
#ifdef __cplusplus
extern "C" {
#endif
void __libnds_exit(int rc) {}
#ifdef __cplusplus
}
#endif
void VblankHandler(void)
{
inputGetAndSend();
}
#define PM_NDSLITE_ADR (4)
#define PM_CONTROL2_REG (16)
#define PM_CONTROL2_RESET (1)
#define PM_NDSLITE_ISLITE BIT(6)
#define PM_NDSLITE_BRIGHTNESS(x) ((x&0x03)<<0)
#define PM_NDSLITE_BRIGHTNESS_MASK (PM_NDSLITE_BRIGHTNESS(3))
static u32 getSystem(void)
{
static u32 dsGen=0;
if(!dsGen)
{
dsGen=1; // default ds phat
if(readPowerManagement(PM_NDSLITE_ADR)&PM_NDSLITE_ISLITE) dsGen++; // dslite and dsi
if(readPowerManagement(PM_NDSLITE_ADR)==readPowerManagement(5)) dsGen++; // dslite
}
return dsGen;
}
static void prepairReset()
{
//enable sound
if(2==getSystem()) writePowerManagement(PM_CONTROL_REG,(readPowerManagement(PM_CONTROL_REG)&~PM_SOUND_MUTE)|PM_SOUND_AMP);
//disble rtc irq, on some games enabled rtc irq caused tearing.
uint8 command[2];
command[0]=WRITE_STATUS_REG2;
command[1]=0x00;
rtcTransaction(command,2,0,0);
REG_POWERCNT|=POWER_SOUND;
//reset DMA
zeroMemory((void *)0x40000B0,0x30);
REG_IME=IME_DISABLE;
REG_IE=0;
REG_IF=~0;
fifoSendValue32(FIFO_USER_01,MENU_MSG_ARM7_READY_BOOT);
swiDelay(1);
}
static void brightnessNext(void)
{
u8 data=readPowerManagement(PM_NDSLITE_ADR);
if(0==(data&PM_NDSLITE_ISLITE)) // this is not a DS Lite machine
return;
u8 level=data&PM_NDSLITE_BRIGHTNESS_MASK;
level++;
data&=~PM_NDSLITE_BRIGHTNESS_MASK;
data|=PM_NDSLITE_BRIGHTNESS(level);
writePowerManagement(PM_NDSLITE_ADR,data);
}
static void brightnessSet(u8 level)
{
u8 data=readPowerManagement(PM_NDSLITE_ADR);
if(0==(data&PM_NDSLITE_ISLITE)) // this is not a DS Lite machine
return;
data&=~PM_NDSLITE_BRIGHTNESS_MASK;
data|=PM_NDSLITE_BRIGHTNESS(level);
writePowerManagement(PM_NDSLITE_ADR,data);
}
static u8 brightnessGet(void)
{
u8 data=readPowerManagement(PM_NDSLITE_ADR);
if(0==(data&PM_NDSLITE_ISLITE)) // this is not a DS Lite machine
return 0;
return data&PM_NDSLITE_BRIGHTNESS_MASK;
}
static void menuValue32Handler(u32 value,void* data)
{
switch(value)
{
case MENU_MSG_GBA:
{
u32 ii=0;
if(PersonalData->gbaScreen)
ii=(1*PM_BACKLIGHT_BOTTOM)|PM_SOUND_AMP;
else
ii=(1*PM_BACKLIGHT_TOP)|PM_SOUND_AMP;
writePowerManagement(PM_CONTROL_REG,ii);
swiChangeSoundBias(0,0x400);
swiSwitchToGBAMode();
}
break;
case MENU_MSG_ARM7_REBOOT:
prepairReset();
swiSoftReset();
break;
case MENU_MSG_BRIGHTNESS_NEXT:
brightnessNext();
break;
case MENU_MSG_SYSTEM:
fifoSendValue32(FIFO_USER_02,getSystem());
break;
case MENU_MSG_BRIGHTNESS_GET:
fifoSendValue32(FIFO_USER_01,brightnessGet());
break;
case MENU_MSG_BRIGHTNESS_SET0:
case MENU_MSG_BRIGHTNESS_SET1:
case MENU_MSG_BRIGHTNESS_SET2:
case MENU_MSG_BRIGHTNESS_SET3:
brightnessSet(value&3);
break;
case MENU_MSG_SHUTDOWN:
if(2==getSystem()) writePowerManagement(PM_CONTROL2_REG,readPowerManagement(PM_CONTROL2_REG)|PM_CONTROL2_RESET);
else systemShutDown();
default:
break;
}
}
int main()
{
//mute sound
if(2==getSystem()) writePowerManagement(PM_CONTROL_REG,(readPowerManagement(PM_CONTROL_REG)&~PM_SOUND_AMP)|PM_SOUND_MUTE);
//switch on backlight on both screens
writePowerManagement(PM_CONTROL_REG,readPowerManagement(PM_CONTROL_REG)|PM_BACKLIGHT_BOTTOM|PM_BACKLIGHT_TOP);
// read User Settings from firmware
readUserSettings();
irqInit();
fifoInit();
// Start the RTC tracking IRQ
initClockIRQ();
fifoSetValue32Handler(FIFO_USER_01,menuValue32Handler,0);
installSystemFIFO();
irqSet(IRQ_VBLANK,VblankHandler);
irqEnable(IRQ_VBLANK|IRQ_NETWORK);
while(true) swiWaitForVBlank();
}