I use an inline disassembler originally written by David Sullins.
The tool is simple but clever, once it's given with a list of input adresses it follows the execution path of the code.
In order to simplify the 8051 code understanding I've modified disassm to print origins of all jumps and calls.
I use dis51 on UNIX/LInux systems, but it should work on Vindoz too. The only problem could come from Cariage Return chars which are different on Unix and DOS, but this won't prevent (normal) compilers from working properly. See EVOLUTION file for my documentation.
dis51.tgz