home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 25 / nopv25.iso / 040A / CCDL151L.ZIP / MSDOS / DEBUG / OPERANDS.ASM < prev    next >
Encoding:
Assembly Source File  |  1997-06-13  |  30.5 KB  |  1,714 lines

  1.     .386p              
  2.     .model small
  3.  
  4. include  dispatch.ase 
  5. include  opcodes.asi 
  6. include  operands.asi   
  7.     PUBLIC TabTo, ReadOverrides, DispatchOperands
  8.     PUBLIC    FormatDisassembly, FormatValue, code_address
  9.     PUBLIC    PutDword, PutWord,PutByte
  10.     PUBLIC    put2,put3,put4
  11. SZ_QWORD =2
  12. SZ_TBYTE=  4
  13.  
  14.     .data
  15. code_address    dd    0
  16. dest2    dd    0
  17. source2    dd    0
  18. segs    dd    0
  19. extraoperand    OPERAND ?
  20. source    OPERAND    ?
  21. dest    OPERAND    ?
  22. nmmnemonic db    10 DUP (?)
  23. strict    db    0
  24.     align
  25. regs    db    "alcldlblahchdhbhaxcxdxbxspbpsidi"
  26. psegs    db    "escsssdsfsgs"
  27. crreg    db    "CR0?23????"
  28. drreg    db    "DR0123??67"
  29. trreg    db    "TR??????67"
  30. sudreg    db    "?R????????"
  31. scales    db    " + *2+*4+*8+"
  32. stalone    db    "st",0
  33. st_repz    db    "repz ",0
  34. st_repnz db    "repnz ",0
  35.  
  36.  
  37. base0    db    "bx+si",0
  38. base1    db    "bx+di",0
  39. base2    db    "bp+si",0
  40. base3    db    "bp+di",0
  41. base4    db    "si",0
  42. base5    db    "di",0
  43. base6    db    "bp",0
  44. base7    db    "bx",0
  45. st0    db    "fword",0    ; Should be DWORD for MATH, FWORD for jmp/call
  46. st1    db    "dword",0
  47. st2    db    "qword",0
  48. st3    db    "word",0
  49. st4    db    "tbyte"
  50. st5    db    0
  51. byptr    db    "byte ptr ",0
  52. dwptr    db    "d"
  53. woptr    db    "word"
  54. theptr    db    " ptr ",0
  55. stsreg    db    "ST(",0
  56.     align
  57. based    dd    base0,base1,base2,base3,base4,base5,base6,base7
  58. sts    dd    st0,st1,st2,st3,st4,st5,st5,st5
  59.  
  60.     .code
  61.  
  62. strlen    PROC    
  63.     push    edi
  64.     push    esi
  65.     push    ecx
  66.     push    es
  67.     push    ds
  68.     pop    es
  69.     mov    edi,esi
  70.     mov    ecx,-1
  71.     sub    al,al
  72.     repnz    scasb
  73.     mov    eax,ecx
  74.     neg    eax
  75.     dec    eax
  76.     dec    eax
  77.     pop    es
  78.     pop    ecx
  79.     pop    esi
  80.     pop    edi
  81.     ret
  82. strlen    ENDP    
  83. strcpy    PROC    
  84.     push    es
  85.     push    ds
  86.     pop    es
  87. strcpylp:
  88.     lodsb
  89.     stosb
  90.     or    al,al
  91.     jnz    strcpylp
  92.     pop    es
  93.     ret
  94. strcpy    ENDP    
  95. strcat    PROC    
  96.     mov    al,[edi]
  97.     inc    edi
  98.     or    al,al
  99.     jnz    strcat
  100.     dec    edi
  101.     jmp    strcpy
  102. strcat    ENDP    
  103. CopyExtra    PROC    
  104.     push    esi
  105.     push    edi
  106.     mov    esi,offset DGROUP:extraoperand
  107.     xchg    esi,edi
  108.     push    es
  109.     push    ds
  110.     pop    es
  111.     mov    ecx,OPERANDSIZE
  112.     rep    movsb
  113.     pop    es
  114.     pop    edi
  115.     pop    esi
  116. CopyExtra    ENDP    
  117. put2    PROC    
  118.     mov    [esi],ah
  119.     inc    esi
  120.     mov    [esi],al
  121.     inc    esi
  122.     mov    BYTE PTR [esi],0
  123.     ret
  124. put2    ENDP    
  125. put3    PROC    
  126.     push    eax
  127.     shr    eax,8
  128.     mov    [esi],ah
  129.     inc    esi
  130.     pop    eax
  131.     call    put2
  132.     ret
  133. put3    ENDP    
  134. put4    PROC    
  135.     push    eax
  136.     shr    eax,16
  137.     call    put2
  138.     pop    eax
  139.     call    put2
  140.     ret
  141. put4    ENDP    
  142. SetSeg    PROC    
  143.     mov    [strict],0
  144.     mov    [edi + OPERAND.CODE],OM_SEGMENT
  145.     mov    [edi + OPERAND.THEREG],al
  146.     ret
  147. SetSeg    ENDP    
  148. SetReg    PROC    
  149.     mov    [strict],0
  150.     mov    [edi + OPERAND.CODE],OM_REG
  151.     mov    [edi + OPERAND.THEREG],al
  152.     ret
  153. SetReg    ENDP    
  154. ReadRM    PROC    
  155.     push    ecx
  156.     sub    ecx,ecx
  157.     mov    cl,2
  158.     RM    esi
  159.     mov    [edi + OPERAND.THEREG],al
  160.     MODX    esi
  161.     mov    ch,al
  162.     cmp    ch,MOD_REG
  163.     jnz    short notregreg
  164.     mov    [edi + OPERAND.CODE],OM_REG
  165.     mov    [strict],0
  166.     sub    eax,eax
  167.     pop    ecx
  168.     ret
  169. notregreg:
  170.     bt    [edi + OPERAND.OEFLAGS],OMF_ADR32
  171.     jnc    adr16
  172.     cmp    [edi + OPERAND.THEREG],RM_32_SCALED
  173.     jnz    notscaled
  174.     inc    cl
  175.     RM    esi+1
  176.     mov    [edi + OPERAND.THEREG],al
  177.     REG    esi+1
  178.     mov    [edi + OPERAND.SCALEREG],al
  179.     MODX    esi+1
  180.     mov    [edi + OPERAND.SCALE],al
  181.     cmp    [edi + OPERAND.SCALEREG],RM_32_STACKINDEX
  182.     jz    hassp
  183.     bts    [edi + OPERAND.OEFLAGS],OMF_SCALED
  184. hassp:
  185.     cmp    [edi + OPERAND.THEREG],RM_32_ABSOLUTE
  186.     jnz    basedAndScaled
  187.     cmp    ch,MOD_NOOFS
  188.     jnz    short basedAndScaled
  189.     mov    [edi + OPERAND.CODE],OM_ABSOLUTE
  190.     LONG    esi+3
  191.     mov    [edi + OPERAND.ADDRESS],eax
  192.     sub    eax,eax
  193.     mov    al,5
  194.     pop    ecx
  195.     ret
  196. notscaled:
  197.     
  198.     cmp    ch,MOD_NOOFS
  199.     jnz    basedAndScaled
  200.     cmp    [edi + OPERAND.THEREG], RM_32_ABSOLUTE
  201.     jnz    basedAndScaled
  202.     mov    [edi + OPERAND.CODE], OM_ABSOLUTE
  203.     LONG    esi+2
  204.     mov    [edi + OPERAND.ADDRESS],eax
  205.     sub    eax,eax
  206.     sub    eax,eax
  207.     mov    al,4
  208.     pop    ecx
  209.     ret
  210. adr16:
  211.     cmp    ch,MOD_NOOFS
  212.     jnz    basedAndScaled
  213.     cmp    [edi + OPERAND.THEREG], RM_16_ABSOLUTE
  214.     jnz    basedAndScaled
  215.     mov    [edi + OPERAND.CODE], OM_ABSOLUTE
  216.     mov    [edi + OPERAND.ADDRESS],eax
  217.     sub    eax,eax
  218.     mov    al,2
  219.     pop    ecx
  220.     ret
  221. basedAndScaled:
  222.     mov    [edi + OPERAND.CODE], OM_BASED
  223.     cmp    ch,MOD_ADDR
  224.     jnz    short checksigned
  225.     bts    [edi + OPERAND.OEFLAGS], OMF_WORD_OFFSET
  226.     push    ecx
  227.     sub    ch,ch
  228.     mov    eax,[esi+ecx]
  229.     pop    ecx
  230.     bt    [edi + OPERAND.OEFLAGS], OMF_ADR32
  231.     jc    dwordx
  232.     and    eax,0ffffh
  233.     sub    cl,2
  234. dwordx:
  235.     mov    [edi + OPERAND.ADDRESS],eax
  236.     add    cl,4
  237.     jmp    short readrmdone
  238. checksigned:
  239.     cmp    ch, MOD_SIGNED
  240.     jnz    short readrmdone
  241.     bts    [edi + OPERAND.OEFLAGS],OMF_SIGNED_OFFSET
  242.     push    ecx
  243.     sub    ch,ch
  244.     sub    eax,eax
  245.     mov    al,[esi+ecx]
  246.     pop    ecx
  247.     mov    [edi + OPERAND.ADDRESS],eax
  248.     inc    cl
  249. readrmdone:
  250.     mov    eax,ecx
  251.     sub    al,2
  252.     cbw
  253.     cwde
  254.     pop    ecx
  255.     ret
  256. ReadRM    ENDP    
  257. RegRM    PROC    
  258.     mov    edi,[dest2]
  259.     REG    esi
  260.     call    SetReg
  261.     mov    edi,[source2]
  262.     call    ReadRM
  263.     ret
  264. RegRM    ENDP    
  265. Immediate    PROC    
  266.     push    ecx
  267.     sub    ecx,ecx
  268.     mov    [edi + OPERAND.CODE],OM_IMMEDIATE
  269.     bt    [edi + OPERAND.OEFLAGS],OMF_BYTE
  270.     jnc    short inotbyte
  271.     inc    cl
  272.     sub    eax,eax
  273.     mov    al,[esi]
  274.     jmp    short i_ret
  275. inotbyte:
  276.     bt    [edi + OPERAND.OEFLAGS], OMF_OP32
  277.     jnc    iword
  278.     add    cl,4
  279.     LONG    esi
  280.     jmp    short i_ret
  281. iword:
  282.     add    cl,2
  283.     UINT    esi
  284. i_ret:
  285.     mov    [edi + OPERAND.ADDRESS],eax
  286.     mov    eax,ecx
  287.     pop    ecx
  288.     ret
  289. Immediate    ENDP    
  290. MnemonicChar    PROC    
  291.     push    edi
  292.     mov    edi,offset DGROUP:nmmnemonic
  293. mc2:
  294.     inc    edi
  295.     cmp    BYTE PTR [edi-1],0
  296.     jnz    mc2
  297.     mov    [edi-1],al
  298.     mov    BYTE PTR [edi],0
  299.     pop    edi
  300.     ret
  301. MnemonicChar    ENDP    
  302. ;/* op 1- word reg from bits 0 - 2 of opcode */
  303. op1    PROC    
  304.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  305.     mov    al,[esi]
  306.     B02
  307.     call    SetReg
  308.     sub    eax,eax
  309.     ret
  310. op1    ENDP    
  311. ;/* Op2 acc, reg bits 0-2 of opcode */
  312. op2    PROC    
  313.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  314.     btr    [ebx + OPERAND.OEFLAGS],OMF_BYTE
  315.     mov    al,REG_EAX
  316.     call    SetReg
  317.     mov    edi,ebx
  318.     mov    al,[esi]
  319.     and     al,7
  320.     call    SetReg
  321.     sub    eax,eax
  322.     ret
  323. op2    ENDP    
  324. ;/* op3 - seg from b3-5 of opcode */
  325. op3    PROC    
  326.     mov    al,[esi]
  327.     B35
  328.     call    SetSeg
  329.     sub    eax,eax
  330.     ret
  331. op3    ENDP    
  332. ;/* op4 - REGRM with b1 of opcode set reg is dest else source */
  333. op4    PROC    
  334.     bt    DWORD PTR [esi],1
  335.     jc    short op4nox
  336.     xchg    ebx,edi
  337. op4nox:
  338.     mov    [dest2],edi
  339.     mov    [source2],ebx
  340.     call    RegRM
  341.     ret
  342. op4    ENDP    
  343. ;/* op5 - use RM only */
  344. op5    PROC    
  345.     call    ReadRM
  346.     ret
  347. op5    ENDP    
  348. ;/* op6 READRM for shift */
  349. op6    PROC    
  350.     call    ReadRM
  351.     sub    ecx,ecx
  352.     mov    cl,al
  353.     mov    edi,ebx
  354.     mov    [edi + OPERAND.CODE],OM_SHIFT
  355.     bt    DWORD PTR [esi],4
  356.     jnc    short op6cnt
  357.     bt    DWORD PTR [esi],1
  358.     jnc    op61
  359.     bts    [edi + OPERAND.OEFLAGS],OMF_CL
  360.     jmp    short op6done
  361. op61:
  362.     mov    [edi + OPERAND.ADDRESS],1
  363.     jmp    short op6done
  364. op6cnt:
  365.     sub    eax,eax
  366.     movzx    eax,BYTE PTR [esi+ecx+2]
  367.     inc    cl
  368.     mov    [edi + OPERAND.ADDRESS],eax
  369. op6done:
  370.     mov    eax,ecx
  371.     ret
  372. op6    ENDP    
  373. ;/* op 7 regrm with reg dest */
  374. op7    PROC    
  375.     mov    [dest2],edi
  376.     mov    [source2],ebx
  377.     call    RegRM
  378.     ret
  379. op7    ENDP    
  380. ;/* OP8 - word regrm with reg dest */
  381. op8    PROC    
  382.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  383.     btr    [ebx + OPERAND.OEFLAGS],OMF_BYTE
  384.     jmp    op7
  385. op8    ENDP    
  386. ;/* op 9 - interrupts */
  387. op9    PROC    
  388.     mov    [strict],0
  389.     sub    eax,eax
  390.     mov    al,3
  391.     bt    DWORD PTR [esi],0
  392.     jnc    short op9int3
  393.     mov    al,[esi+1]
  394. op9int3:
  395.     mov    [edi + OPERAND.ADDRESS],eax
  396.     mov    BYTE PTR [edi + OPERAND.CODE],OM_INT
  397.     sub    al,al
  398.     ret
  399. op9    ENDP    
  400. ;/* op 10, short relative branch */
  401. op10    PROC    
  402.     mov    [strict],0
  403.     mov    [edi + OPERAND.CODE],OM_SHORTBRANCH
  404.     movsx    eax,BYTE PTR [esi+1]
  405.     inc    eax
  406.     inc    eax
  407.     add    eax,[code_address]
  408.     mov    [edi + OPERAND.ADDRESS],eax
  409.     bt    [edi + OPERAND.OEFLAGS],OMF_OP32
  410.     jc    short op10notword
  411.     and    [edi + OPERAND.ADDRESS],0ffffh
  412. op10notword:
  413.     sub    eax,eax
  414.     ret
  415. op10    ENDP    
  416. ;/* op 11 RM, immediate */
  417. op11    PROC    
  418.     call    ReadRM
  419.     movzx    ecx,al
  420.     mov    edi,ebx
  421.     push    esi
  422.     add    esi,ecx
  423.     add    esi,2
  424.     call    Immediate
  425.     add    cl,al
  426.     pop    esi
  427.     mov    eax,ecx
  428.     ret
  429. op11    ENDP    
  430. ;/* op 12 - acc, immediate */
  431. op12    PROC    
  432.     mov    al,REG_EAX
  433.     call    SetReg
  434.     mov    edi,ebx
  435.     inc    esi
  436.     call    Immediate
  437.     dec    esi
  438.     ret
  439. op12    ENDP    
  440. ;/* op 13 absolute, acc*/
  441. op13    PROC    
  442.     sub    ecx,ecx
  443.     mov    [edi + OPERAND.CODE],OM_ABSOLUTE
  444.     bt    [edi + OPERAND.OEFLAGS],OMF_ADR32
  445.     jnc    short op13word
  446.     LONG    esi+1
  447.     inc    cl
  448.     inc    cl
  449.     jmp    short op13fin
  450. op13word:
  451.     UINT    esi+1
  452. op13fin:
  453.     mov    [edi + OPERAND.ADDRESS],eax
  454.     mov    edi,ebx
  455.     mov    al,REG_EAX
  456.     call    SetReg
  457.     mov    eax,ecx
  458.     ret
  459. op13    ENDP    
  460. ;/* op 14 - RM, immediate, b01 of opcode != 1 for byte */
  461. op14    PROC    
  462.     call    ReadRM
  463.     movzx    ecx,al
  464.     mov    al,[esi]
  465.     B01
  466.     jnz    short op14checkbyte
  467.     bts    [ebx + OPERAND.OEFLAGS],OMF_BYTE
  468.     bts    [edi + OPERAND.OEFLAGS],OMF_BYTE
  469.     jmp    short op14source
  470. op14checkbyte:
  471.     btr    [ebx + OPERAND.OEFLAGS],OMF_BYTE
  472.     cmp    al,1
  473.     jz    short op14check2
  474.     bts    [ebx + OPERAND.OEFLAGS],OMF_BYTE
  475. op14check2:
  476.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  477. op14source:
  478.     mov    edi,ebx
  479.     push    esi
  480.     add    esi,ecx
  481.     add    esi,2
  482.     call    Immediate
  483.     pop    esi
  484.     add    cl,al
  485.     mov    al,[esi]
  486.     B01
  487.     cmp    al,3
  488.     jnz    op14done
  489.     bt    [edi + OPERAND.OEFLAGS],OMF_BYTE
  490.     jnc    op14done
  491.     bts    [edi + OPERAND.OEFLAGS],OMF_SIGNED
  492.     mov    eax,[edi + OPERAND.ADDRESS]
  493.     cbw
  494.     cwde
  495.     mov    [edi + OPERAND.ADDRESS],eax
  496. op14done:
  497.     mov    eax,ecx
  498.     ret
  499. op14    ENDP    
  500. ;/* op 15 - acc, immediate, B3 of opcode clear for byte */
  501. op15    PROC    
  502.     mov    al,[esi]
  503.     B02
  504.     call    SetReg
  505.     bt    DWORD PTR [esi],3
  506.     jnc    op15byte
  507.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  508.     btr    [ebx + OPERAND.OEFLAGS],OMF_BYTE
  509.     jmp    short op15source
  510. op15byte:
  511.     bts    [edi + OPERAND.OEFLAGS],OMF_BYTE
  512.     bts    [ebx + OPERAND.OEFLAGS],OMF_BYTE
  513. op15source:
  514.     mov    edi,ebx
  515.     inc    esi
  516.     call    Immediate
  517.     dec    esi
  518.     ret
  519. op15    ENDP    
  520. ;/* op 16 - seg,readrm, if B1 of opcode seg is dest else source */
  521. op16    PROC    
  522.     bt    DWORD PTR [esi],1
  523.     jc    noswap
  524.     xchg    ebx,edi
  525. noswap:
  526.     REG    esi
  527.     call    SetSeg
  528.     mov    edi,ebx
  529.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  530.     call    ReadRM
  531.     ret
  532. op16    ENDP    
  533. ;/* op 17, far return */
  534. op17    PROC    
  535.     mov    [strict],0
  536.     mov    [edi + OPERAND.CODE],OM_RETURN
  537.     btr    [edi + OPERAND.OEFLAGS],OMF_ADR32
  538.     btr    [edi + OPERAND.OEFLAGS],OMF_OP32
  539.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  540.     UINT    esi+1
  541.     mov    [edi + OPERAND.ADDRESS],eax
  542.     sub    eax,eax
  543.     ret
  544. op17    ENDP    
  545. ;/* op 18, far branch/call */
  546. op18    PROC    
  547.     sub    ecx,ecx
  548.     mov    [strict],0
  549.     mov    [edi + OPERAND.CODE],OM_FARBRANCH
  550.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  551.     bt    [edi + OPERAND.OEFLAGS],OMF_OP32
  552.     jnc    short op18word
  553.     inc    cl
  554.     inc    cl
  555.     LONG    esi+1
  556.     jmp    short    op18fin
  557. op18word:
  558.     UINT    esi+1
  559. op18fin:
  560.     mov    [edi + OPERAND.ADDRESS],eax
  561.     UINT    esi+ecx+3
  562.     mov    [edi + OPERAND.OESEG],ax
  563.     mov    eax,ecx
  564.     ret
  565. op18    ENDP    
  566. ;/* op 19 - ESC, mnem of bits 0-2 of opcode, imm,readrm */
  567. op19    PROC    
  568.     mov    [edi + OPERAND.CODE],OM_IMMEDIATE
  569.     bts    [edi + OPERAND.OEFLAGS],OMF_BYTE
  570.     mov    al,[esi]
  571.     and    al,7
  572.     shl    al,3
  573.     mov    ah,[esi+1]
  574.     shr    ah,3
  575.     and    ah,7
  576.     or    al,ah
  577.     sub    ah,ah
  578.     cwde
  579.     mov    [edi+ OPERAND.ADDRESS],eax
  580.     mov    edi,ebx
  581.     call    ReadRM
  582.     ret
  583. op19    ENDP    
  584. ;/* op 20 - long branch */
  585. op20    PROC    
  586.     mov    [strict],0
  587.     sub    ecx,ecx
  588.     mov    [edi + OPERAND.CODE],OM_LONGBRANCH
  589.     bt    [edi + OPERAND.OEFLAGS],OMF_OP32
  590.     jnc    short op20word
  591.     LONG    esi+1
  592.     inc    cl
  593.     inc    cl
  594.     jmp    short op20fin
  595. op20word:
  596.     UINT    esi+1
  597. op20fin:
  598.     add    eax,[code_address]
  599.     test    [segs],SG_TWOBYTEOP
  600.     jz    op20xx
  601.     inc    eax
  602. op20xx:
  603.     add    eax,ecx
  604.     add    eax,3
  605.     bt    [edi + OPERAND.OEFLAGS],OMF_OP32
  606.     jc    op20done
  607.     and    eax,0ffffh
  608. op20done:
  609.     mov    [edi + OPERAND.ADDRESS],eax
  610.     mov    eax,ecx
  611.     ret
  612. op20    ENDP    
  613. ;/* op21 acc,dx */
  614. op21    PROC    
  615.     mov    al,REG_EAX
  616.     call    SetReg
  617.     mov    edi,ebx
  618.     btr    [edi + OPERAND.OEFLAGS],OMF_OP32
  619.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  620.     mov    al,REG_DX
  621.     call    SetReg
  622.     sub    eax,eax
  623.     ret
  624. op21    ENDP    
  625. ;/* op22 - dx,acc */
  626. op22    PROC    
  627.     btr    [edi + OPERAND.OEFLAGS],OMF_OP32
  628.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  629.     mov    al,REG_DX
  630.     call    SetReg
  631.     mov    edi,ebx
  632.     mov    al,REG_EAX
  633.     call    SetReg
  634.     sub    eax,eax
  635.     ret
  636. op22    ENDP    
  637. ;/* op23 - port,acc where B1 of opcode set is port dest */
  638. op23    PROC    
  639.     bt    DWORD PTR [esi],1
  640.     jc    short op20noswap
  641.     xchg    ebx,edi
  642. op20noswap:
  643.     bts    [edi + OPERAND.OEFLAGS],OMF_BYTE
  644.     mov    [edi + OPERAND.CODE],OM_PORT
  645.     movzx    eax,BYTE PTR [esi+1]
  646.     mov    [edi + OPERAND.ADDRESS],eax
  647.     mov    edi,ebx
  648.     mov    al,REG_EAX
  649.     call    SetReg
  650.     sub    eax,eax
  651.     ret
  652. op23    ENDP    
  653. ;/* op 24 acc, absolute */
  654. op24    PROC    
  655.     sub    ecx,ecx
  656.     mov    al,REG_EAX
  657.     call    SetReg
  658.     mov    edi,ebx
  659.     mov    [edi + OPERAND.CODE],OM_ABSOLUTE
  660.     bt    [edi + OPERAND.OEFLAGS],OMF_ADR32
  661.     jnc    short op24word
  662.     inc    cl
  663.     inc    cl
  664.     LONG    esi+1
  665.     jmp    short op24done
  666. op24word:
  667.     UINT    esi+1
  668. op24done:
  669.     mov    [edi + OPERAND.ADDRESS],eax
  670.     mov    eax,ecx
  671.     ret
  672. op24    ENDP    
  673. ;/* op 25 - immediate byte or word */
  674. op25    PROC    
  675.     mov    [strict],0
  676.     bts    [edi + OPERAND.OEFLAGS],OMF_BYTE
  677.     bt    DWORD PTR [esi],1
  678.     jc    short op25fin
  679.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  680. op25fin:
  681.     push    esi
  682.     inc    esi
  683.     call    Immediate
  684.     pop    esi
  685.     ret
  686. op25    ENDP    
  687. ;/* op 26, immediate 2byte,byte */
  688. op26    PROC    
  689.     mov    [strict],0
  690.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  691.     btr    [edi + OPERAND.OEFLAGS],OMF_OP32
  692.     push    esi
  693.     inc    esi
  694.     call    Immediate
  695.     mov    edi,ebx
  696.     bts    [edi + OPERAND.OEFLAGS],OMF_BYTE
  697.     btr    [edi + OPERAND.OEFLAGS],OMF_OP32
  698.     inc    esi
  699.     inc    esi
  700.     call    Immediate
  701.     pop    esi
  702.     sub    eax,eax
  703.     ret
  704. op26    ENDP    
  705. ;/* op 27 - string */
  706. op27    PROC    
  707.     mov    al,'d'
  708.     bt    [edi + OPERAND.OEFLAGS],OMF_OP32
  709.     jc    short op27pc
  710.     mov    al,'w'
  711. op27pc:
  712.     call    MnemonicChar
  713.     sub    eax,eax
  714.     ret
  715. op27    ENDP    
  716. ;/* op 28 - source = REG, dest = RM */
  717. op28    PROC    
  718.     REG    esi
  719.     call    SetReg
  720.     mov    edi,ebx
  721.     RM    esi
  722.     call    SetReg
  723.     sub    eax,eax
  724.     ret
  725. op28    ENDP    
  726. ;/* op 29 - dest = RM, immediate */
  727. op29    PROC    
  728.     bts    [edi + OPERAND.OEFLAGS],OMF_BYTE
  729.     RM    esi
  730.     call    SetReg
  731.     mov    edi,ebx
  732.     bts    [edi + OPERAND.OEFLAGS],OMF_BYTE
  733.     push    esi
  734.     inc    esi
  735.     inc    esi
  736.     call    Immediate
  737.     pop    esi
  738.     sub    eax,eax
  739.     ret
  740. op29    ENDP    
  741. ;/* op30 - RM, shift with B3 of stream selecting COUNT or CL*/
  742. op30    PROC    
  743.     call    ReadRM
  744.     mov    ecx,eax
  745.     mov    edi,ebx
  746.     mov    [edi + OPERAND.CODE],OM_SHIFT
  747.     bt    DWORD PTR [esi],3
  748.     jnc    op30cl
  749.     mov    eax,[esi+ecx+2]
  750.     inc    ecx
  751.     jmp    short op30done
  752. op30cl:
  753.     bts    [edi + OPERAND.OEFLAGS],OMF_CL
  754. op30done:
  755.     mov    eax,ecx
  756.     ret
  757. op30    ENDP    
  758. ;/* op 31- reg, rm, count where B1 of opcode = byte/word */
  759. op31    PROC    
  760.     call    CopyExtra
  761.     REG    esi
  762.     call    SetReg
  763.     mov    edi,ebx
  764.     call    ReadRM
  765.     mov    ecx,eax
  766.     mov    edi,offset DGROUP:extraoperand
  767.     bts    [edi + OPERAND.OEFLAGS],OMF_BYTE
  768.     bt    DWORD PTR [esi],1
  769.     jc    short op31byte
  770.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  771. op31byte:
  772.     push    esi
  773.     inc    esi
  774.     inc    esi
  775.     call    Immediate
  776.     pop    esi
  777.     add    eax,ecx
  778.     ret
  779. op31    ENDP    
  780. ;/* op32 - 386 special regs */
  781. op32    PROC    
  782.     movzx    ecx,WORD PTR [esi]
  783.     and    cx,0c005h
  784.     cmp    cx,0c000h
  785.     mov    al,OM_CRX
  786.     jz    short op32gotype
  787.     cmp    cx,0c001h
  788.     mov    al,OM_DRX
  789.     jz    short op32gotype
  790.     cmp    cx,0c004h
  791.     mov    al,OM_TRX
  792.     jz    short op32gotype
  793.     mov    al,OM_SUD
  794. op32gotype:
  795.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  796.     btr    [ebx + OPERAND.OEFLAGS],OMF_BYTE
  797.     bts    [edi + OPERAND.OEFLAGS],OMF_OP32
  798.     bts    [ebx + OPERAND.OEFLAGS],OMF_OP32
  799.     bt    DWORD PTR [esi],1
  800.     jc    op32noswap
  801.     xchg    ebx,edi
  802. op32noswap:
  803.     mov    [edi + OPERAND.CODE],al
  804.     REG    esi
  805.     mov    [edi + OPERAND.THEREG],al
  806.     mov    edi,ebx
  807.     RM    esi
  808.     call    SetReg
  809.     sub    eax,eax
  810.     ret
  811. op32    ENDP    
  812. ;/* op33 - reg,rm,shiftcnt where B3 = reg source, b0 = shift cl */
  813. op33    PROC    
  814.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  815.     btr    [ebx + OPERAND.OEFLAGS],OMF_BYTE
  816.     call    CopyExtra
  817.     call    ReadRM
  818.     mov    ecx,eax
  819.     REG    esi
  820.     mov    edi,ebx
  821.     call    SetReg
  822.     mov    edi,offset DGROUP:extraoperand
  823.     mov    [edi + OPERAND.CODE],OM_SHIFT
  824.     bt    DWORD PTR [esi],0
  825.     jnc    short getofs
  826.     bts    [edi + OPERAND.OEFLAGS],OMF_CL
  827.     jmp    short op33done
  828. getofs:
  829.     movzx    eax,BYTE PTR [esi+ecx+2]
  830. op33done:
  831.     mov    eax,ecx
  832.     ret
  833. op33    ENDP    
  834. ;/* op 34 - push & pop word */
  835. op34    PROC    
  836.     test    [segs],SG_TWOBYTEOP
  837.     jnz    short op34twobyte
  838.     test    [segs],SG_OPSIZ
  839.     jnz    short op34fin
  840.     mov    [strict],0
  841. op34fin:
  842.     call    ReadRM
  843.     ret
  844. op34twobyte:
  845.     btr    [edi+OPERAND.OEFLAGS],OMF_OP32
  846.     btr    [edi + OPERAND.OEFLAGS],OMF_OP32
  847.     jmp    op34fin
  848. op34    ENDP    
  849. ;/* op 35 -floating RM */
  850. op35    PROC    
  851.     mov    [strict],0
  852.     mov    ax,[esi]
  853.     and    ax,0d0deh
  854.     cmp    ax,0d0deh
  855.     jnz    short op35nop
  856.     mov    al,'p'
  857.     call    MnemonicChar
  858. op35nop:
  859.     MODX    esi
  860.     cmp    al,3
  861.     jnz    short op35fsttab
  862.     bts    [edi + OPERAND.OEFLAGS],OMF_FST
  863.     jmp    short op35fin
  864. op35fsttab:
  865.     bts    [edi + OPERAND.OEFLAGS],OMF_FSTTAB
  866.     movzx    eax,BYTE PTR [edi]
  867.     B12
  868.     shl    eax, OM_FTAB
  869.     or    [edi + OPERAND.OEFLAGS],ax
  870. op35fin:
  871.     call    ReadRM
  872.     ret
  873. op35    ENDP    
  874. ;/* op 36 - sized floating RM */
  875. op36    PROC    
  876.     mov    cx,SZ_QWORD
  877.     mov    [strict],0
  878.     mov    ax,[esi]
  879.     and    ax,2807h
  880.     cmp    ax,2807h
  881.     jz    short op36notbyte
  882.     mov    cx,SZ_TBYTE
  883. op36notbyte:
  884.     bts    [edi + OPERAND.OEFLAGS],OMF_FSTTAB
  885.     shl    ecx,OM_FTAB
  886.     or    [edi + OPERAND.OEFLAGS],cx
  887.     call    ReadRM
  888.     ret
  889. op36    ENDP    
  890. ;/* OP 37 - floating MATH */
  891. op37    PROC    
  892.     sub    edx,edx
  893.     mov    [strict],0
  894.     mov    ax,[esi]
  895.     and    ax,0c0deh
  896.     cmp    ax,0c0deh
  897.     jnz    short op37noflop
  898.     inc    edx
  899. op37noflop:
  900.     REG    esi
  901.     and    al,5
  902.     xor    al,dl
  903.     cmp    al,5
  904.     jnz    short op37nor
  905.     mov    al,'r'
  906.     call    MnemonicChar
  907. op37nor:
  908.     MODX    esi
  909.     cmp    al,3
  910.     jz    op37reg
  911.     bts    [edi + OPERAND.OEFLAGS],OMF_FSTTAB
  912.     mov    al,[esi]
  913.     B12
  914.     shl    eax,OM_FTAB
  915.     or    [edi + OPERAND.OEFLAGS],ax
  916.     call    ReadRM
  917.     jmp    short op37done
  918. op37reg:
  919.     test    BYTE PTR [esi],6
  920.     jz    short op37nop
  921.     mov    al,'p'
  922.     call    MnemonicChar
  923. op37nop:
  924.     bt    DWORD PTR [esi],2
  925.     jc    short op37noswap
  926.     xchg    ebx,edi
  927. op37noswap:
  928.     RM    esi
  929.     call    SetReg
  930.     bts    [edi + OPERAND.OEFLAGS],OMF_FST
  931.     mov    edi,ebx
  932.     mov    [edi + OPERAND.CODE],OM_FSTREG
  933.     sub    eax,eax
  934. op37done:
  935.     ret
  936. op37    ENDP    
  937. op38    PROC    
  938.     mov    [strict],0
  939.     bts    [edi + OPERAND.OEFLAGS],OMF_FSTTAB
  940.     call    ReadRM
  941.     ret
  942. op38    ENDP    
  943. ;/* OP39 - word regrm with reg source */
  944. op39    PROC    
  945.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  946.     btr    [ebx + OPERAND.OEFLAGS],OMF_BYTE
  947.     call    op40
  948.     ret
  949. op39    ENDP    
  950. ;/* op 40 regrm with reg source */
  951. op40    PROC    
  952.     mov    [dest2],ebx
  953.     mov    [source2],edi
  954.     call    RegRM
  955.     ret
  956. op40    ENDP    
  957. ;/* op 41 reg, bitnum */
  958. op41    PROC    
  959.     btr    [edi+OPERAND.OEFLAGS],OMF_BYTE
  960.     call    ReadRM
  961.     mov    ecx,eax
  962.     mov    edi,ebx
  963.     bts    [edi+OPERAND.OEFLAGS],OMF_BYTE
  964.     push    esi
  965.     add    esi,ecx
  966.     add    esi,2
  967.     call    Immediate
  968.     pop    esi
  969.     mov    eax,ecx
  970.     ret
  971. op41    ENDP    
  972. ;/* op 42 mixed regrm with reg dest & strictness enforced */
  973. op42    PROC    
  974.     mov    [dest2],edi
  975.     mov    [source2],ebx
  976.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  977.     btr    [ebx + OPERAND.OEFLAGS],OMF_OP32
  978.     call    RegRM
  979.     mov    [strict],1
  980.     ret
  981. op42    ENDP    
  982. ;/* op 43 CWDE
  983. op43    PROC    
  984.     bt    [edi + OPERAND.OEFLAGS],OMF_OP32
  985.     jnc    short op43nochng
  986.     push    esi
  987.     mov    esi,offset DGROUP:nmmnemonic + 1
  988.     mov    eax,"wde"
  989.     call    put3
  990.     mov    BYTE PTR [esi],0
  991.     pop    esi
  992.     sub    eax,eax
  993. op43nochng:
  994.     ret
  995. op43    ENDP    
  996. ReadOverrides    PROC    
  997.           
  998. ro_lp:
  999.     sub    eax,eax
  1000.     lods    BYTE PTR [esi]
  1001.     cmp    al,64h
  1002.     jc    short testseg
  1003.     cmp    al,68h
  1004.     jnc    short testseg
  1005.     sub    al,64h
  1006.     mov    ebx,SG_FS
  1007. ro_found:
  1008.     mov    cl,al
  1009.     shl    ebx,cl
  1010.     or    [segs],ebx
  1011.     jmp    short ro_lp
  1012. testseg:
  1013.     push    eax
  1014.     and    al,0e7h
  1015.     cmp    al,026h
  1016.     pop    eax
  1017.     jnz    testrep
  1018.     mov    ebx,1
  1019.     shr    eax,3
  1020.     and    al,3
  1021.     jmp    ro_found
  1022. testrep:
  1023.     sub    al,0f2h
  1024.     cmp    al,2
  1025.     jnc    ro_done
  1026.     mov    ebx,SG_REPNZ
  1027.     jmp    short ro_found
  1028. ro_done:
  1029.     dec    esi
  1030.     ret
  1031. ReadOverrides    ENDP    
  1032. DispatchOperands    PROC    
  1033.     push    ebx
  1034.     mov    edi,offset DGROUP:nmmnemonic
  1035.     push    esi
  1036.     mov    esi,[ebx + OPCODE.MNEMONIC]
  1037.     call    strcpy
  1038.     pop    esi
  1039.     mov    [strict],TRUE
  1040.     movzx    eax,[ebx + OPCODE.OPERANDS]
  1041.     push    eax
  1042.     mov    edi,offset DGROUP:dest
  1043.     mov    ebx,offset DGROUP:source
  1044.     cmp    BYTE PTR [esi-1],0fh
  1045.     jnz    short notwobyte
  1046.     or    [segs],SG_TWOBYTEOP
  1047. notwobyte:
  1048.     mov    eax,offset DGROUP:extraoperand
  1049.     mov    [eax + OPERAND.CODE],0
  1050.     mov    [edi + OPERAND.CODE],0
  1051.     mov    [ebx + OPERAND.CODE],0
  1052.     mov    [edi + OPERAND.OEFLAGS],0
  1053.     mov    [ebx + OPERAND.OEFLAGS],0
  1054.  
  1055.     bt    DWORD PTR [esi],0
  1056.     jc    notbyte
  1057.     bts    [edi + OPERAND.OEFLAGS],OMF_BYTE
  1058.     bts    [ebx + OPERAND.OEFLAGS],OMF_BYTE
  1059. notbyte:
  1060.     test    [segs],SG_ADRSIZ
  1061.     jnz    do_word1
  1062.     bts    [edi + OPERAND.OEFLAGS],OMF_ADR32
  1063.     bts    [ebx + OPERAND.OEFLAGS],OMF_ADR32
  1064. do_word1:
  1065.     test    [segs],SG_OPSIZ
  1066.     jnz    do_word2
  1067.     bts    [edi + OPERAND.OEFLAGS],OMF_OP32
  1068.     bts    [ebx + OPERAND.OEFLAGS],OMF_OP32
  1069. do_word2:
  1070.     
  1071.     pop    eax
  1072.     or    eax,eax
  1073.     jz    nodispatch
  1074.     dec    al
  1075.     push    0
  1076.     call    TableDispatch
  1077.     dd    42
  1078.     dd    op1, op2, op3, op4, op5, op6, op7, op8, op9, op10
  1079.     dd    op11, op12, op13, op14, op15, op16, op17, op18, op19, op20
  1080.     dd    op21, op22, op23, op24, op25, op26, op27, op28, op29, op30
  1081.     dd    op31, op32, op33, op34, op35, op36, op37, op38, op39, op40
  1082.     dd    op41, op42, op43
  1083.     add    esi,eax
  1084. nodispatch:
  1085.     pop    ebx
  1086.     movzx    eax,[ebx + OPCODE.OCLENGTH]
  1087.     add    esi,eax
  1088.     ret
  1089. DispatchOperands    ENDP    
  1090. DoStrict    PROC    
  1091.     push    edi
  1092.     push    esi
  1093.     test    [strict],-1
  1094.     jz    short floatstrict
  1095.     bt    [edi + OPERAND.OEFLAGS],OMF_BYTE
  1096.     jnc    chkdwptr
  1097.     mov    edi,esi
  1098.     mov    esi,offset DGROUP:byptr
  1099.     jmp    short strictend
  1100. chkdwptr:
  1101.     bt    [edi + OPERAND.OEFLAGS],OMF_OP32
  1102.     mov    edi,esi
  1103.     jnc    mkwordptr
  1104.     mov    esi,offset DGROUP:dwptr
  1105.     jmp    short strictend
  1106. mkwordptr:
  1107.     mov    esi,offset DGROUP:woptr
  1108.       jmp    short strictend
  1109. floatstrict:
  1110.     bt    [edi + OPERAND.OEFLAGS],OMF_FSTTAB
  1111.     jnc    strictdone
  1112.     movzx    eax,[edi + OPERAND.OEFLAGS]
  1113.     shr    eax,OM_FTAB
  1114.     and    eax,7
  1115.     mov    edi,esi
  1116.     push    edi
  1117.     mov    esi,offset DGROUP:sts
  1118.     mov    esi,[esi + eax * 4]
  1119.     call    strcat
  1120.     mov    esi,offset DGROUP:theptr
  1121.     pop    edi
  1122. strictend:
  1123.     call    strcat
  1124. strictdone:
  1125.     pop    esi
  1126.     call    strlen
  1127.     add    esi,eax
  1128.     pop    edi
  1129.     ret
  1130. DoStrict    ENDP    
  1131. TabTo    PROC    
  1132.     cbw
  1133.     cwde
  1134.     mov    ecx,eax
  1135.     call    strlen
  1136.     xchg    eax,ecx
  1137.     sub    eax,ecx
  1138.     jnc    tt_noover
  1139.     add    eax,ecx
  1140.     add    esi,eax
  1141.     jmp    short tt_done
  1142. tt_noover:
  1143.     add    esi,ecx
  1144.     mov    ecx,eax
  1145. tabtlp:
  1146.     mov    BYTE PTR [esi],' '
  1147.     inc    esi
  1148.     loop    tabtlp
  1149. tt_done:
  1150.     mov    BYTE PTR [esi],0
  1151.     ret
  1152. TabTo    ENDP    
  1153. GetST    PROC    
  1154.     mov    al,[edi + OPERAND.THEREG]
  1155.     xchg    esi,edi
  1156.     mov    esi,offset DGROUP:stsreg
  1157.     call    strcpy
  1158.     xchg    esi,edi
  1159.     dec    esi
  1160.     mov    BYTE PTR [esi],')'
  1161.     inc    esi
  1162.     mov    BYTE PTR [esi],0
  1163.     ret
  1164. GetST    ENDP    
  1165. GetStdReg    PROC    
  1166.     push    edi
  1167.     or    al,al
  1168.     jnz    short gsrnoe
  1169.     mov    BYTE PTR [esi],'e'
  1170.     inc    esi
  1171. gsrnoe:
  1172.     mov    edi,offset DGROUP:regs
  1173.     mov    ax,[edi + ecx *2]
  1174.     mov    [esi],al
  1175.     inc    esi
  1176.     mov    [esi],ah
  1177.     inc    esi
  1178.     mov    BYTE PTR [esi],0
  1179.     pop    edi
  1180.     ret
  1181. GetStdReg    ENDP    
  1182. GetReg    PROC    
  1183.     movzx    ecx,al
  1184.     sub    al,al
  1185.     inc    al
  1186.     bt    [edi + OPERAND.OEFLAGS],OMF_BYTE
  1187.     jc    short grno32
  1188.     bt    [edi + OPERAND.OEFLAGS],OMF_OP32
  1189.     jnc    short grno32
  1190.     dec    al
  1191. grno32:
  1192.     bt    [edi + OPERAND.OEFLAGS],OMF_BYTE
  1193.     jc    short isbyte
  1194.     or    cl,8
  1195. isbyte:
  1196.     call    GetStdReg
  1197.     ret
  1198. GetReg    ENDP    
  1199. GetSpecial    PROC    
  1200.     mov    al,[ebx]
  1201.     mov    [esi],al
  1202.     inc    esi
  1203.     inc    ebx
  1204.     mov    al,[ebx]
  1205.     mov    [esi],al
  1206.     inc    esi
  1207.     inc    ebx
  1208.     movzx    eax,[edi + OPERAND.THEREG]
  1209.     mov    al,[ebx +eax]
  1210.     mov    [esi],al
  1211.     inc    esi
  1212.     mov    BYTE PTR [esi],0
  1213.     ret
  1214. GetSpecial    ENDP    
  1215. GetSeg    PROC    
  1216.     push    edi
  1217.     push    eax
  1218.     mov    edi,offset DGROUP:psegs
  1219.     mov    ax,[edi + ecx *2]
  1220.     mov    [esi],al
  1221.     inc    esi
  1222.     mov    [esi],ah
  1223.     inc    esi
  1224.     pop    eax
  1225.     or    al,al
  1226.     mov    al,':'
  1227.     jz    short nocolon
  1228.     mov    [esi],al
  1229.     inc    esi
  1230. nocolon:
  1231.     mov    BYTE PTR [esi],0
  1232.     pop    edi
  1233.     ret
  1234. GetSeg    ENDP    
  1235. SegOverride    PROC    
  1236.     mov    al,1
  1237.     sub    ecx,ecx
  1238.     test    [segs],SG_ES
  1239.     jz    short so_testcs
  1240.     call    GetSeg
  1241. so_testcs:
  1242.     inc    ecx
  1243.     test    [segs],SG_CS
  1244.     jz    short so_testss
  1245.     call    GetSeg
  1246. so_testss:
  1247.     inc    ecx
  1248.     test    [segs],SG_SS
  1249.     jz    short so_testds
  1250.     call    GetSeg
  1251. so_testds:
  1252.     inc    ecx
  1253.     test    [segs],SG_DS
  1254.     jz    short so_testfs
  1255.     call    GetSeg
  1256. so_testfs:
  1257.     inc    ecx
  1258.     test    [segs],SG_FS
  1259.     jz    short so_testgs
  1260.     call    GetSeg
  1261. so_testgs:
  1262.     inc    ecx
  1263.     test    [segs],SG_GS
  1264.     jz    short so_done
  1265.     call    GetSeg
  1266. so_done:
  1267.     mov    [segs],0
  1268.     ret
  1269. SegOverride    ENDP    
  1270. Scaled    PROC    
  1271.     push    DWORD PTR [edi + OPERAND.OEFLAGS]
  1272.     btr    [edi + OPERAND.OEFLAGS],OMF_BYTE
  1273.     bts    [edi + OPERAND.OEFLAGS],OMF_OP32
  1274.     or    al,al
  1275.     jz    short notbased
  1276.     sub    al,al
  1277.     mov    al,[edi + OPERAND.THEREG]
  1278.     call    GetReg
  1279. notbased:
  1280.     bt    [edi + OPERAND.OEFLAGS],OMF_SCALED
  1281.     jnc    short notscaled2
  1282.     movzx    ecx,[edi + OPERAND.SCALE]
  1283.     mov    eax,ecx
  1284.     add    ecx,ecx
  1285.     add    ecx,eax
  1286.     add    ecx,offset DGROUP:scales
  1287.     mov    eax,[ecx]
  1288.     call    put3
  1289.     or    al,1
  1290.     mov    al,[edi + OPERAND.SCALEREG]
  1291.     call    GetReg
  1292. notscaled2:
  1293.     pop    DWORD PTR [edi + OPERAND.OEFLAGS]
  1294.     ret
  1295. Scaled    ENDP    
  1296. FOM_FSTREG    PROC    
  1297.     mov    edi,offset DGROUP:stalone
  1298.     call    strcat
  1299.     ret
  1300. FOM_FSTREG    ENDP    
  1301. FOM_CRX    PROC    
  1302.     mov    ebx,offset DGROUP:crreg
  1303.     call    GetSpecial
  1304.     ret
  1305. FOM_CRX    ENDP    
  1306. FOM_DRX    PROC    
  1307.     mov    ebx,offset DGROUP:drreg
  1308.     call    GetSpecial
  1309.     ret
  1310. FOM_DRX    ENDP    
  1311. FOM_TRX    PROC    
  1312.     mov    ebx,offset DGROUP:trreg
  1313.     call    GetSpecial
  1314.     ret
  1315. FOM_TRX    ENDP    
  1316. FOM_SUD    PROC    
  1317.     mov    ebx,offset DGROUP:sudreg
  1318.     call    GetSpecial
  1319.     ret
  1320. FOM_SUD    ENDP    
  1321. FOM_PORT    PROC    
  1322.     mov    al,SY_PORT
  1323. format:
  1324.     call    FormatValue
  1325.     ret
  1326. FOM_PORT    ENDP    
  1327. FOM_INT    PROC    
  1328.     mov    al,SY_INTR
  1329.     jmp    short format
  1330. FOM_INT    ENDP    
  1331. FOM_SHIFT    PROC    
  1332.     bt    [edi + OPERAND.OEFLAGS],OMF_CL
  1333.     jnc    fos_notcl
  1334.     mov    ax,"cl"
  1335.     call    put2
  1336.     ret
  1337. fos_notcl:
  1338.     cmp    [edi + OPERAND.ADDRESS],1
  1339.     mov    al,SY_SHIFT
  1340.     jnz    format
  1341.     mov    BYTE PTR [esi],'1'
  1342.     inc    esi
  1343.     mov    BYTE PTR [esi],0
  1344.     ret
  1345. FOM_SHIFT    ENDP    
  1346. FOM_RETURN    PROC    
  1347.     mov    al,SY_RETURN
  1348.     jmp    format
  1349. FOM_RETURN    ENDP    
  1350. FOM_SHORTBRANCH    PROC    
  1351.     mov    al,SY_SHORTBRANCH
  1352.     jmp    format
  1353. FOM_SHORTBRANCH    ENDP    
  1354. FOM_LONGBRANCH    PROC    
  1355.     mov    al,SY_LONGBRANCH
  1356.     jmp    format
  1357. FOM_LONGBRANCH    ENDP    
  1358. FOM_FARBRANCH    PROC    
  1359.     mov    al,SY_SEGMENT
  1360.     call    format
  1361.     mov    BYTE PTR [esi],':'
  1362.     inc    esi
  1363.     mov    al,SY_ABSBRANCH
  1364.     call    format
  1365.     ret
  1366. FOM_FARBRANCH    ENDP    
  1367. FOM_ABSOLUTE    PROC    
  1368.     call    DoStrict
  1369.     call    SegOverride
  1370.     mov    BYTE PTR [esi],'['
  1371.     inc    esi
  1372.     mov    BYTE PTR [esi],0
  1373.     bt    [edi + OPERAND.OEFLAGS],OMF_SCALED
  1374.     jnc    foa_notscaled
  1375.     mov    al,SY_WORDOFS
  1376.     call    FormatValue
  1377.     sub    eax,eax
  1378.     call    Scaled
  1379.     jmp    short foa_finish
  1380. foa_notscaled:
  1381.     mov    al,SY_ABSOLUTE
  1382.     call    FormatValue
  1383. foa_finish:
  1384.     mov    BYTE PTR [esi],']'
  1385.     inc    esi
  1386.     mov    BYTE PTR [esi],0
  1387.     ret
  1388. FOM_ABSOLUTE    ENDP    
  1389. FOM_IMMEDIATE    PROC    
  1390.     bt    [edi + OPERAND.OEFLAGS],OMF_BYTE
  1391.     mov    al,SY_WORDIMM
  1392.     jnc    short absformat
  1393.     mov    al,SY_SIGNEDIMM
  1394.     bt    [edi + OPERAND.OEFLAGS],SY_SIGNEDIMM
  1395.     jc    short absformat
  1396.     mov    al,SY_SIGNEDIMM
  1397. absformat:
  1398.     jmp    format
  1399. FOM_IMMEDIATE    ENDP    
  1400. FOM_REG    PROC    
  1401.     bt    [edi + OPERAND.OEFLAGS],OMF_FST
  1402.     jnc    short foreg
  1403.     call    GetST
  1404.     ret
  1405. foreg:
  1406.     mov    al,[edi + OPERAND.THEREG]
  1407.     call    GetReg
  1408.     ret
  1409. FOM_REG    ENDP    
  1410. FOM_BASED    PROC    
  1411.     call    DoStrict
  1412.     call    SegOverride
  1413.     mov    BYTE PTR [esi],'['
  1414.     inc    esi
  1415.     mov    BYTE PTR [esi],0
  1416.     bt    [edi + OPERAND.OEFLAGS],OMF_ADR32
  1417.     jnc    fob_notscaled
  1418.     mov    al,1
  1419.     call    Scaled
  1420.     jmp    short fob2
  1421. fob_notscaled:
  1422.     push    edi
  1423.     push    esi
  1424.     movzx    eax,BYTE PTR [edi + OPERAND.THEREG]
  1425.     xchg    esi,edi
  1426.     mov    esi,offset DGROUP:based
  1427.     mov    esi,[esi + eax * 4]
  1428.     call    strcpy
  1429.     pop    esi
  1430.     pop    edi
  1431.     call    strlen
  1432.     add    esi,eax
  1433. fob2:
  1434.     test    [edi + OPERAND.OEFLAGS],OMF_OFFSET
  1435.     jz    short fob_noofs
  1436.     bt    [edi + OPERAND.OEFLAGS],OMF_SIGNED_OFFSET
  1437.     mov    al,SY_SIGNEDOFS
  1438.     jc    fob_format
  1439.     mov    al,SY_WORDOFS
  1440.     bt    [edi + OPERAND.OEFLAGS],OMF_WORD_OFFSET
  1441.     jc    fob_format
  1442.     mov    al,SY_BYTEOFS
  1443. fob_format:
  1444.     call    FormatValue
  1445. fob_noofs:
  1446.     mov    BYTE PTR [esi],']'
  1447.     inc    esi
  1448.     mov    BYTE PTR [esi],0
  1449.     ret
  1450. FOM_BASED    ENDP    
  1451. FOM_SEGMENT    PROC    
  1452.     movzx    ecx,[edi + OPERAND.THEREG]
  1453.     sub    eax,eax
  1454.     call    GetSeg
  1455.     ret
  1456. FOM_SEGMENT    ENDP    
  1457. PutOperand    PROC    
  1458.     call    strlen
  1459.     add    esi,eax
  1460.     mov    al,[edi + OPERAND.CODE]
  1461.     dec    al
  1462.     js    short po_none
  1463.     push    0
  1464.     call    TableDispatch
  1465.     dd    17
  1466.     DD    FOM_BASED
  1467.     DD    FOM_SEGMENT
  1468.     DD    FOM_REG
  1469.     DD    FOM_IMMEDIATE
  1470.     DD    FOM_ABSOLUTE
  1471.     DD    FOM_FARBRANCH
  1472.     DD    FOM_LONGBRANCH
  1473.     DD    FOM_SHORTBRANCH
  1474.     DD    FOM_RETURN
  1475.     DD    FOM_SHIFT
  1476.     DD    FOM_INT
  1477.     DD    FOM_PORT
  1478.     DD    FOM_SUD
  1479.     DD    0
  1480.     DD    FOM_TRX
  1481.     DD    FOM_DRX
  1482.     DD    FOM_CRX
  1483.     DD    FOM_FSTREG
  1484. po_none:
  1485.     ret
  1486. PutOperand    ENDP    
  1487. FormatDisassembly    PROC    
  1488.     ENTER    256,0
  1489.     push    esi
  1490.     lea    edi,[ebp-256]
  1491.     mov    BYTE PTR [edi],0
  1492.     test    [segs],SG_REPZ
  1493.     push    edi
  1494.     jz    fd_notrepz
  1495.     mov    esi,offset DGROUP:st_repz
  1496.     call    strcpy
  1497. fd_notrepz:
  1498.     test    [segs],SG_REPNZ
  1499.     jz    fd_notrepnz
  1500.     mov    esi,offset DGROUP:st_repnz
  1501.     call    strcpy
  1502. fd_notrepnz:
  1503.     pop    edi
  1504.     xchg    esi,edi
  1505.     call    strlen
  1506.     add    esi,eax
  1507.     xchg    esi,edi
  1508.     mov    esi,offset DGROUP:nmmnemonic
  1509.     call    strcat
  1510.     lea    esi,[ebp-256]
  1511.     sub    eax,eax
  1512.     mov    al,TAB_ARGPOS
  1513.     call    TabTo
  1514.     mov    edi,offset DGROUP:dest
  1515.     call    PutOperand
  1516.     mov    edi,offset DGROUP:source
  1517.     test    [edi + OPERAND.CODE],-1
  1518.     jz    short nosource
  1519.     mov    BYTE PTR [esi],','
  1520.     inc    esi
  1521.     mov    BYTE PTR [esi],0
  1522.     call    PutOperand
  1523. nosource:
  1524.     mov    edi,offset DGROUP:extraoperand
  1525.     test    [edi + OPERAND.CODE],-1
  1526.     jz    short noextra
  1527.     mov    BYTE PTR [esi],','
  1528.     inc    esi
  1529.     mov    BYTE PTR [esi],0
  1530.     call    PutOperand
  1531. noextra:
  1532.     pop    esi    
  1533.     mov    BYTE PTR [esi],0
  1534.     call    SegOverride
  1535.     mov    edi,esi
  1536.     lea    esi,[ebp-256]
  1537.     call    strcat
  1538.     LEAVE
  1539.     ret
  1540. FormatDisassembly    ENDP    
  1541. PutDword:
  1542.     push    eax        ; To print a dword
  1543.     shr    eax,16        ; Print the high 16 bits
  1544.     call    PutWord
  1545.     pop    eax        ; And the low 16 bits
  1546. PutWord:
  1547.     push    eax        ; To print a word
  1548.     mov    al,ah        ; Print the high byte
  1549.     call    PutByte
  1550.     pop    eax        ; And the low byte
  1551. PutByte:
  1552.     push    eax        ; To print a byte
  1553.     shr    eax,4        ; Print the high nibble
  1554.     call    putnibble
  1555.     pop    eax        ; And the low nibble
  1556. putnibble:
  1557.     and    al,0fh        ; Get a nibble
  1558.     add    al,'0'        ; Make it numeric
  1559.     cmp    al,'9'        ; If supposed to be alphabetic
  1560.     jle    onib
  1561.     add    al,7        ; Add 7
  1562. onib:
  1563.     mov    [esi],al
  1564.     inc    esi
  1565.     ret
  1566. ABSX    PROC    
  1567.     bt    eax,31
  1568.     jnc    noabs
  1569.     neg    eax
  1570. noabs:
  1571.     ret
  1572. ABSX    ENDP    
  1573. FSY_SIGNEDOFS    PROC    
  1574.     bt    [edi + OPERAND.ADDRESS],31
  1575.     mov    eax,"+os_"
  1576.     jnc    fso_pos
  1577.     mov    eax,"-os_"
  1578. fso_pos:
  1579.     call    put4
  1580.     mov    eax,[edi + OPERAND.ADDRESS]
  1581.     call    ABSX
  1582.     call    PutByte
  1583.     mov    BYTE PTR [esi],0
  1584.     ret
  1585. FSY_SIGNEDOFS    ENDP    
  1586. FSY_WORDOFS    PROC    
  1587.     mov    eax,"+ow_"
  1588.     call    put4
  1589.     mov    eax,[edi + OPERAND.ADDRESS]
  1590.     call    PutDword
  1591.     mov    BYTE PTR [esi],0
  1592.     ret
  1593. FSY_WORDOFS    ENDP    
  1594. FSY_BYTEOFS    PROC    
  1595.     mov    eax,"+ob_"
  1596.     call    put4
  1597.     mov    eax,[edi + OPERAND.ADDRESS]
  1598.     call    PutByte
  1599.     mov    BYTE PTR [esi],0
  1600.     ret
  1601. FSY_BYTEOFS    ENDP    
  1602. FSY_ABSOLUTE    PROC    
  1603.     mov    eax,"ab_"
  1604.     call    put3
  1605.     mov    eax,[edi + OPERAND.ADDRESS]
  1606.     call    PutDword
  1607.     mov    BYTE PTR [esi],0
  1608.     ret
  1609. FSY_ABSOLUTE    ENDP    
  1610. FSY_SIGNEDIMM    PROC    
  1611.     bt    [edi + OPERAND.ADDRESS],31
  1612.     mov    eax,"+is_"
  1613.     jnc    fsi_pos
  1614.     mov    eax,"-is_"
  1615. fsi_pos:
  1616.     call    put4
  1617.     mov    eax,[edi + OPERAND.ADDRESS]
  1618.     call    ABSX
  1619.     call    PutByte
  1620.     mov    BYTE PTR [esi],0
  1621.     ret
  1622. FSY_SIGNEDIMM    ENDP    
  1623. FSY_WORDIMM    PROC    
  1624.     mov    eax,"iw_"
  1625.     call    put3
  1626.     mov    eax,[edi + OPERAND.ADDRESS]
  1627.     call    PutDword
  1628.     mov    BYTE PTR [esi],0
  1629.     ret
  1630. FSY_WORDIMM    ENDP    
  1631. FSY_BYTEIMM    PROC    
  1632.     mov    eax,"ib_"
  1633.     call    put3
  1634.     mov    eax,[edi + OPERAND.ADDRESS]
  1635.     call    PutByte
  1636.     mov    BYTE PTR [esi],0
  1637.     ret
  1638. FSY_BYTEIMM    ENDP    
  1639. FSY_PORT    PROC    
  1640.     mov    eax,"p_"
  1641.     call    put2
  1642.     mov    eax,[edi + OPERAND.ADDRESS]
  1643.     call    PutByte
  1644.     mov    BYTE PTR [esi],0
  1645.     ret
  1646. FSY_PORT    ENDP    
  1647. FSY_INTR    PROC    
  1648.     mov    eax,"it_"
  1649.     call    put3
  1650.     mov    eax,[edi + OPERAND.ADDRESS]
  1651.     call    PutByte
  1652.     mov    BYTE PTR [esi],0
  1653.     ret
  1654. FSY_INTR    ENDP    
  1655. FSY_RETURN    PROC    
  1656.     mov    eax,"rt_"
  1657.     call    put3
  1658.     mov    eax,[edi + OPERAND.ADDRESS]
  1659.     call    PutWord
  1660.     mov    BYTE PTR [esi],0
  1661.     ret
  1662. FSY_RETURN    ENDP    
  1663. FSY_ABSBRANCH    PROC    
  1664.     mov    eax,"ba_"
  1665.     call    put3
  1666.     mov    eax,[edi + OPERAND.ADDRESS]
  1667.     call    PutDword
  1668.     mov    BYTE PTR [esi],0
  1669.     ret
  1670. FSY_ABSBRANCH    ENDP    
  1671. FSY_LONGBRANCH    PROC    
  1672.     mov    eax,"bl_"
  1673.     call    put3
  1674.     mov    eax,[edi + OPERAND.ADDRESS]
  1675.     call    PutDword
  1676.     mov    BYTE PTR [esi],0
  1677.     ret
  1678. FSY_LONGBRANCH    ENDP    
  1679. FSY_SHORTBRANCH    PROC    
  1680.     mov    eax,"bs_"
  1681.     call    put3
  1682.     mov    eax,[edi + OPERAND.ADDRESS]
  1683.     call    PutDword
  1684.     mov    BYTE PTR [esi],0
  1685.     ret
  1686. FSY_SHORTBRANCH    ENDP    
  1687. FSY_SHIFT    PROC    
  1688.     mov    eax,"ib_"
  1689.     call    put3
  1690.     mov    eax,[edi + OPERAND.ADDRESS]
  1691.     call    PutByte 
  1692.     mov    BYTE PTR [esi],0
  1693.     ret
  1694. FSY_SHIFT    ENDP    
  1695. FSY_SEGMENT    PROC    
  1696.     mov    eax,"sg_"
  1697.     call    put3
  1698.     mov    ax,[edi + OPERAND.OESEG]
  1699.     call    PutWord
  1700.     mov    BYTE PTR [esi],0
  1701.     ret
  1702. FSY_SEGMENT    ENDP    
  1703. FormatValue    PROC    
  1704.     dec    al
  1705.     push    0
  1706.     call    TableDispatch
  1707.     dd    14
  1708.     dd    FSY_SIGNEDOFS,FSY_WORDOFS,FSY_BYTEOFS,FSY_ABSOLUTE
  1709.     dd    FSY_SIGNEDIMM,FSY_WORDIMM,FSY_BYTEIMM,FSY_PORT
  1710.     dd    FSY_INTR,FSY_RETURN,FSY_ABSBRANCH,FSY_LONGBRANCH
  1711.     dd    FSY_SHORTBRANCH,FSY_SHIFT,FSY_SEGMENT
  1712.     ret
  1713. FormatValue    ENDP    
  1714. END