you dumped a 'c' version ?
I do not know what you mean with a 'c' version. But yes, I dumped something.
how did you do that ?
I was a highly technical and top secret process of removing the IC, putting it into a PLCC44 to DIP adapter, inserting the adapter on my Labtool-48UXP programmer, selecting Intel 87C51 and hitting read button.
But first, I had to RTFM and assume nothing - which are also two of the basic rules of any troubleshooting.
Let me quote Intel Embedded Microcontrollers 1995 book, page 2-42:
"The 80C51BHP is identical to the 80C51BH with the exception of the Protection Feature. To incorporate this Protection Feature, program verification has been disabled..."
Since the MCU is -BH I am not that surprised that it was directly readable.
Looking at the code, it seems to consist of setup, then main loop which is refreshing the display. Main loop contains calls to keyscanning and serial communications. It's full of
stars state machines and a bit difficult to read thus.
Here's a snippet:
code:0273 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
code:0273
code:0273 ; In-Guard transmit/receive
code:0273
code:0273 code_273: ; CODE XREF: code:023Ep
code:0273 push PSW
code:0275 mov PSW, #0x18
code:0278 jb INTMEM_21.5, code_2D7
code:027B jb INTMEM_21.4, code_2AC
code:027E jb INTMEM_21.3, code_2AC
code:0281 jbc INTMEM_21.2, code_298
code:0284 jb INT1, code_291 ; P3.3 - EXTERNAL INTERRUPT 1 INPUT
code:0287 setb T1 ; P3.5 - TIMER 1 COUNT INPUT
code:0289 mov P2, #0xFF
code:028C setb T0 ; P3.4 - TIMER 0 COUNT INPUT
code:028E pop PSW
code:0290 ret
code:0291 ; ---------------------------------------------------------------------------
code:0291
code:0291 code_291: ; CODE XREF: code_273+11j
code:0291 jb INTMEM_21.3, code_2AC
code:0294 setb INTMEM_21.4
code:0296 sjmp code_2AC
code:0298 ; ---------------------------------------------------------------------------
code:0298
code:0298 code_298: ; CODE XREF: code_273+Ej
code:0298 setb INTMEM_21.3
code:029A mov INTMEM_58, INTMEM_55
code:029D mov INTMEM_5A, #0x77 ; 'w'
code:02A0 jnb INTMEM_22.5, code_2AA
code:02A3 mov INTMEM_5A, #0xA5 ; 'Ñ'
code:02A6 setb INTMEM_22.6
code:02A8 clr INTMEM_22.5
code:02AA
code:02AA code_2AA: ; CODE XREF: code_273+2Dj
code:02AA mov R2, #1
code:02AC
code:02AC code_2AC: ; CODE XREF: code_273+8j
code:02AC ; code_273+Bj ...
code:02AC setb T1 ; P3.5 - TIMER 1 COUNT INPUT
code:02AE mov P2, #0x7F ; ''
code:02B1 clr T0 ; P3.4 - TIMER 0 COUNT INPUT
code:02B3 setb T0 ; P3.4 - TIMER 0 COUNT INPUT
code:02B5 mov P2, #0xFF
code:02B8 clr T1 ; P3.5 - TIMER 1 COUNT INPUT
code:02BA clr EA ; IE.7 - GLOBAL INTERRUPT ENABLE
code:02BC clr T0 ; P3.4 - TIMER 0 COUNT INPUT
code:02BE setb T0 ; P3.4 - TIMER 0 COUNT INPUT
code:02C0 setb T1 ; P3.5 - TIMER 1 COUNT INPUT
code:02C2 mov P2, INTMEM_5A
code:02C5 clr T0 ; P3.4 - TIMER 0 COUNT INPUT
code:02C7 setb T0 ; P3.4 - TIMER 0 COUNT INPUT
code:02C9 clr T1 ; P3.5 - TIMER 1 COUNT INPUT
code:02CB setb TR0 ; TCON.4 - TIMER 0 ON/OFF CONTROL
code:02CD mov P2, #0xFF
code:02D0 setb INTMEM_21.5
code:02D2 setb EA ; IE.7 - GLOBAL INTERRUPT ENABLE
code:02D4 pop PSW
code:02D6 ret
code:02D7 ; ---------------------------------------------------------------------------
code:02D7
code:02D7 code_2D7: ; CODE XREF: code_273+5j
code:02D7 mov A, TL0 ; Timer0 - Low Byte
code:02D9 anl A, #0xF8
code:02DB jz code_2EE
code:02DD clr TR0 ; TCON.4 - TIMER 0 ON/OFF CONTROL
code:02DF mov TL0, #0 ; Timer0 - Low Byte
code:02E2 mov R3, P2
code:02E4 setb T1 ; P3.5 - TIMER 1 COUNT INPUT
code:02E6 clr INTMEM_21.5
code:02E8 mov DPTR, #0x2F1
code:02EB mov A, R2
code:02EC rl A
code:02ED jmp @A+DPTR
code:02EE ; ---------------------------------------------------------------------------
code:02EE
code:02EE code_2EE: ; CODE XREF: code_273+68j
code:02EE pop PSW
code:02F0 ret
code:02F0 ; End of function code_273
code:02F0
At 0x02AC is shift register load and looks like two payload bytes go back to IG.