Page 1 of 1

Getting started with libnds

Posted: Wed May 07, 2014 6:39 pm
by Derrik
Thanks, I'll see how it goes using straight up libnds then!

I'm having a little trouble setting up GFX the DS. Ideally I'd like to have all of my VRAM banks set up in a similar way to how PAlib used to, so I would like to have extended palettes for sprites and backgrounds and be able to load 4 layers of backgrounds on each screen.

I have ball.bin and pal.bin (converted with grit) in my data folder and am using this code:

Code: Select all

#include <nds.h>

#include "ball_bin.h"
#include "pal_bin.h"

int main(int argc, char **argv) {
	videoSetMode(MODE_5_2D);
	videoSetModeSub(MODE_5_2D);
	vramSetBankA(VRAM_A_MAIN_BG_0x06000000);
	vramSetBankB(VRAM_B_MAIN_SPRITE);
	vramSetBankC(VRAM_C_SUB_BG_0x06200000);
	vramSetBankD(VRAM_D_SUB_SPRITE);
	vramSetBankF(VRAM_F_SPRITE_EXT_PALETTE);
	vramSetBankI(VRAM_I_SUB_SPRITE_EXT_PALETTE);
	
	oamInit(&oamMain, SpriteMapping_1D_128, true);
	oamInit(&oamSub, SpriteMapping_1D_128, true);
	
	u16 *ball = NULL;
	ball = oamAllocateGfx(&oamSub, SpriteSize_32x32, SpriteColorFormat_256Color);
	dmaCopy(ball_bin, ball, 1024);
	
	vramSetBankF(VRAM_F_LCD);
	vramSetBankF(VRAM_I_LCD);
	dmaCopy(pal_bin, VRAM_F_EXT_SPR_PALETTE[0], 512);
	dmaCopy(pal_bin, VRAM_I_EXT_SPR_PALETTE[0], 512);
	vramSetBankF(VRAM_F_SPRITE_EXT_PALETTE);
	vramSetBankI(VRAM_I_SUB_SPRITE_EXT_PALETTE);
	
	oamSet(&oamSub, 0, 0, 0, 0, 0, SpriteSize_32x32, SpriteColorFormat_256Color, ball, -1, false, false, false, false, false);
	
	while(1) {
		scanKeys();
		swiWaitForVBlank();
		
		oamUpdate(&oamMain);
		oamUpdate(&oamSub);
	}
	
	return 0;
}
The screen displays nothing, so I assume that either I have set up the VRAM banks incorrectly or that I have not correctly unlocked the extended sprite palette before attempting to dmaCopy to the palette.

Many thanks.

Re: Getting started with libnds

Posted: Wed May 07, 2014 7:02 pm
by Derrik
OK; changing oamSub to oamMain in both oamAllocateGfx and oamSet lets me draw the sprite on the top screen!

So now I know it is a problem with VRAM bank setup which is not letting me draw sprites on the bottom screen.

Re: Getting started with libnds

Posted: Thu May 08, 2014 5:02 pm
by Derrik
Not sure why, but it's working on the bottom screen now too.

Re: Getting started with libnds

Posted: Thu May 08, 2014 5:43 pm
by elhobbs
sounds like you may have already solved your issues but mtheall created a page to help visual vram layout - http://mtheall.com/banks.html

Re: Getting started with libnds

Posted: Thu May 08, 2014 8:42 pm
by Derrik
Hi, thanks for the link.

As I mentioned before, I'd like 4 layers of backgrounds on both screens. So I am currently using this hacked together VRAM layout:

http://mtheall.com/vram.html#T0=1&NT0=5 ... TB3=6&S3=0

I have kept it under 128KB so that I can use the same setup for both screens.

Is this the correct way to go about loading backgrounds in this setup?

Code: Select all

topLayers[layer] = bgInit(layer, BgType_Text8bpp, BgSize_B8_256x256, layer + 28, layer * 2);
Because I can load backgrounds on layer 0 and 1, but not 2 or 3.

Re: Getting started with libnds

Posted: Sat May 10, 2014 1:37 pm
by WinterMute
Derrik wrote:Thanks, I'll see how it goes using straight up libnds then!

I'm having a little trouble setting up GFX the DS. Ideally I'd like to have all of my VRAM banks set up in a similar way to how PAlib used to, so I would like to have extended palettes for sprites and backgrounds and be able to load 4 layers of backgrounds on each screen.
That isn't necessarily a good idea.

Are the palettes on your sprites and backgrounds sufficiently different to warrant blowing 48K of VRAM just for the color data alone? Do you really need 256 color tiles given that they take up twice as much space as 16 color tiles? Bear in mind that 16 color backgrounds can still have 240 colors.

At this point it might be better for you to describe what you're trying to do in terms of the graphical content. i.e. is this a scrolling game? How big are the maps? What are you displaying on each layer?

If you're inclined to more real time discussion then the IRC channel can be a good place for these questions.

Re: Getting started with libnds

Posted: Sun May 11, 2014 2:54 pm
by Derrik
Thanks for sticking with me.

I've uploaded a BG loading template:

http://filetrip.net/dl?acx8azBO5O

It can load backgrounds on all 4 layers of the top screen (which I have setup as oamMain) however I can only load backgrounds on layers 0 - 2 of the bottom screen (oamSub), if I try to load one on layer 3 of oamSub the previous layers get corrupted and it displays mostly garbage on the screen.

Setting up the VRAM banks to be as efficient and specific to my project as possible isn't really a viable solution for me since ideally I'd like to be able to have users be able to make their own backgrounds which would be loaded from FAT eventually.

Re: Getting started with libnds

Posted: Wed May 14, 2014 12:48 pm
by sverx
If it's ok for you to have the same extended palettes for backgrounds 0 and 2 and for backgrounds 1 and 3, then you could use VRAM_BANK_F or VRAM_BANK_G, which are only 16KB and you won't waste anything.
To achieve this, you should set BG0 to use the extended palettes for BG2 using BG_PALETTE_SLOT2 and set BG1 to use the extended palettes for BG3 using BG_PALETTE_SLOT3.
I hope this helps :)

Re: Getting started with libnds

Posted: Fri May 16, 2014 4:41 pm
by Derrik
Thanks for the suggestion but is there no other way?