Other than just keeping the app alive in a virtualized environment, as has already been suggested, the first thing to do would be to figure out why the code seems to require FAT-16.
If the app (or its runtime) is particularly evil, the FAT-16 requirement may stem from the fact that it's trying to do direct disk I/O, bypassing the operating system. If the BASIC code itself is trying to pull that particular stunt, you should see lots of CALLs, PEEKs, POKEs or even the occasional IN and OUT statement in I/O routines. Determining what the runtime is up to is more difficult: if it's from Microsoft, DOS-based and not too ancient (e.g. GWBASIC or QuickBASIC/PDS), or Windows-based it should be OK, though.
Anyway, if either the app or the runtime is attempting direct disk I/O, you lose: it will be pretty much impossible to get things to work on a modern OS without extensive, rewrite-like, code changes.
If the app is using the normal BASIC facilities for input and output (e.g. OPEN "file" FOR whatever AS #1), and the runtime is also using the normal OS interfaces, the most likely reason it only works on FAT-16 is that it gets thorougly confused by long filenames.
First thing to try would be to put the app in a directory with a short name (e.g. c:\myapp), and seeing what happens next. Possibly it just works: otherwise, you should be able to figure out what's going on by stepping through the BASIC code (charitably assuming a debugger is part of its runtime environment).
Without some more information about the exact interpreter/compiler your app runs in, it's impossible to answer your question in more detail. If answers so far haven't been helpful, you may want to edit your question to include this information.