Once upon a time... I reverse engineered the FW of a scanner. I used this
http://plit.de/asem-51/dis51.html disassembler. Though very basic, it does good job in raw disassembling. From there on it is all manual work. The disassembler comes in source code, but the make still works flawlessly, so if you have gcc build environment, mere "make" will produce working executable.
It requires basic Intel hex input, which can be made from the binary, for example, with objcopy like "objcopy -I binary <binaryfile> -O ihex <hexfile>. The binary here is 128 kB. This disassembler can handle only 64 kB, but so can the MCS51, so this 128 kB contains something else besides just one program address space image.
So, what I did with you binary, I ihexified it, then manually, in text editor, saved low 64 kB to one and high to another file and then disassembeld both. The outputs are in the enclosed file.
I briefly looked at the codes and both parts appear to contain valid code. In the beginning of the lower part (27c010_3941-1.asm) there is a function
L0007: ;; Wait DMA to be free
MOV A, 93h
ANL A, #2h
JNZ L0012
SJMP L0007
L0012: ;; Configure DMA channel 1
;; Set source address
MOV A, 53h
MOV 0B2h, A
MOV A, 52h
MOV 0B3h, A
;, Set destination adderess
MOV A, 55h
MOV 0D2h, A
MOV A, 54h
MOV 0D3h, A
;; Set length
MOV A, 57h
MOV 0F2h, A
MOV A, 56h
MOV 0F3h, A
;; Start DMA (do increment destination and source addresses + go)
MOV 93h, #51h
L0014: ;; Wait for DMA to complete
MOV A, 93h
ANL A, #2h
JNZ L0013
SJMP L0014
L0013:
RET
Which appears to do a DMA transfer. The contents of the high part (27c010_3941-2.asm) requires
more thought. To start with, the call to the end of the address space (L0003) requires some
explanation, that someone else might be able to find.
Anyway, happy reversing!