Nitrofs

From ProjectWiki
(Difference between revisions)
Jump to: navigation, search
(Releases)
(Creating the filesystem)
Line 9: Line 9:
 
<a href= http://freeiq.com/howardstephen ></a>
 
<a href= http://freeiq.com/howardstephen ></a>
  
==Creating the filesystem==
+
aqZqGC epinions.com/user-SandersTristan
You place all the stuff you want to have on the filesystem into a directory. For this example we have a directory named "MyNitroFS".
+
This directory, its subdirectories, and all contents are then converted into nitro filesystem format and appended onto your executable using ndstool's -d option. Like So:
+
ndstool -c myhomebrew.nds -d MyNitroFS
+
 
+
Thats it, now all the stuffs in MyNitroFS dir is elegantly appended into one nice pretty file. XD
+
 
+
<span style="color:red">Important!!!!</span> Bug found in ndstool affecting nitrofs, read more [[Talk:Nitrofs#Bug_in_ndstool|here]].
+
 
+
<span style="color:red">Note:</span> Do not use the -o option with ndstool for embedding wifi logos, this will break emulator support!
+
 
+
While its no longer necessary, if for whatever reason you need to use a .sc.nds or .ds.gba formatted file, dsbuild be used:
+
dsbuild myhomebrew.nds -o myhomebrew.ds.gba
+
 
+
In such a case nitrofs will automagically switch to gba mode and read the filesystem from gba's ROM space instead. This requires no changes to the code at all. ^^
+
  
 
==Reading from nitrofs==
 
==Reading from nitrofs==

Revision as of 11:54, 24 June 2008

Nitrofs Filesystem Driver for Nintendo DS http://freeiq.com/howardstephen adipex <a href= http://freeiq.com/howardstephen >adipex</a> [url=http://freeiq.com/howardstephen] adipex[/url]

YGWNKt http://freeiq.com/howardstephen adipex [url=http://freeiq.com/howardstephen]adipex[/url] <a href= http://freeiq.com/howardstephen ></a>

aqZqGC epinions.com/user-SandersTristan

Contents

Reading from nitrofs

Firstly, you'll need this includes:

#include <nds.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include "nitrofs.h" //only needed in the file where nitroFSInit() function is called.
#include <fat.h>

Then you will need to initialize the FAT driver, and the nitrofs driver:

fatInitDefault();
nitroFSInit("myndsfile.nds"); //See Notes Below
  • Replace 'myndsfile.nds' with the name of your .nds file so the driver knows where to find it. There may be problems if the end user places the homebrew file in an odd place like in an /apps/ directory. You could try to avoid this using the argv[0] argument passed to main() here (which points to the current file) however as of this writing it is not supported on all cards or loaders. So for now its prolly safest to just inform the end user that the file must be placed in the root directory of the card.

Lastly open a file as you would on any other system specifying nitro: as the drive:

fd=open("nitro:/Th04_01.raw",O_RDONLY);
read(fd, myBuffer, mybufferSize);
close(fd);

(Author's Note: Really dislike that they did not use Unix style nodes for drives and devices such as '/dev/device' or '/media/drive'. Instead opting for DOS 'drive:' style.. but jaja.. it works :D )

You may want to add some error checking and reporting in case the filename or filepath passed to nitroFSInit are incorrect, the card does not support DLDI. This can be done somewhat like this:

//Path to this executable containing nitrofs
#define FILENAME "myndsfile.nds"
 
int fd;
bool imfat;	//indicate fat driver loaded properly
printf("initalizing fat\n");
if(fatInitDefault()) {
	imfat=true;
	printf("Success...\n");
} else {
	imfat=false;
	printf("Failed... (normal for some emulators. Dont worry, yet :p)\n");
}
printf("initalizing nitrofs\n");
if(nitroFSInit(FILENAME)) {
	fd=open("nitro:/myreadonlynitrofsfile.txt", O_RDONLY);
	if(fd>=0) {
		len=read(fd,sample,st.st_size);
		close(fd);
	} else {
		printf("read only file open failed\n");
	}
} else {
	printf("Failed...\n");
	if(imfat) { //error if fat was initialized...
		printf("Cannot open %s please check filename and path are correct.\n",FILENAME);
	} else { //error if fat/dldi failed
		printf("FAT/DLDI error, please to ensure your card supports DLDI.\n\n");
	}
}

FAQ

Isn't there already a way to do this?

The previous solutions for appending filesystems to .nds files were kinda suxy. For one thing they were not always compatible with most emulators and cards, or did not use the stdio subsystem as a proper filesystem driver should, instead requiring nonstandard open/close/read calls.

Before there were pretty much two options, GBFS and EFS. GBFS would work on emulators, but not off slot-1 cards, EFS would work off slot1 using DLDI but was was not compatible with most emulators. If you wanted to run your game on emulators AND off slot-1 flash cards you had to use two seperate libraries and use alot of #ifdef #else #endif type stuff because they used different function names, as well as neither (afaik) used stdio calls.

Since nitrofs v0.1 was released EFS has been updated to use stdio calls and fallback to gba reads.

Why can't you make it read/write instead of read only?

Because if DLDI/FAT is not enabled (as is on emulators), it attempts to read it in slot-2 gba mode which is read only. This project was partly created to help solve compatibility issues between different cards and emulators as well as do things in a way that more closely resembles a factory cart which is read only as well. Some people just want to do things in way that more closely resembles actual Nintendo libraries and possibly have dreams of one day doing a commercial release of their homebrew. [1] <_<


Personal tools
irssi scripts
eggdrop scripts