Robby & n8,
I would not expect to recompile the whole thing with out errors. Never tried it, maybe I should have said that it will mostly assemble, IE: the disassembler output is compatible with the assembler input. The idea being that you could directly import parts of the disassebly into your OWN program. Recompiling the original will be of little or no use. However with a little work, I'm sure you can get it to compile to exact original bin. You basically just need to fix up the undefined symbols, look at the .LST ouput too see whats wrong. So lets say you do all that, and you can now assemble to original .bin. You still won't be able to edit the disassembly, inserting code and re-assembling at will, since many constant values will be address dependant. For example if dptr is loaded with the address of a rom table, and the rom table is at different location since you inserted code, the code doesn't work.
So in summary, to create true source code, there can't be ANY hard coded address references. Well mostly none anyway
You will need to understand the program to a large degree. No tool (except your brain) can do this for you.