boxUI::boxUI( ) { IO::swapScreens( ); IO::vramSetup( ); videoSetMode( MODE_5_2D | DISPLAY_BG2_ACTIVE | DISPLAY_BG3_ACTIVE | DISPLAY_SPR_ACTIVE | DISPLAY_SPR_1D | DISPLAY_SPR_EXT_PALETTE ); dmaFillWords( 0, bgGetGfxPtr( IO::bg2 ), 256 * 192 ); dmaFillWords( 0, bgGetGfxPtr( IO::bg2sub ), 256 * 192 ); bgUpdate( ); swiWaitForVBlank( ); IO::NAV->draw( ); drawAllBoxStatus( ); IO::initOAMTable( false ); u16 tileCnt = 0; tileCnt = IO::loadSprite( BACK_ID, BACK_ID, 0, tileCnt, SCREEN_WIDTH - 28, SCREEN_HEIGHT - 28, 32, 32, BackPal, BackTiles, BackTilesLen, false, false, false, OBJPRIORITY_1, false ); tileCnt = IO::loadSprite( ARROW_ID, 0, 1, tileCnt, 0, 0, 16, 16, box_arrowPal, box_arrowTiles, box_arrowTilesLen, false, false, true, OBJPRIORITY_0, false ); tileCnt += 64; tileCnt = IO::loadSprite( PAGE_ICON_START + ( 0 ), 0, PAGE_ICON_START + ( 0 ), tileCnt, 20, 0, 32, 32, time_iconPal, time_iconTiles, time_iconTilesLen, false, false, true, OBJPRIORITY_0, false ); tileCnt = IO::loadSprite( PAGE_ICON_START + ( 1 ), 0, PAGE_ICON_START + ( 1 ), tileCnt, 40, 0, 32, 32, memoPal, memoTiles, memoTilesLen, false, false, true, OBJPRIORITY_0, false ); tileCnt = IO::loadSprite( PAGE_ICON_START + ( 2 ), 0, PAGE_ICON_START + ( 2 ), tileCnt, 0, 0, 32, 32, PKMNPal, PKMNTiles, PKMNTilesLen, false, false, true, OBJPRIORITY_0, false ); tileCnt = IO::loadSprite( PAGE_ICON_START + ( 3 ), 0, PAGE_ICON_START + ( 3 ), tileCnt, 50, 0, 32, 32, atksPal, atksTiles, atksTilesLen, false, false, true, OBJPRIORITY_0, false ); tileCnt = IO::loadSprite( PAGE_ICON_START + ( 4 ), 0, PAGE_ICON_START + ( 4 ), tileCnt, 60, 0, 32, 32, ContestPal, ContestTiles, ContestTilesLen, false, false, true, OBJPRIORITY_0, false ); for( u8 i = 0; i < 5; ++i ) { IO::OamTop->oamBuffer[ PAGE_ICON_START + i ].x = 48 + 32 * i; IO::OamTop->oamBuffer[ PAGE_ICON_START + i ].y = 256 - 10; } IO::updateOAM( false ); IO::initOAMTable( true ); BG_PALETTE[ COLOR_IDX ] = GREEN; BG_PALETTE[ WHITE_IDX ] = WHITE; BG_PALETTE[ GRAY_IDX ] = GRAY; BG_PALETTE[ BLACK_IDX ] = BLACK; BG_PALETTE[ RED_IDX ] = RED; BG_PALETTE_SUB[ COLOR_IDX ] = GREEN; BG_PALETTE_SUB[ WHITE_IDX ] = WHITE; BG_PALETTE_SUB[ GRAY_IDX ] = GRAY; BG_PALETTE_SUB[ BLACK_IDX ] = BLACK; BG_PALETTE_SUB[ RED_IDX ] = RED; }
/* DS_ClearVRAM: Make sure all of the video memory and background/object palettes are zeroed out just in-case the loader doesn't do it for us. */ LOCALPROC DS_ClearVRAM(void) { vramSetPrimaryBanks(VRAM_A_LCD, VRAM_B_LCD, VRAM_C_LCD, VRAM_D_LCD); dmaFillWords(0, (void *) VRAM_A, 128 * 1024 * 4); dmaFillWords(0, (void *) BG_PALETTE, 256 * 2); dmaFillWords(0, (void *) BG_PALETTE_SUB, 256 * 2); dmaFillWords(0, (void *) SPRITE_PALETTE, 256 * 2); dmaFillWords(0, (void *) SPRITE_PALETTE_SUB, 256 * 2); vramDefault(); }
void __attribute__ ((long_call)) resetArm9() { int i, reg; for(i=0; i<4; i++) { DMA_CR(i) = 0;//Reset DMA. DMA_SRC(i) = 0; DMA_DEST(i) = 0; TIMER_CR(i) = 0;//Reset timers. TIMER_DATA(i) = 0; if(DSi_mode) { for(reg=0; reg<0x1c; reg+=4)*((u32*)(0x04004104 + ((i*0x1c)+reg))) = 0;//Reset NDMA. } } VRAM_CR = (VRAM_CR & 0xffff0000) | 0x00008080;//This is from bootloader. //This DMA gfx reset code is from bootloader boot.c. dmaFillWords( 0, (void*)0x04000000, 0x56); //clear main display registers dmaFillWords( 0, (void*)0x04001000, 0x56); //clear sub display registers REG_DISPSTAT = 0; REG_DISPCNT = 0; REG_DISPCNT_SUB = 0; for(i=0; i<7; i++)//Clear VRAM. { if(i==2)continue; ((vu8*)0x04000240)[i] = 0x80; } VRAM_H_CR = 0x80; VRAM_I_CR = 0x80; memset16((void*)0x6800000, 0, 0xa4000); for(i=0; i<7; i++)//Reset VRAM. { if(i==2)continue; ((vu8*)0x04000240)[i] = 0; } VRAM_H_CR = 0; VRAM_I_CR = 0; memset((void*)0x05000000, 0, 0x800);//Clear palettes. memset((void*)0x07000000, 0, 0x800);//Clear OAM. memset(SPRITE_GFX, 0, 128 * 1024); memset(SPRITE_GFX_SUB, 0, 128 * 1024); REG_POWERCNT = 0x820f; WRAM_CR = 0x03; REG_EXMEMCNT = 0xE880; }
//--------------------------------------------------------------------------------- // Reset the DS registers to sensible defaults //--------------------------------------------------------------------------------- void __attribute__((weak)) initSystem(void) { //--------------------------------------------------------------------------------- register int i; // stop timers and dma 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; } // clear video display registers dmaFillWords(0, (void*)0x04000000, 0x56); dmaFillWords(0, (void*)0x04001008, 0x56); videoSetModeSub(0); vramDefault(); VRAM_E_CR = 0; VRAM_F_CR = 0; VRAM_G_CR = 0; VRAM_H_CR = 0; VRAM_I_CR = 0; irqInit(); fifoInit(); fifoSetValue32Handler(FIFO_PM, powerValueHandler, 0); fifoSetDatamsgHandler(FIFO_SYSTEM, systemMsgHandler, 0); if(REG_DSIMODE) { fifoSendValue32(FIFO_PM,PM_DSI_HACK); __dsimode = true; } __transferRegion()->buttons = 0xffff; punixTime = (time_t*)memUncached((void *)&__transferRegion()->unixTime); __syscalls.exit = __libnds_exit; extern char *fake_heap_end; __transferRegion()->bootcode = (struct __bootstub *)fake_heap_end; irqEnable(IRQ_VBLANK); }
void boxUI::drawAllBoxStatus( bool p_bottom ) { dmaFillWords( 0, bgGetGfxPtr( !p_bottom ? IO::bg2sub : IO::bg2 ), 256 * 192 ); dmaFillWords( 0, bgGetGfxPtr( !p_bottom ? IO::bg3sub : IO::bg3 ), 256 * 192 ); auto pal = BG_PAL( !p_bottom ); pal[ 0 ] = WHITE; char buffer[ 50 ]; IO::initOAMTable( !p_bottom ); IO::regularFont->printString( GET_STRING( 61 ), 4, 3, !p_bottom ); u8 w = 32, h = 24; // width and heigth u16 pkmncnt = 0; for( u8 i = 0; i < 7; ++i ) for( u8 j = 0; j < 6; ++j ) { pal[ 128 + j * 7 + i ] = getBoxColor( j * 7 + i ); u8 x = 2 + 36 * i; u8 y = 22 + 28 * j; bool prsd = j * 7 + i == SAVE::SAV->getActiveFile( ).m_curBox; IO::printChoiceBox( x, y, x + w, y + h, 6 - 2 * prsd, 128 + j * 7 + i, false, !p_bottom ); u8 cnt = SAVE::SAV->m_storedPokemon[ j * 7 + i ].count( ); pkmncnt += cnt; if( cnt == MAX_PKMN_PER_BOX ) IO::regularFont->setColor( RED_IDX, 1 ); else IO::regularFont->setColor( BLACK_IDX, 1 ); snprintf( buffer, 49, "%2d", cnt ); IO::regularFont->printString( buffer, x + 7, y + 5, !p_bottom ); } snprintf( buffer, 49, "%4d Pokémon", pkmncnt ); if( pkmncnt == 756 ) IO::regularFont->setColor( RED_IDX, 1 ); else IO::regularFont->setColor( BLACK_IDX, 1 ); IO::regularFont->printString( buffer, 252, 3, !p_bottom, IO::font::RIGHT ); for( u8 i = 0; i < 5; ++i ) { IO::OamTop->oamBuffer[ PAGE_ICON_START + i ].isHidden = true; } IO::updateOAM( false ); }
Bar::Bar(coord pos, u16* gfxSource, int palIdx) : AffineSprite(true, pos, 0, palIdx, SpriteSize_64x32, SpriteColorFormat_16Color, false, false, false, false, 1, true/*allocGfx*/, true, true), value(0), initX(pos.first) { char * bottomBar = 64+((char*) gfxSource); for(int n = 0; n < 8; ++n) { dmaCopy(gfxSource, (n*32)+((char*)(gfxPtr[0])), 32); dmaCopy(bottomBar, 256+(n*32)+((char*)(gfxPtr[0])), 32); } dmaFillWords(0,512+((char*)(gfxPtr[0])),1024); }
//--------------------------------------------------------------------------------- int main() { //--------------------------------------------------------------------------------- // clear sound registers dmaFillWords(0, (void*)0x04000400, 0x100); REG_SOUNDCNT |= SOUND_ENABLE; writePowerManagement(PM_CONTROL_REG, ( readPowerManagement(PM_CONTROL_REG) & ~PM_SOUND_MUTE ) | PM_SOUND_AMP ); powerOn(POWER_SOUND); readUserSettings(); ledBlink(0); irqInit(); // Start the RTC tracking IRQ initClockIRQ(); fifoInit(); mmInstall(FIFO_MAXMOD); SetYtrigger(80); installWifiFIFO(); installSoundFIFO(); installSystemFIFO(); irqSet(IRQ_VCOUNT, VcountHandler); irqSet(IRQ_VBLANK, VblankHandler); irqEnable( IRQ_VBLANK | IRQ_VCOUNT | IRQ_NETWORK); setPowerButtonCB(powerButtonCB); // Keep the ARM7 mostly idle while (!exitflag) { if ( 0 == (REG_KEYINPUT & (KEY_SELECT | KEY_START | KEY_L | KEY_R))) { exitflag = true; } swiWaitForVBlank(); } return 0; }
//--------------------------------------------------------------------------------- void oamInit(OamState *oam, SpriteMapping mapping, bool extPalette) { //--------------------------------------------------------------------------------- int i; int extPaletteFlag = extPalette ? DISPLAY_SPR_EXT_PALETTE : 0; oam->gfxOffsetStep = (mapping & 3) + 5; oam->spriteMapping = mapping; dmaFillWords(0, oam->oamMemory, sizeof(OamMemory)); for(i = 0; i < 128; i++) { oam->oamMemory[i].isHidden = true; } for(i = 0; i < 32; i++) { oam->oamRotationMemory[i].hdx = (1<<8); oam->oamRotationMemory[i].vdy = (1<<8); } swiWaitForVBlank(); DC_FlushRange(oam->oamMemory, sizeof(OamMemory)); if(oam == &oamMain) { dmaCopy(oam->oamMemory, OAM, sizeof(OamMemory)); REG_DISPCNT &= ~DISPLAY_SPRITE_ATTR_MASK; REG_DISPCNT |= DISPLAY_SPR_ACTIVE | (mapping & 0xffffff0) | extPaletteFlag; } else { dmaCopy(oam->oamMemory, OAM_SUB, sizeof(OamMemory)); REG_DISPCNT_SUB &= ~DISPLAY_SPRITE_ATTR_MASK; REG_DISPCNT_SUB |= DISPLAY_SPR_ACTIVE | (mapping & 0xffffff0) | extPaletteFlag; } oamAllocReset(oam); }
//--------------------------------------------------------------------------------- int loadNDS(int socket, u32 remote) { //--------------------------------------------------------------------------------- int len; int i=0; ioctl(socket,FIONBIO,&i); len = recvall(socket,__NDSHeader,512,0); if (len != 512) { kprintf("Error reading header.\n"); return 1; } int arm7dest = __NDSHeader->arm7destination; int arm7size = __NDSHeader->arm7binarySize; int arm9dest = __NDSHeader->arm9destination; int arm9size = __NDSHeader->arm9binarySize; volatile int response = 0; if (arm9dest + arm9size > (int)_start) response = 1; if (arm7dest >= 0x02000000 && arm7dest < 0x03000000 && arm7dest + arm7size > (int)_start) response = 2; send(socket,(int *)&response,sizeof(response),0); if(response) return 1; kprintf("Reading arm7 binary: "); if (progressRead(socket,(char *)memUncached((void*)0x02000000),arm7size)) { kprintf("\nReceive error.\n"); return 1; } fifoSendValue32(FIFO_USER_01,1); while(!fifoCheckValue32(FIFO_USER_01)) { swiIntrWait(1,IRQ_FIFO_NOT_EMPTY); } fifoGetValue32(FIFO_USER_01); kprintf("Reading arm9 binary: "); if(progressRead(socket,(char *)arm9dest,arm9size)) { kprintf("\nReceive error.\n"); return 1; } volatile int cmdlen=0; char *cmdline; if (arm9size != 0){ cmdline = (char*)(arm9dest+arm9size); } else { cmdline = (char*)(arm7dest+arm7size); } len = recvall(socket,(char*)&cmdlen,4,0); if (cmdlen) { len = recvall(socket,cmdline,cmdlen,0); __system_argv->argvMagic = ARGV_MAGIC; __system_argv->commandLine = cmdline; __system_argv->length = cmdlen; __system_argv->host = remote; } Wifi_DisableWifi(); DC_FlushAll(); REG_IPC_SYNC = 0; fifoSendValue32(FIFO_USER_01,2); fifoSendValue32(FIFO_USER_01,__NDSHeader->arm9executeAddress); irqDisable(IRQ_ALL); REG_IME = 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; } u16 *mainregs = (u16*)0x04000000; u16 *subregs = (u16*)0x04001000; for (i=0; i<43; i++) { mainregs[i] = 0; subregs[i] = 0; } REG_DISPSTAT = 0; dmaFillWords(0, BG_PALETTE, (2*1024)); VRAM_A_CR = 0x80; dmaFillWords(0, VRAM, 128*1024); VRAM_A_CR = 0; VRAM_B_CR = 0; // Don't mess with the ARM7's VRAM // VRAM_C_CR = 0; VRAM_D_CR = 0; VRAM_E_CR = 0; VRAM_F_CR = 0; VRAM_G_CR = 0; VRAM_H_CR = 0; VRAM_I_CR = 0; REG_POWERCNT = 0x820F; //set shared ram to ARM7 WRAM_CR = 0x03; // Return to passme loop *((vu32*)0x02FFFE04) = (u32)0xE59FF018; // ldr pc, 0x02FFFE24 *((vu32*)0x02FFFE24) = (u32)0x02FFFE04; // Set ARM9 Loop address REG_IPC_SYNC = 0x500; arm9Reset(); while(1); }