I am not entirely certain what you are talking about. You can create a boot loader for a floppy disk. That boot loader will have to take the BPB into account. When you write the boot loader to the disk, you have to skip the BPB that's already there, or else you'll destroy the file system.
Your bootloader will then have to somehow load the next stage (typically done by iterating over the root directory and looking for a constant file name) and load that somewhere, and then jump there.
As for compatibility, you have to know the different hardware platforms you want to support. I personally am creating a pure 64-bit OS, so I am not particularly bothered about IBM 5150 compatibility. If you wish to at least recognize if someone is using a too old CPU, here's what I do:
- Push SP. An 8086 CPU will push the decremented value of SP, all others will push the old value. So if you pop that value into another register, and now the other register and SP are not equal, you are executing on an 8086. For me, that is the cue to bail out.
- All CPUs since the 80186 have implemented the undefined opcode exception, so now I just register a handler for interrupt 6 that also prints the "CPU too old" error message if triggered.
- Now I can just execute CPUID. If the CPU is anything before the later 80486s, this will just trigger #UD. Otherwise I can now identify features. Including long mode.