libfat : maybe you need to loose some weight :D
Written by cafealpha
3 comments
Classified in : Saturn, Programming, Mylife
One the main module for the firmware of this cartridge is File System access library.
As you may know, there are many File System existing in real worls : FAT, NTFS, exFat, ReiserFs, etc.
And in my project, I choose to use FAT32 in order to access files and directories.
Why FAT32 ? Just because it offers the best rate of advantages vs disadvantages in my project scope.
Advantages :
- Available everywhere, from Windows 98 to every Linux distribution.
- Detailed (?) specs available on MS website, lots of free source code available elsewhere.
- Little resource requirement (at least 1~2KB of work RAM, and few tenths of program memory for code).
Disadvantages :
- A little hard to understand why internal data structure is so messy ... more understandable after reading FAT16 specs.
- Complex Long FileName support, and patented by MS too.
- Write performances may be poor under certain conditions. Example : fragmented file system + large partition size.
- Free source code available everywhere is sometimes buggy / bloated.
At the very beginning of the project (nearly 4 years ago !), I choose DharmaniTech FAT32 library , and it was easy to use, so that I could read files without many problems on software development side.
But it only supports <512 bytes file write, and a lot of advanced features weren't available, so I then switched to thinfat32 library .
Thinfat32 library was a pain to adapt to Saturn, and some advanced features weren't available, or didn't worked, so I rapidly switched to libfat .
Libfat is great, works without any major trouble, and even supports FAT16

So I kept libfat as FAT32 library for around 3 years.
But one problem of libfat is ... its weight (<- yeah, I wanted to put this pun somewhere

- Sector caching is cool, but library doesn't work without it, so we need at least 8KB of work RAM for it.
- Source code is very complete, but also very complex, so unless you aren't a talented developer, so can't customize it easily ... and unfortunately I'm not a talented developer

- Library supports nearly everything for file/directory manipulation, so size after compilation is a little big (around 50KB IIRC).
You may ask : "why complaining about few KBs of RAM ? Saturn got plenty of RAM to use !"
Well, yes and no. My project (on game game backup from/to SD card) of resources :
- Work RAM : 24KB ... not contiguous : 16KB+8KB
- Program memory : work RAM, or cartridge ROM (1MB). I choose to run program directly from ROM.
And, in a (maybe) future hardware project, I may need to port FAT32 library to microcontroller, so few resources will be mandatory.
So last month, I dropped libfat, and started to look for a simpler & better FAT32 library.
When selecting a starting point for development, my choice pointed to thinfat32, not because it was perfect, but because I had some experience with it in the past, so that I know where I should start to fix things

First, I dropped some features I don't need :
- Long FileName when writing files : LFN can be read, but only 8.3 files can be written ... it's enough for my needs

- Long path : changed maximum size for file path from MAX_PATH (260 bytes) to 96 bytes ... it's enough for me, and saves some RAM.
- Only one file open at once : it saves some RAM.
- Other ? (don't remember)
Then started to fix/debug/etc the library :
- Big/low endian support ... Saturn and PC endianness is different

- Directory creation fix.
- File creation in non-root directory fix.
- Added test bench under windows ... there was one stub in original sources, but with very limited test range ...
- Better log support.
- FS info support.
- FAT16 support ... not working yet (


- File append fix ... original sources support file append ... only in the case source file is multiple of 512 bytes ... this bug took me many time to spot

- Clock support when setting file timestamp ... original sources supported only fixed (dummy) timestamp.
- File listing within a directory.
- Source code cleanup.
- MANY fixes.
Complaints about thinfat32 library may look severe, but I really thanks its author to publicly release it !
Thanks to him, I know have something that fits my needs, and have a deeper knowledge regarding FAT32 structure

Last but not least, here are some screenshots :

Test program contents :
In this screenshot, I first create one directory,
then write 3 files inside it.

Test program execution - just in order to show
a command line screenshot on my blog
a command line screenshot on my blog


Result in (virtual) test drive :
one directory and 3 files are created !
one directory and 3 files are created !

This is just the beginning of the development : I still need to test under Saturn emulator (yabause
), then on real hardware (Saturn + custom cartridge ).
