めげずに、PBR

seg000:015B                 mov     es, di
seg000:015D
seg000:015D loc_7D5D:                               ; CODE XREF: seg000:0159^Xj
seg000:015D                 cmp     word ptr [bp+44h], 0FFFh
seg000:0162                 jnz     short loc_7D76
seg000:0164                 add     bx, ax
seg000:0166                 shr     bx, 1
seg000:0168                 mov     bx, es:[bx]
seg000:016B                 jnb     short loc_7D71
seg000:016D                 mov     cl, 4
seg000:016F                 shr     bx, cl
seg000:0171
seg000:0171 loc_7D71:                               ; CODE XREF: seg000:016B^Xj
seg000:0171                 and     bh, 0Fh
seg000:0174                 jmp     short loc_7D79
seg000:0176 loc_7D76:                               ; CODE XREF: seg000:0162^Xj
seg000:0176                 mov     bx, es:[bx]
seg000:0179

ESレジスタにDIレジスタの内容を転送。
[BP+44h]の内容と即値:0FFFhとを比較。
一致しなければ、loc_7D76へジャンプ。
BXレジスタの内容にAXレジスタの内容を加算。
BXレジスタの内容を1ビット右シフト。
BXレジスタにES:[BX]の内容を転送。
JNB=JNCだから、キャリーフラグがオフなら、loc_7D71へジャンプ。
BXレジスタの内容を4ビット右シフト。
BHレジスタの内容と即値:0Fhとの論理積を求める。上位4ビットクリア。
loc_7D79に無条件ジャンプ。
BXレジスタにES:[BX]の内容を転送。

seg000:0179 loc_7D79:                               ; CODE XREF: seg000:0174^Xj
seg000:0179                 pop     es
seg000:017A                 popf
seg000:017B                 ja      short loc_7D30
seg000:017D                 mov     dl, [bp+24h]
seg000:0180                 jmp     dword ptr [bp+40h]

ESレジスタ、復元。
フラグレジスタ、復元。
小さければ、loc_7D30へジャンプ。
DLレジスタに[BP+24h]の内容を転送。
[BP+40h]に格納されているポインタ先へ far ジャンプ。


う〜ん。
途中から、完全に迷子になってしまった気がする...
たった 500Byte 弱のコードでも、アセンブラソースだけだと、正直、しんどい。


もう一度、読み直して、整理しないとダメだな、こりゃ。