home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 23 / IOPROG_23.ISO / SOFT / ASM / GRDBDL17.ZIP / OPERANDS.ASM < prev    next >
Encoding:
Assembly Source File  |  1998-10-26  |  33.4 KB  |  2,116 lines

  1. ;
  2. ; GRDP
  3. ;
  4. ; Copyright(c) LADsoft
  5. ;
  6. ; David Lindauer, camille@bluegrass.net
  7. ;
  8. ;
  9. ; Operands.asm
  10. ;
  11. ; Function: Handle 386 operands as dictated by the opcode table
  12. ;   Handle formatting output
  13. ;
  14. ; Sorry, I didn't have time to document this one yet
  15. ;
  16. ; years later:
  17. ;
  18. ; sorry, I STILL didn't have time to document this one yet :)
  19. ;
  20.     ;MASM MODE
  21.     .MODEL SMALL
  22.     .386
  23.  
  24. include    edispatc.inc 
  25. include    iopcodes.inc
  26. include    ioperand.inc
  27. include    eoptions.inc
  28. include    eopcom.inc
  29.  
  30.     PUBLIC TabTo, ReadOverrides, DispatchOperands
  31.     PUBLIC    FormatDisassembly, FormatValue, Code_Address
  32.     PUBLIC    PutDword, PutWord,PutByte
  33.     PUBLIC    put2,put3,put4, strlen
  34.  
  35.     extrn x86pfx : byte
  36. SZ_QWORD    =    2
  37. SZ_TBYTE    =    4
  38.  
  39.     .DATA
  40. code_address    dw    0        ;disassembly address within segment
  41. dest2        dw    0        ;temps to aid decoding
  42. source2        dw    0
  43. segs        dw    0        
  44. extraoperand    OPERAND <>        ;third operand
  45. source        OPERAND    <>        ;second operand
  46. dest        OPERAND    <>        ;first operand
  47. nmmnemonic     db    10 DUP (?)    ;mnemonic (may be modified here)
  48. reqsPtrSizeOvride    db    0    ;flag set if xxx ptr required
  49.  
  50.     .CODE
  51.  
  52. ;Find the length of a string in a buffer pointed to by SI, and return that
  53. ;length in AX.  This is a strange way to do this. I think I'll change it
  54. ;just a little.
  55. ;  If SI comes in pointing to a 0, we return a string length of 0
  56.  
  57. strlen    PROC    
  58.     push    di
  59.     push    si
  60.     push    cx
  61.     mov    di,si
  62.     mov    cx,-1
  63.     sub    al,al
  64.     repnz    scasb
  65.     mov    ax,cx
  66.     not    ax
  67.     dec    ax
  68.     pop    cx
  69.     pop    si
  70.     pop    di
  71.     ret
  72. strlen    ENDP    
  73.  
  74.  
  75.  
  76.  
  77. strcpy    PROC    
  78. strcpylp:
  79.     lodsb
  80.     stosb
  81.     or    al,al
  82.     jnz    strcpylp
  83.     ret
  84. strcpy    ENDP    
  85.  
  86.  
  87. strcat    PROC    
  88.     mov    al,[di]
  89.     inc    di
  90.     or    al,al
  91.     jnz    strcat
  92.     dec    di
  93.     jmp    strcpy
  94. strcat    ENDP    
  95.  
  96.  
  97. CopyExtra    PROC    
  98.     push    si
  99.     push    di
  100.     mov    si,offset extraoperand
  101.     xchg    si,di
  102.     mov    cx,OPERANDSIZE
  103.     rep    movsb
  104.     pop    di
  105.     pop    si
  106.     ret
  107. CopyExtra    ENDP    
  108.  
  109.  
  110.  
  111. put2    PROC    
  112.     mov    [si],ah
  113.     inc    si
  114.     mov    [si],al
  115.     inc    si
  116.     mov    BYTE PTR [si],0
  117.     ret
  118. put2    ENDP    
  119.  
  120.  
  121. put3    PROC    
  122.     push    eax
  123.     shr    eax,8
  124.     mov    [si],ah
  125.     inc    si
  126.     pop    eax
  127.     call    put2
  128.     ret
  129. put3    ENDP    
  130.  
  131.  
  132. put4    PROC    
  133.     push    eax
  134.     shr    eax,16
  135.     call    put2
  136.     pop    eax
  137.     call    put2
  138.     ret
  139. put4    ENDP    
  140.  
  141.  
  142. SetSeg    PROC    
  143.     mov    [reqsPtrSizeOvride],FALSE
  144.     mov    [di+OPERAND.code],OM_SEGMENT
  145.     mov    [di+OPERAND.THEREG],al
  146.     ret
  147. SetSeg    ENDP    
  148.  
  149.  
  150. SetReg    PROC    
  151.     mov    [reqsPtrSizeOvride],FALSE
  152.     mov    [di+OPERAND.code],OM_REG
  153.     mov    [di+OPERAND.THEREG],al
  154.     ret
  155. SetReg    ENDP    
  156.  
  157.  
  158. ReadRM    PROC    
  159.     push    cx
  160.     sub    cx,cx
  161.     mov    cl,2
  162.     RM    si
  163.     mov    [di+OPERAND.THEREG],al
  164.     MODX    si
  165.     mov    ch,al
  166.     cmp    ch,MOD_REG
  167.     jnz    short notregreg
  168.     mov    [di+OPERAND.CODE],OM_REG
  169.     mov    [reqsPtrSizeOvride],FALSE
  170.     sub    ax,ax
  171.     pop    cx
  172.     ret
  173. notregreg:
  174.     bt    [di+OPERAND.OEFLAGS],OMF_ADR32
  175.     jnc    adr16
  176.     cmp    [di+OPERAND.THEREG],RM_32_SCALED
  177.     jnz    notscaled
  178.     inc    cl
  179.     RM    si+1
  180.     mov    [di+OPERAND.THEREG],al
  181.     REG    si+1
  182.     mov    [di+OPERAND.SCALEREG],al
  183.     MODX    si+1
  184.     mov    [di+OPERAND.SCALE],al
  185.     cmp    [di+OPERAND.SCALEREG],RM_32_STACKINDEX
  186.     jz    hassp
  187.     bts    [di+OPERAND.OEFLAGS],OMF_SCALED
  188. hassp:
  189.     cmp    [di+OPERAND.THEREG],RM_32_ABSOLUTE
  190.     jnz    basedAndScaled
  191.     cmp    ch,MOD_NOOFS
  192.     jnz    short basedAndScaled
  193.     mov    [di+OPERAND.CODE],OM_ABSOLUTE
  194.     LONG    si+3
  195.     mov    [di+OPERAND.ADDRESS],eax
  196.     sub    ax,ax
  197.     mov    al,5
  198.     pop    cx
  199.     ret
  200. notscaled:
  201.     
  202.     cmp    ch,MOD_NOOFS
  203.     jnz    basedAndScaled
  204.     cmp    [di+OPERAND.THEREG], RM_32_ABSOLUTE
  205.     jnz    basedAndScaled
  206.     mov    [di+OPERAND.CODE], OM_ABSOLUTE
  207.     LONG    si+2
  208.     mov    [di+OPERAND.ADDRESS],eax
  209.     sub    ax,ax
  210.     sub    ax,ax
  211.     mov    al,4
  212.     pop    cx
  213.     ret
  214. adr16:
  215.     movzx    esi,si
  216.     cmp    ch,MOD_NOOFS
  217.     jnz    basedAndScaled
  218.     cmp    [di+OPERAND.THEREG], RM_16_ABSOLUTE
  219.     jnz    basedAndScaled
  220.     mov    [di+OPERAND.CODE], OM_ABSOLUTE
  221.     UINT    si+2
  222.     mov    [di+OPERAND.ADDRESS],eax
  223.     sub    ax,ax
  224.     mov    al,2
  225.     pop    cx
  226.     ret
  227. basedAndScaled:
  228.     mov    [di+OPERAND.CODE], OM_BASED
  229.     cmp    ch,MOD_ADDR
  230.     jnz    short checksigned
  231.     bts    [di+OPERAND.OEFLAGS], OMF_WORD_OFFSET
  232.     push    cx
  233.     sub    ch,ch
  234.     movzx    ecx,cl
  235.     mov    eax,fs:[esi+ecx]
  236.     pop    cx
  237.     bt    [di+OPERAND.OEFLAGS], OMF_ADR32
  238.     jc    dwordx
  239.     and    eax,0ffffh
  240.     sub    cl,2
  241. dwordx:
  242.     mov    [di+OPERAND.ADDRESS],eax
  243.     add    cl,4
  244.     jmp    short readrmdone
  245. checksigned:
  246.     cmp    ch, MOD_SIGNED
  247.     jnz    short readrmdone
  248.     bts    [di+OPERAND.OEFLAGS],OMF_SIGNED_OFFSET
  249.     movzx    ecx,cl
  250.     movzx    eax,byte ptr fs:[esi+ecx]
  251.     mov    [di+OPERAND.ADDRESS],eax
  252.     inc    cl
  253. readrmdone:
  254.     movzx    ax,cl
  255.     sub    al,2
  256.     pop    cx
  257.     ret
  258. ReadRM    ENDP    
  259.  
  260.  
  261. RegRM    PROC    
  262.     mov    di,[dest2]
  263.     REG    si
  264.     call    SetReg
  265.     mov    di,[source2]
  266.     call    ReadRM
  267.     ret
  268. RegRM    ENDP    
  269.  
  270.  
  271. Immediate    PROC    
  272.     push    cx
  273.     sub    cx,cx
  274.     mov    [di+OPERAND.CODE],OM_IMMEDIATE
  275.     bt    [di+OPERAND.OEFLAGS],OMF_BYTE
  276.     jnc    short inotbyte
  277.     inc    cl
  278.     sub    ax,ax
  279.     mov    al,fs:[si]
  280.     jmp    short i_ret
  281. inotbyte:
  282.     bt    [di+OPERAND.OEFLAGS], OMF_OP32
  283.     jnc    iword
  284.     add    cl,4
  285.     LONG    si
  286.     jmp    short i_ret
  287. iword:
  288.     add    cl,2
  289.     UINT    si
  290. i_ret:
  291.     mov    [di+OPERAND.ADDRESS],eax
  292.     mov    ax,cx
  293.     pop    cx
  294.     ret
  295. Immediate    ENDP    
  296.  
  297. ;Find a binary 0, stick whatever is in AL there, and put a 0 after that.
  298.  
  299. MnemonicChar    PROC    
  300.     push    di
  301.     mov    di,offset nmmnemonic
  302. mc2:
  303.     inc    di
  304.     cmp    BYTE PTR [di-1],0
  305.     jnz    mc2
  306.     mov    [di-1],al
  307.     mov    BYTE PTR [di],0
  308.     pop    di
  309.     ret
  310. MnemonicChar    ENDP    
  311.  
  312.  
  313.  
  314. ;/* op 1- word reg from bits 0 - 2 of opcode */
  315.  
  316. op1    PROC    
  317.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  318.     mov    al,fs:[si]
  319.     B02
  320.     call    SetReg
  321.     sub    ax,ax
  322.     ret
  323. op1    ENDP    
  324.  
  325.  
  326. ;/* Op2 acc, reg bits 0-2 of opcode */
  327. op2    PROC    
  328.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  329.     btr    [bx+OPERAND.OEFLAGS],OMF_BYTE
  330.     mov    al,REG_EAX
  331.     call    SetReg
  332.     mov    di,bx
  333.     mov    al,fs:[si]
  334.     and    al,7
  335.     call    SetReg
  336.     sub    ax,ax
  337.     ret
  338. op2    ENDP    
  339.  
  340.  
  341. ;/* op3 - seg from b3-5 of opcode */
  342. Op3    PROC    
  343.     mov    al,fs:[si]
  344.     B35
  345.     call    SetSeg
  346.     sub    ax,ax
  347.     ret
  348. op3    ENDP    
  349.  
  350.  
  351. ;/* op4 - REGRM with b1 of opcode set reg is dest else source */
  352. op4    PROC    
  353.     bt    DWORD PTR fs:[si],1
  354.     jc    short op4nox
  355.     xchg    bx,di
  356. op4nox:
  357.     mov    [dest2],di
  358.     mov    [source2],bx
  359.     call    RegRM
  360.     ret
  361. op4    ENDP    
  362.  
  363.  
  364. ;/* op5 - use RM only */
  365. op5    PROC    
  366.     call    ReadRM
  367.     ret
  368. op5    ENDP    
  369.  
  370.  
  371. ;/* op6 READRM for shift */
  372. op6    PROC    
  373.     call    ReadRM
  374.     sub    cx,cx
  375.     mov    cl,al
  376.     mov    di,bx
  377.     mov    [di+OPERAND.CODE],OM_SHIFT
  378.     bt    DWORD PTR fs:[si],4
  379.     jnc    short op6cnt
  380.     bt    DWORD PTR fs:[si],1
  381.     jnc    op61
  382.     bts    [di+OPERAND.OEFLAGS],OMF_CL
  383.     jmp    short op6done
  384. op61:
  385.     mov    [di+OPERAND.ADDRESS],1
  386.     jmp    short op6done
  387. op6cnt:
  388.     movzx    ecx,cx
  389.     movzx    esi,si
  390.     movzx    eax,BYTE PTR fs:[esi+ecx+2]
  391.     inc    cl
  392.     mov    [di+OPERAND.ADDRESS],eax
  393. op6done:
  394.     mov    ax,cx
  395.     ret
  396. op6    ENDP    
  397.  
  398.  
  399. ;/* op 7 regrm with reg dest */
  400. op7    PROC    
  401.     mov    [dest2],di
  402.     mov    [source2],bx
  403.     call    RegRM
  404.     ret
  405. op7    ENDP    
  406.  
  407.  
  408. ;/* OP8 - word regrm with reg dest */
  409. op8    PROC    
  410.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  411.     btr    [bx+OPERAND.OEFLAGS],OMF_BYTE
  412.     jmp    op7
  413. op8    ENDP    
  414.  
  415.  
  416. ;/* op 9 - interrupts */
  417. op9    PROC    
  418.     mov    [reqsPtrSizeOvride],FALSE
  419.     sub    eax,eax
  420.     mov    al,3
  421.     bt    DWORD PTR fs:[si],0
  422.     jnc    short op9int3
  423.     mov    al,fs:[si+1]
  424. op9int3:
  425.     mov    [di+OPERAND.ADDRESS],eax
  426.     mov    BYTE PTR [di+OPERAND.CODE],OM_INT
  427.     sub    al,al
  428.     ret
  429. op9    ENDP    
  430.  
  431.  
  432. ;/* op 10, short relative branch */
  433. op10    PROC    
  434.     mov    [reqsPtrSizeOvride],FALSE
  435.     mov    [di+OPERAND.CODE],OM_SHORTBRANCH
  436.     movsx    eax,BYTE PTR fs:[si+1]
  437.     inc    ax
  438.     inc    ax
  439.     add    ax,[code_address]
  440.     mov    [di+OPERAND.ADDRESS],eax
  441.     bt    [di+OPERAND.OEFLAGS],OMF_OP32
  442.     jc    short op10notword
  443.     and    [di+OPERAND.ADDRESS],0ffffh
  444. op10notword:
  445.     sub    ax,ax
  446.     ret
  447. op10    ENDP    
  448.  
  449.  
  450. ;/* op 11 RM, immediate */
  451. op11    PROC    
  452.     call    ReadRM
  453.     movzx    cx,al
  454.     mov    di,bx
  455.     push    si
  456.     add    si,cx
  457.     add    si,2
  458.     call    Immediate
  459.     add    cl,al
  460.     pop    si
  461.     mov    ax,cx
  462.     ret
  463. op11    ENDP    
  464.  
  465.  
  466. ;/* op 12 - acc, immediate */
  467. op12    PROC    
  468.     mov    al,REG_EAX
  469.     call    SetReg
  470.     mov    di,bx
  471.     inc    si
  472.     call    Immediate
  473.     dec    si
  474.     ret
  475. op12    ENDP    
  476.  
  477.  
  478. ;/* op 13 absolute, acc*/
  479. op13    PROC    
  480.     sub    cx,cx
  481.     mov    [di+OPERAND.CODE],OM_ABSOLUTE
  482.     bt    [di+OPERAND.OEFLAGS],OMF_ADR32
  483.     jnc    short op13word
  484.     LONG    si+1
  485.     inc    cl
  486.     inc    cl
  487.     jmp    short op13fin
  488. op13word:
  489.     UINT    si+1
  490. op13fin:
  491.     mov    [di+OPERAND.ADDRESS],eax
  492.     mov    di,bx
  493.     mov    al,REG_EAX
  494.     call    SetReg
  495.     mov    ax,cx
  496.     ret
  497. op13    ENDP    
  498.  
  499.  
  500. ;/* op 14 - RM, immediate, b01 of opcode != 1 for byte */
  501. op14    PROC    
  502.     call    ReadRM
  503.     movzx    cx,al
  504.     mov    al,fs:[si]
  505.     B01
  506.     jnz    short op14checkbyte
  507.     bts    [bx+OPERAND.OEFLAGS],OMF_BYTE
  508.     bts    [di+OPERAND.OEFLAGS],OMF_BYTE
  509.     jmp    short op14source
  510. op14checkbyte:
  511.     btr    [bx+OPERAND.OEFLAGS],OMF_BYTE
  512.     cmp    al,1
  513.     jz    short op14check2
  514.     bts    [bx+OPERAND.OEFLAGS],OMF_BYTE
  515. op14check2:
  516.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  517. op14source:
  518.     mov    di,bx
  519.     push    si
  520.     add    si,cx
  521.     add    si,2
  522.     call    Immediate
  523.     pop    si
  524.     add    cl,al
  525.     mov    al,fs:[si]
  526.     B01
  527.     cmp    al,3
  528.     jnz    op14done
  529.     bt    [di+OPERAND.OEFLAGS],OMF_BYTE
  530.     jnc    op14done
  531.     bts    [di+OPERAND.OEFLAGS],OMF_SIGNED
  532.     movzx    eax,byte ptr [di+OPERAND.ADDRESS]
  533.     mov    [di+OPERAND.ADDRESS],eax
  534. op14done:
  535.     mov    ax,cx
  536.     ret
  537. op14    ENDP    
  538.  
  539.  
  540. ;/* op 15 - acc, immediate, B3 of opcode clear for byte */
  541. op15    PROC    
  542.     mov    al,fs:[si]
  543.     B02
  544.     call    SetReg
  545.     bt    DWORD PTR fs:[si],3
  546.     jnc    op15byte
  547.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  548.     btr    [bx+OPERAND.OEFLAGS],OMF_BYTE
  549.     jmp    short op15source
  550. op15byte:
  551.     bts    [di+OPERAND.OEFLAGS],OMF_BYTE
  552.     bts    [bx+OPERAND.OEFLAGS],OMF_BYTE
  553. op15source:
  554.     mov    di,bx
  555.     inc    si
  556.     call    Immediate
  557.     dec    si
  558.     ret
  559. op15    ENDP    
  560.  
  561.  
  562. ;/* op 16 - seg,readrm, if B1 of opcode seg is dest else source */
  563. op16    PROC    
  564.     bt    DWORD PTR fs:[si],1
  565.     jc    noswap
  566.     xchg    bx,di
  567. noswap:
  568.     REG    si
  569.     call    SetSeg
  570.     mov    di,bx
  571.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  572.     call    ReadRM
  573.     ret
  574. op16    ENDP    
  575.  
  576.  
  577. ;/* op 17, far return */
  578. op17    PROC    
  579.     mov    [reqsPtrSizeOvride],false
  580.     mov    [di+OPERAND.CODE],OM_RETURN
  581.     btr    [di+OPERAND.OEFLAGS],OMF_ADR32
  582.     btr    [di+OPERAND.OEFLAGS],OMF_OP32
  583.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  584.     UINT    si+1
  585.     mov    [di+OPERAND.ADDRESS],eax
  586.     sub    ax,ax
  587.     ret
  588. op17    ENDP    
  589.  
  590.  
  591. ;/* op 18, far branch/call */
  592. op18    PROC    
  593.     sub    cx,cx
  594.     mov    [reqsPtrSizeOvride],FALSE
  595.     mov    [di+OPERAND.CODE],OM_FARBRANCH
  596.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  597.     bt    [di+OPERAND.OEFLAGS],OMF_OP32
  598.     jnc    short op18word
  599.     inc    cl
  600.     inc    cl
  601.     LONG    si+1
  602.     jmp    short    op18fin
  603. op18word:
  604.     UINT    si+1
  605. op18fin:
  606.     mov    [di+OPERAND.ADDRESS],eax
  607.     movzx    ecx,cx
  608.     movzx    esi,si
  609.     UINT    esi+ecx+3
  610.     mov    [di+OPERAND.OESEG],ax
  611.     mov    ax,cx
  612.     ret
  613. op18    ENDP    
  614.  
  615.  
  616. ;/* op 19 - ESC, mnem of bits 0-2 of opcode, imm,readrm */
  617. op19    PROC    
  618.     mov    [di+OPERAND.CODE],OM_IMMEDIATE
  619.     bts    [di+OPERAND.OEFLAGS],OMF_BYTE
  620.     mov    al,fs:[si]
  621.     and    al,7
  622.     shl    al,3
  623.     mov    ah,fs:[si+1]
  624.     shr    ah,3
  625.     and    ah,7
  626.     or    al,ah
  627.     sub    ah,ah
  628.     cwde
  629.     mov    [di+ OPERAND.ADDRESS],eax
  630.     mov    di,bx
  631.     call    ReadRM
  632.     ret
  633. op19    ENDP    
  634.  
  635.  
  636. ;/* op 20 - long branch */
  637. op20    PROC    
  638.     sub    eax,eax
  639.     mov    [reqsPtrSizeOvride],FALSE
  640.     sub    cx,cx
  641.     mov    [di+OPERAND.CODE],OM_LONGBRANCH
  642.     bt    [di+OPERAND.OEFLAGS],OMF_OP32
  643.     jnc    short op20word
  644.     LONG    si+1
  645.     inc    cl
  646.     inc    cl
  647.     jmp    short op20fin
  648. op20word:
  649.     UINT    si+1
  650. op20fin:
  651.     add    ax,[code_address]
  652.     test    [segs],SG_TWOBYTEOP
  653.     jz    op20xx
  654.     inc    ax
  655. op20xx:
  656.     add    ax,cx
  657.     add    ax,3
  658.     bt    [di+OPERAND.OEFLAGS],OMF_OP32
  659.     jc    op20done
  660.     and    eax,0ffffh
  661. op20done:
  662.     mov    [di+OPERAND.ADDRESS],eax
  663.     mov    ax,cx
  664.     ret
  665. op20    ENDP    
  666.  
  667.  
  668. ;/* op21 acc,dx */
  669. op21    PROC    
  670.     mov    al,REG_EAX
  671.     call    SetReg
  672.     mov    di,bx
  673.     btr    [di+OPERAND.OEFLAGS],OMF_OP32
  674.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  675.     mov    al,REG_DX
  676.     call    SetReg
  677.     sub    ax,ax
  678.     ret
  679. op21    ENDP    
  680.  
  681.  
  682. ;/* op22 - dx,acc */
  683. op22    PROC    
  684.     btr    [di+OPERAND.OEFLAGS],OMF_OP32
  685.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  686.     mov    al,REG_DX
  687.     call    SetReg
  688.     mov    di,bx
  689.     mov    al,REG_EAX
  690.     call    SetReg
  691.     sub    ax,ax
  692.     ret
  693. op22    ENDP    
  694.  
  695.  
  696. ;/* op23 - port,acc where B1 of opcode set is port dest */
  697. op23    PROC    
  698.     bt    DWORD PTR fs:[si],1
  699.     jc    short op20NoSwap
  700.     xchg    bx,di
  701. op20noswap:
  702.     bts    [di+OPERAND.OEFLAGS],OMF_BYTE
  703.     mov    [di+OPERAND.CODE],OM_PORT
  704.     movzx    eax,BYTE PTR fs:[si+1]
  705.     mov    [di+OPERAND.ADDRESS],eax
  706.     mov    di,bx
  707.     mov    al,REG_EAX
  708.     call    SetReg
  709.     sub    ax,ax
  710.     ret
  711. op23    ENDP    
  712.  
  713.  
  714. ;/* op 24 acc, absolute */
  715. op24    PROC    
  716.     sub    cx,cx
  717.     mov    al,REG_EAX
  718.     call    SetReg
  719.     mov    di,bx
  720.     mov    [di+OPERAND.CODE],OM_ABSOLUTE
  721.     bt    [di+OPERAND.OEFLAGS],OMF_ADR32
  722.     jnc    short op24word
  723.     inc    cl
  724.     inc    cl
  725.     LONG    si+1
  726.     jmp    short op24done
  727. op24word:
  728.     UINT    si+1
  729. op24done:
  730.     mov    [di+OPERAND.ADDRESS],eax
  731.     mov    ax,cx
  732.     ret
  733. op24    ENDP    
  734.  
  735.  
  736. ;/* op 25 - immediate byte or word */
  737. op25    PROC    
  738.     mov    [reqsPtrSizeOvride],false
  739.     bts    [di+OPERAND.OEFLAGS],OMF_BYTE
  740.     bt    DWORD PTR fs:[si],1
  741.     jc    short op25fin
  742.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  743. op25fin:
  744.     push    si
  745.     inc    si
  746.     call    Immediate
  747.     pop    si
  748.     ret
  749. op25    ENDP    
  750.  
  751.  
  752. ;/* op 26, immediate 2byte,byte */
  753. op26    PROC    
  754.     mov    [reqsPtrSizeOvride],false
  755.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  756.     btr    [di+OPERAND.OEFLAGS],OMF_OP32
  757.     push    si
  758.     inc    si
  759.     call    Immediate
  760.     mov    di,bx
  761.     bts    [di+OPERAND.OEFLAGS],OMF_BYTE
  762.     btr    [di+OPERAND.OEFLAGS],OMF_OP32
  763.     inc    si
  764.     inc    si
  765.     call    Immediate
  766.     pop    si
  767.     sub    ax,ax
  768.     ret
  769. op26    ENDP    
  770.  
  771.  
  772. ;/* op 27 - string */
  773. op27    PROC    
  774.     mov    al,'d'
  775.     bt    [di+OPERAND.OEFLAGS],OMF_OP32
  776.     jc    short op27pc
  777.     mov    al,'w'
  778. op27pc:
  779.     call    MnemonicChar
  780.     sub    ax,ax
  781.     ret
  782. op27    ENDP    
  783.  
  784.  
  785. ;/* op 28 - source = REG, dest = RM */
  786. op28    PROC    
  787.     xchg    di,bx
  788.     jmp    op7
  789. op28    ENDP    
  790.  
  791.  
  792. ;/* op 29 - rm, size don't care */
  793. op29    PROC    
  794.     btr    [di+OPERAND.OEFLAGS],OMF_OP32
  795.     mov    [reqsPtrSizeOvride],false
  796.     call    ReadRM
  797.     ret
  798. op29    ENDP    
  799.  
  800.  
  801. ;/* op30 - RM, shift with B3 of stream selecting COUNT or CL*/
  802. op30    PROC    
  803.     call    ReadRM
  804.     mov    cx,ax
  805.     mov    di,bx
  806.     mov    [di+OPERAND.CODE],OM_SHIFT
  807.     bt    DWORD PTR fs:[si],3
  808.     jnc    op30cl
  809.     movzx    esi,si
  810.     movzx    ecx,cx
  811.     movzx    eax,byte ptr [esi+ecx+2]
  812.     mov    [di+OPERAND.ADDRESS],eax
  813.     inc    cx
  814.     jmp    short op30done
  815. op30cl:
  816.     bts    [di+OPERAND.OEFLAGS],OMF_CL
  817. op30done:
  818.     mov    ax,cx
  819.     ret
  820. op30    ENDP    
  821.  
  822.  
  823. ;/* op 31- reg, rm, count where B1 of opcode = byte/word */
  824. op31    PROC    
  825.     call    copyextra
  826.     REG    si
  827.     call    SetReg
  828.     mov    di,bx
  829.     call    ReadRM
  830.     mov    cx,ax
  831.     mov    di,offset extraoperand
  832.     bts    [di+OPERAND.OEFLAGS],OMF_BYTE
  833.     bt    DWORD PTR fs:[si],1
  834.     jc    short op31byte
  835.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  836. op31byte:
  837.     push    si
  838.     inc    si
  839.     inc    si
  840.     call    Immediate
  841.     pop    si
  842.     add    ax,cx
  843.     ret
  844. op31    ENDP    
  845.  
  846.  
  847. ;/* op32 - 386 special regs */
  848. op32    PROC    
  849.     mov    cx,WORD PTR fs:[si]
  850.     and    cx,0c005h
  851.     cmp    cx,0c000h
  852.     mov    al,OM_CRX
  853.     jz    short op32gotype
  854.     cmp    cx,0c001h
  855.     mov    al,OM_DRX
  856.     jz    short op32gotype
  857.     cmp    cx,0c004h
  858.     mov    al,OM_TRX
  859.     jz    short op32gotype
  860.     mov    al,OM_SUD
  861. op32gotype:
  862.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  863.     btr    [bx+OPERAND.OEFLAGS],OMF_BYTE
  864.     bts    [di+OPERAND.OEFLAGS],OMF_OP32
  865.     bts    [bx+OPERAND.OEFLAGS],OMF_OP32
  866.     bt    DWORD PTR fs:[si],1
  867.     jc    op32noswap
  868.     xchg    bx,di
  869. op32noswap:
  870.     mov    [di+OPERAND.CODE],al
  871.     REG    si
  872.     mov    [di+OPERAND.THEREG],al
  873.     mov    di,bx
  874.     RM    si
  875.     call    SetReg
  876.     sub    ax,ax
  877.     ret
  878. op32    ENDP    
  879.  
  880.  
  881. ;/* op33 - reg,rm,shiftcnt where B3 = reg source, b0 = shift cl */
  882. op33    PROC    
  883.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  884.     btr    [bx+OPERAND.OEFLAGS],OMF_BYTE
  885.     call    CopyExtra
  886.     call    ReadRM
  887.     mov    cx,ax
  888.     REG    si
  889.     mov    di,bx
  890.     call    SetReg
  891.     mov    di,offset extraoperand
  892.     mov    [di+OPERAND.CODE],OM_SHIFT
  893.     bt    DWORD PTR fs:[si],0
  894.     jnc    short getofs
  895.     bts    [di+OPERAND.OEFLAGS],OMF_CL
  896.     jmp    short op33done
  897. getofs:
  898.     movzx    ecx,cx
  899.     movzx    esi,si
  900.     movzx    eax,BYTE PTR fs:[esi+ecx+2]
  901.     mov    [di+OPERAND.ADDRESS],eax
  902. op33done:
  903.     mov    ax,cx
  904.     ret
  905. op33    ENDP    
  906.  
  907.  
  908. ;/* op 34 - push & pop word, also no reqsPtrSizeOvride single args */
  909. op34    PROC    
  910.     call    ReadRM
  911.     ret
  912. op34    ENDP    
  913.  
  914.  
  915. ;/* op 35 -floating RM */
  916. op35    PROC    
  917.     mov    [reqsPtrSizeOvride],FALSE
  918.     MODX    si
  919.     cmp    al,3
  920.     jnz    short op35fsttab
  921.     bts    [di+OPERAND.OEFLAGS],OMF_FST
  922.     call    ReadRM
  923.     ret
  924. op35    endp
  925.  
  926.  
  927.  
  928. op35fsttab    proc
  929.     bts    [di+OPERAND.OEFLAGS],OMF_FSTTAB
  930.     movzx    eax,BYTE PTR fs:[si]
  931.     B12
  932.     shl    eax, OM_FTAB
  933.     or    [di+OPERAND.OEFLAGS],ax
  934.     call    ReadRM
  935.     ret
  936. op35fsttab    endp
  937.  
  938.  
  939. ;/* op 36 - floating math & pop */
  940.  
  941. op36    PROC    
  942.     mov    [reqsPtrSizeOvride],FALSE
  943.     mov    al,fs:[si+1]
  944.     and    al,0c7h
  945.     cmp    al,0c1h
  946.     jz    op36noarg
  947.     bts    [di+OPERAND.OEFLAGS],OMF_FST
  948.     and    al,7
  949.     call    setreg
  950.     sub    al,al
  951.     xchg    bx,di
  952.     bts    [di+OPERAND.OEFLAGS],OMF_FST
  953.     call    setreg
  954. op36noarg:
  955.     sub    ax,ax
  956.     ret
  957. op36    ENDP    
  958.  
  959.  
  960. ;/* OP 37 - floating MATH */
  961. op37    PROC    
  962.     mov    [reqsPtrSizeOvride],FALSE
  963.     MODX    si
  964.     cmp    al,3
  965.     jc    op35fsttab
  966.     test    byte ptr fs:[si],4
  967.     jnz    op37noflop
  968.     xchg    di,bx
  969. op37noflop:
  970.     bts    [di+OPERAND.OEFLAGS],OMF_FST
  971.     RM    si
  972.     call    setreg
  973.     sub    al,al
  974.     xchg    bx,di
  975.     bts    [di+OPERAND.OEFLAGS],OMF_FST
  976.     call    setreg
  977.     sub    ax,ax
  978.     ret
  979. op37    ENDP    
  980.  
  981.  
  982. ;/* op38 - FAR RM */
  983. op38    PROC    
  984.     mov    [reqsPtrSizeOvride],FALSE
  985.     bts    [di+OPERAND.OEFLAGS],OMF_FSTTAB
  986.     call    ReadRM
  987.     ret
  988. op38    ENDP    
  989.  
  990.  
  991. ;/* OP39 - word regrm with reg source */
  992. op39    PROC    
  993.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  994.     btr    [bx+OPERAND.OEFLAGS],OMF_BYTE
  995.     call    op40
  996.     ret
  997. op39    ENDP    
  998.  
  999.  
  1000. ;/* op 40 regrm with reg source */
  1001. op40    PROC    
  1002.     mov    [dest2],bx
  1003.     mov    [source2],di
  1004.     call    RegRM
  1005.     ret
  1006. op40    ENDP    
  1007.  
  1008.  
  1009. ;/* op 41 reg, bitnum */
  1010. op41    PROC    
  1011.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  1012.     call    ReadRM
  1013.     mov    cx,ax
  1014.     mov    di,bx
  1015.     bts    [di+OPERAND.OEFLAGS],OMF_BYTE
  1016.     push    si
  1017.     add    si,cx
  1018.     add    si,2
  1019.     call    Immediate
  1020.     pop    si
  1021.     mov    ax,cx
  1022.     ret
  1023. op41    ENDP    
  1024.  
  1025.  
  1026. ;/* op 42 mixed regrm with reg dest & reqsPtrSizeOvrideness enforced */
  1027.  
  1028. op42    PROC    
  1029.     mov    [dest2],di
  1030.     mov    [source2],bx
  1031.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  1032.     btr    [bx+OPERAND.OEFLAGS],OMF_OP32
  1033.     call    RegRM
  1034.     mov    [reqsPtrSizeOvride],TRUE
  1035.     ret
  1036. op42    ENDP    
  1037.  
  1038.  
  1039.  
  1040. ;/* op 43 CWDE
  1041.  
  1042. op43    PROC    
  1043.     bt    [di+OPERAND.OEFLAGS],OMF_OP32    
  1044.     jnc    short op43nochng        
  1045.     push    si                
  1046.     mov    si,offset nmmnemonic+1        
  1047.     mov    eax,"wde"            
  1048.     call    put3                
  1049.     mov    BYTE PTR [si],0            
  1050.     pop    si                
  1051.     sub    ax,ax                
  1052. op43nochng:
  1053.     ret
  1054. op43    ENDP    
  1055.  
  1056.  
  1057. ;/* op 44 BSWAP
  1058.  
  1059. op44    PROC
  1060.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  1061.     mov    al,fs:[si]
  1062.     and    al,7
  1063.     call    SetReg
  1064.     sub    ax,ax
  1065.     ret
  1066. op44    ENDP
  1067.  
  1068.  
  1069. ;/* OP45 - any regrm with reg source */
  1070.  
  1071. op45    PROC    
  1072.     bt    word ptr fs:[si-1],0
  1073.     jc    op45nb
  1074.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  1075.     btr    [bx+OPERAND.OEFLAGS],OMF_BYTE
  1076. op45nb:
  1077.     XCHG    BX,DI
  1078.     REG    si
  1079.     call    SetReg
  1080.     XCHG    bx,di
  1081.     call    ReadRM
  1082.     ret
  1083. op45    ENDP    
  1084.  
  1085.  
  1086. ;/* op 46 - floating R/M, pointers to mem */
  1087. op46    PROC    
  1088.     jmp    op29
  1089. op46    ENDP    
  1090.  
  1091.  
  1092. ;/* op47 - AX */
  1093. op47    PROC
  1094.     btr    [di+OPERAND.OEFLAGS],OMF_OP32
  1095.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  1096.     sub    al,al
  1097.     call    SetReg
  1098.     sub    ax,ax
  1099.     ret
  1100. op47    ENDP
  1101.  
  1102.  
  1103. ;/* op48 - 32-bit reg to r02, no prefix (bswap) */
  1104. op48    PROC
  1105.     bts    [di+OPERAND.OEFLAGS],OMF_OP32
  1106.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  1107.     mov    al,fs:[si]
  1108.     B02
  1109.     call    SetReg
  1110.     sub    ax,ax
  1111.     ret
  1112. op48    ENDP
  1113.  
  1114.  
  1115. ;/* op 49, FST */
  1116. op49    PROC
  1117.     mov    [reqsPtrSizeOvride],FALSE
  1118.     MODX    si
  1119.     cmp    al,3
  1120.     jnz    op49noreg
  1121.     bts    [di+OPERAND.OEFLAGS],OMF_FST
  1122.     jmp    short op49fin
  1123. op49noreg:
  1124.     bts    [di+OPERAND.OEFLAGS],OMF_FSTTAB
  1125.     movzx    eax,BYTE PTR fs:[si]
  1126.     and    al,6
  1127.     jz    op49nxor
  1128.     xor    al,6
  1129. op49nxor:
  1130.     shl    eax, OM_FTAB
  1131.     or    [di+OPERAND.OEFLAGS],ax
  1132. op49fin:
  1133.     call    ReadRM
  1134.     ret
  1135. op49    ENDP
  1136.  
  1137.  
  1138. ;/* op 50, FLD & FSTP */
  1139. op50    PROC
  1140.     jmp    op49
  1141. op50    ENDP
  1142.  
  1143.  
  1144. ;/* op 51, FBLD/FBSTP */
  1145. op51    PROC
  1146.     mov    [reqsPtrSizeOvride],FALSE
  1147.     bts    [di+OPERAND.OEFLAGS],OMF_FSTTAB
  1148.     or    [di+OPERAND.OEFLAGS],4 SHL OM_FTAB
  1149.     call    readrm
  1150.     ret
  1151. op51    ENDP
  1152.  
  1153.  
  1154. ;/* op 52, FILD & FISTP */
  1155. op52    PROC
  1156.     mov    [reqsPtrSizeOvride],FALSE
  1157.     mov    ah,1        ; assume dword
  1158.     mov    al,fs:[si]
  1159.     cmp    al,0dfh
  1160.     jnz    op52dw
  1161.     mov    ah,2        ; assume qword
  1162.     test    byte ptr fs:[si+1],20h
  1163.     jnz    op52dw
  1164.     mov    ah,3
  1165. op52dw:
  1166.     mov    al,ah
  1167.     sub    ah,ah
  1168.     bts    [di+OPERAND.OEFLAGS],OMF_FSTTAB
  1169.     shl    ax,OM_FTAB
  1170.     or    [di+OPERAND.OEFLAGS],ax
  1171.     call    readrm
  1172.     ret
  1173. op52    ENDP
  1174.  
  1175.  
  1176. ;/* op 53, FIST & FISTP */
  1177. op53    PROC
  1178.     jmp    op52
  1179. op53    ENDP
  1180.  
  1181.  
  1182. ;/* op 54, FREG */
  1183. op54    PROC
  1184.     mov    [reqsPtrSizeOvride],0
  1185.     bts    [di+OPERAND.OEFLAGS],OMF_FST
  1186.     call    ReadRM
  1187.     ret
  1188. op54    ENDP
  1189.  
  1190.  
  1191. ;/* op 55, FREG if not one */
  1192. op55    PROC
  1193.     mov    al,fs:[si+1]
  1194.     and    al,7
  1195.     cmp    al,1
  1196.     jnz    op54
  1197.     sub    ax,ax
  1198.     ret
  1199. op55    ENDP
  1200.  
  1201.  
  1202. ;/* op 56, FIMATH */
  1203. op56    PROC
  1204.     mov    [reqsPtrSizeOvride],false
  1205.     mov    ax,1
  1206.     test    byte ptr fs:[si],4
  1207.     jz    op56go
  1208.     mov    al,3
  1209. op56go:
  1210.     bts    [di+OPERAND.OEFLAGS],OMF_FSTTAB
  1211.     shl    ax,OM_FTAB
  1212.     or    [di+OPERAND.OEFLAGS],ax
  1213.     call    readrm
  1214.     ret
  1215. op56    ENDP
  1216.  
  1217.  
  1218.  
  1219. ReadOverrides    PROC    
  1220.           
  1221. ro_lp:
  1222.     sub    ax,ax
  1223.     lods    BYTE PTR fs:[si]
  1224.     test    [Disassemble32Bit],1
  1225.     jz    testseg
  1226.     cmp    al,64h
  1227.     jc    short testseg
  1228.     cmp    al,68h
  1229.     jnc    short testseg
  1230.     sub    al,64h
  1231.     mov    bx,SG_FS
  1232. ro_found:
  1233.     mov    cl,al
  1234.     shl    bx,cl
  1235.     or    [segs],bx
  1236.     jmp    short ro_lp
  1237. testseg:
  1238.     push    ax
  1239.     and    al,0e7h
  1240.     cmp    al,026h
  1241.     pop    ax
  1242.     jnz    testrep
  1243.     mov    bx,1
  1244.     shr    ax,3
  1245.     and    al,3
  1246.     jmp    ro_found
  1247. testrep:
  1248.     sub    al,0f2h
  1249.     cmp    al,2
  1250.     jnc    ro_done
  1251.     mov    bx,SG_REPNZ
  1252.     jmp    short ro_found
  1253. ro_done:
  1254.     dec    si
  1255.     ret
  1256. ReadOverrides    ENDP    
  1257.  
  1258.  
  1259. DispatchOperands    PROC    
  1260.     mov    dx,ax
  1261.     push    bx
  1262.     mov    di,offset nmmnemonic
  1263.     push    si
  1264.     mov    si,[bx+OPCODE.MNEMONIC]
  1265.     call    strcpy
  1266.     pop    si
  1267.     mov    [reqsPtrSizeOvride],TRUE
  1268.     movzx    ax,[bx+OPCODE.OPERANDS]
  1269.     push    ax
  1270.     mov    di,offset dest
  1271.     mov    bx,offset source
  1272.     test    [x86pfx],1
  1273.     jz    short notwobyte
  1274.     or    [segs],SG_TWOBYTEOP
  1275. notwobyte:
  1276.     mov    ax,offset extraoperand
  1277.     movzx    eax,ax
  1278.     mov    [eax+OPERAND.CODE],0
  1279.     mov    [di+OPERAND.CODE],0
  1280.     mov    [bx+OPERAND.CODE],0
  1281.     mov    [di+OPERAND.OEFLAGS],0
  1282.     mov    [bx+OPERAND.OEFLAGS],0
  1283.  
  1284.     
  1285.     bt    DWORD PTR fs:[si],0
  1286.     jc    notbyte
  1287.     bts    [di+OPERAND.OEFLAGS],OMF_BYTE
  1288.     bts    [bx+OPERAND.OEFLAGS],OMF_BYTE
  1289. notbyte:
  1290.     or    dx,dx
  1291.     jz    short xadr16
  1292.     bts    [di+OPERAND.OEFLAGS],OMF_ADR32
  1293.     bts    [bx+OPERAND.OEFLAGS],OMF_ADR32
  1294.     bts    [di+OPERAND.OEFLAGS],OMF_OP32
  1295.     bts    [bx+OPERAND.OEFLAGS],OMF_OP32
  1296. xadr16:
  1297.     test    [segs],SG_ADRSIZ
  1298.     jz    do_word1
  1299.     btc    [di+OPERAND.OEFLAGS],OMF_ADR32
  1300.     btc    [bx+OPERAND.OEFLAGS],OMF_ADR32
  1301. do_word1:
  1302.     test    [segs],SG_OPSIZ
  1303.     jz    do_word2
  1304.     btc    [di+OPERAND.OEFLAGS],OMF_OP32
  1305.     btc    [bx+OPERAND.OEFLAGS],OMF_OP32
  1306. do_word2:
  1307.     pop    ax
  1308.     or    ax,ax
  1309.     jz    nodispatch
  1310.     dec    al
  1311.     push    0
  1312.     call    TableDispatch
  1313.     dw    55
  1314.     dw    OP1,  OP2,  OP3,  OP4,  OP5,  OP6,  OP7,  OP8,  OP9,  OP10
  1315.     dw    OP11, OP12, OP13, OP14, OP15, OP16, OP17, OP18, OP19, OP20
  1316.     dw    OP21, OP22, OP23, OP24, OP25, OP26, OP27, OP28, OP29, OP30
  1317.     dw    OP31, OP32, OP33, OP34, OP35, OP36, OP37, OP38, OP39, OP40
  1318.     dw    OP41, OP42, OP43, OP44, OP45, OP46, OP47, OP48, OP49, OP50
  1319.     dw    OP51, OP52, OP53, OP54, OP55, OP56
  1320.     movzx    ax,al
  1321.     add    si,ax
  1322. nodispatch:
  1323.     pop    bx
  1324.     movzx    ax,[bx+OPCODE.OCLENGTH]
  1325.     add    si,ax
  1326.     ret
  1327. DispatchOperands    ENDP    
  1328.  
  1329.  
  1330. doreqsPtrSizeOvride    PROC    
  1331.     push    di
  1332.     push    si
  1333.     test    [reqsPtrSizeOvride],-1
  1334.     jz    short floatreqsPtrSizeOvride
  1335.     bt    [di+OPERAND.OEFLAGS],OMF_BYTE
  1336.     jnc    chkdwptr
  1337.     mov    di,si
  1338.     mov    si,offset byptr
  1339.     jmp    short reqsPtrSizeOvrideend
  1340. chkdwptr:
  1341.     bt    [di+OPERAND.OEFLAGS],OMF_OP32
  1342.     mov    di,si
  1343.     jnc    mkwordptr
  1344.     mov    si,offset dwptr
  1345.     jmp    short reqsPtrSizeOvrideend
  1346. mkwordptr:
  1347.     mov    si,offset woptr
  1348.       jmp    short reqsPtrSizeOvrideend
  1349. floatreqsPtrSizeOvride:
  1350.     bt    [di+OPERAND.OEFLAGS],OMF_FSTTAB
  1351.     jnc    reqsPtrSizeOvridedone
  1352.     mov    ax,[di+OPERAND.OEFLAGS]
  1353.     shr    ax,OM_FTAB
  1354.     and    ax,7
  1355.     mov    di,si
  1356.     push    di
  1357.     mov    si,offset sts
  1358.     movzx    esi,si
  1359.     movzx    eax,ax
  1360.     mov    si,[esi+eax * 2]
  1361.     call    strcat
  1362.     mov    si,offset theptr
  1363.     pop    di
  1364. reqsPtrSizeOvrideend:
  1365.     call    strcat
  1366. reqsPtrSizeOvridedone:
  1367.     pop    si
  1368.     call    strlen
  1369.     add    si,ax
  1370.     pop    di
  1371.     ret
  1372. DoreqsPtrSizeOvride    ENDP    
  1373.  
  1374. ;Tab over to the next location on the display
  1375. ; INPUT: AL contains the number of positions to move 
  1376. ;    SI points to a buffer aparently containing display strings?
  1377. ; If the buffer contains a string whose length exceeds the passed tab
  1378. ; position, we just add the requested tab position to SI, which now points
  1379. ; into the middle of that string somewhere.  Otherwise, we stuff spaces into
  1380. ; the buffer up to the requested tab position.
  1381.  
  1382. TabTo    PROC    
  1383.     movzx    eax,al        ;convert length to dword
  1384.     mov    cx,ax        ;put into loop counter
  1385.     call    strlen        ;find length of string, returned in AX
  1386.     xchg    ax,cx        ;tab length now in AX, string length in CX
  1387.     sub    ax,cx        ;subtract string length from tab length
  1388.     jnc    tt_noover    ;if NC, tab length was longer than string
  1389.     add    ax,cx        ;else get tab length back into AX
  1390.     add    si,ax        ;and add that to buffer pointer
  1391.     jmp    short tt_done    ;return new buffer position in SI
  1392.  
  1393. ;We got here if the string in the buffer was shorter than the distance to
  1394. ;the tab position.  In this case, AX is tab-string, and cx=stringlen.
  1395.  
  1396. tt_noover:
  1397.     add    si,cx        ;add string length to SI
  1398.     mov    cx,ax        ;put tab-string into cx        
  1399.     or    cx,cx        ;were they the same?
  1400.     jnz    tabtlp        ;if not, OK
  1401.     inc    cx        ;else stash one space anyway
  1402. tabtlp:
  1403.     mov    BYTE PTR [si],' '    ;space
  1404.     inc    si        ;bump pointer into buffer
  1405.     loop    tabtlp        ;for the remaining positions
  1406. tt_done:
  1407.     mov    BYTE PTR [si],0    ;put a 0 in the buffer following the spaces
  1408.     ret
  1409. TabTo    ENDP    
  1410.  
  1411.  
  1412. GetST    PROC    
  1413.     push    edi
  1414.     mov    al,[di+OPERAND.THEREG]
  1415.     push    ax
  1416.     xchg    si,di
  1417.     mov    si,offset stsreg
  1418.     call    strcpy
  1419.     pop    ax
  1420.     add    al,'0'
  1421.     dec    di
  1422.     stosb
  1423.     mov    al,')'
  1424.     stosb
  1425.     sub    al,al
  1426.     stosb
  1427.     dec    di
  1428.     xchg    si,di
  1429.     pop    edi
  1430.     ret
  1431. GetST    ENDP    
  1432.  
  1433.  
  1434. GetStdReg    PROC    
  1435.     push    edi
  1436.     or    al,al
  1437.     jnz    short gsrnoe
  1438.     mov    BYTE PTR [si],'e'
  1439.     inc    si
  1440. gsrnoe:
  1441.     mov    di,offset regs
  1442.     movzx    edi,di
  1443.     movzx    ecx,cx
  1444.     mov    ax,[edi+ecx *2]
  1445.     mov    [si],al
  1446.     inc    si
  1447.     mov    [si],ah
  1448.     inc    si
  1449.     mov    BYTE PTR [si],0
  1450.     pop    edi
  1451.     ret
  1452. GetStdReg    ENDP    
  1453.  
  1454.  
  1455. GetReg    PROC    
  1456.     movzx    cx,al
  1457.     sub    al,al
  1458.     inc    al
  1459.     bt    [di+OPERAND.OEFLAGS],OMF_BYTE
  1460.     jc    short grno32
  1461.     bt    [di+OPERAND.OEFLAGS],OMF_OP32
  1462.     jnc    short grno32
  1463.     dec    al
  1464. grno32:
  1465.     bt    [di+OPERAND.OEFLAGS],OMF_BYTE
  1466.     jc    short isbyte
  1467.     or    cl,8
  1468. isbyte:
  1469.     call    GetStdReg
  1470.     ret
  1471. GetReg    ENDP    
  1472.  
  1473.  
  1474. GetSpecial    PROC    
  1475.     mov    al,[bx]
  1476.     mov    [si],al
  1477.     inc    si
  1478.     inc    bx
  1479.     mov    al,[bx]
  1480.     mov    [si],al
  1481.     inc    si
  1482.     inc    bx
  1483.     movzx    eax,[di+OPERAND.THEREG]
  1484.     movzx    ebx,bx
  1485.     mov    al,[ebx +eax]
  1486.     mov    [si],al
  1487.     inc    si
  1488.     mov    BYTE PTR [si],0
  1489.     ret
  1490. GetSpecial    ENDP    
  1491.  
  1492.  
  1493. GetSeg    PROC    
  1494.     push    edi
  1495.     push    ax
  1496.     mov    di,offset psegs
  1497.     movzx    edi,di
  1498.     movzx    ecx,cx
  1499.     mov    ax,[edi+ecx *2]
  1500.     mov    [si],al
  1501.     inc    si
  1502.     mov    [si],ah
  1503.     inc    si
  1504.     pop    ax
  1505.     or    al,al
  1506.     mov    al,':'
  1507.     jz    short nocolon
  1508.     mov    [si],al
  1509.     inc    si
  1510. nocolon:
  1511.     mov    BYTE PTR [si],0
  1512.     pop    edi
  1513.     ret
  1514. GetSeg    ENDP    
  1515.  
  1516.  
  1517. SegOverride    PROC    
  1518.     mov    al,1
  1519.     sub    cx,cx
  1520.     test    [segs],SG_ES
  1521.     jz    short so_testcs
  1522.     call    GetSeg
  1523. so_testcs:
  1524.     inc    cx
  1525.     test    [segs],SG_CS
  1526.     jz    short so_testss
  1527.     call    GetSeg
  1528. so_testss:
  1529.     inc    cx
  1530.     test    [segs],SG_SS
  1531.     jz    short so_testds
  1532.     call    GetSeg
  1533. so_testds:
  1534.     inc    cx
  1535.     test    [segs],SG_DS
  1536.     jz    short so_testfs
  1537.     call    GetSeg
  1538. so_testfs:
  1539.     inc    cx
  1540.     test    [segs],SG_FS
  1541.     jz    short so_testgs
  1542.     call    GetSeg
  1543. so_testgs:
  1544.     inc    cx
  1545.     test    [segs],SG_GS
  1546.     jz    short so_done
  1547.     call    GetSeg
  1548. so_done:
  1549.     mov    [segs],0
  1550.     ret
  1551. SegOverride    ENDP    
  1552.  
  1553.  
  1554. Scaled    PROC    
  1555.     push    DWORD PTR [di+OPERAND.OEFLAGS]
  1556.     btr    [di+OPERAND.OEFLAGS],OMF_BYTE
  1557.     bts    [di+OPERAND.OEFLAGS],OMF_OP32
  1558.     or    al,al
  1559.     jz    short notbased
  1560.     sub    al,al
  1561.     mov    al,[di+OPERAND.THEREG]
  1562.     call    GetReg
  1563. notbased:
  1564.     bt    [di+OPERAND.OEFLAGS],OMF_SCALED
  1565.     jnc    short notscaled2
  1566.     mov    byte ptr [si],'+'
  1567.     inc    si
  1568.     mov    al,[di+OPERAND.SCALEREG]
  1569.     call    GetReg
  1570.     movzx    cx,[di+OPERAND.SCALE]
  1571.     or    cx,cx
  1572.     jz    notscaled2
  1573.     add    cx,cx
  1574.     add    cx,offset scales
  1575.     movzx    ecx,cx
  1576.     mov    ax,[ecx]
  1577.     call    put2
  1578. notscaled2:
  1579.     pop    DWORD PTR [di+OPERAND.OEFLAGS]
  1580.     ret
  1581. Scaled    ENDP    
  1582.  
  1583.  
  1584. FOM_FSTREG    PROC    
  1585.     mov    di,offset stalone
  1586.     call    strcat
  1587.     ret
  1588. FOM_FSTREG    ENDP    
  1589.  
  1590.  
  1591. FOM_CRX    PROC    
  1592.     mov    bx,offset crreg
  1593.     call    GetSpecial
  1594.     ret
  1595. FOM_CRX    ENDP    
  1596.  
  1597.  
  1598. FOM_DRX    PROC    
  1599.     mov    bx,offset drreg
  1600.     call    GetSpecial
  1601.     ret
  1602. FOM_DRX    ENDP    
  1603.  
  1604.  
  1605. FOM_TRX    PROC    
  1606.     mov    bx,offset trreg
  1607.     call    GetSpecial
  1608.     ret
  1609. FOM_TRX    ENDP    
  1610.  
  1611.  
  1612. FOM_SUD    PROC    
  1613.     mov    bx,offset sudreg
  1614.     call    GetSpecial
  1615.     ret
  1616. FOM_SUD    ENDP    
  1617.  
  1618.  
  1619. FOM_PORT    PROC    
  1620.     mov    al,SY_PORT
  1621.     jmp    FormatValue
  1622. FOM_PORT    ENDP    
  1623.  
  1624.  
  1625. FOM_INT    PROC    
  1626.     mov    al,SY_INTR
  1627.     jmp    FormatValue
  1628. FOM_INT    ENDP    
  1629.  
  1630.  
  1631. FOM_SHIFT    PROC    
  1632.     bt    [di+OPERAND.OEFLAGS],OMF_CL
  1633.     jnc    fos_notcl
  1634.     mov    ax,"cl"
  1635.     call    put2
  1636.     ret
  1637. fos_notcl:
  1638.     cmp    [di+OPERAND.ADDRESS],1
  1639.     mov    al,SY_SHIFT
  1640.     jnz    FormatValue
  1641.     mov    BYTE PTR [si],'1'
  1642.     inc    si
  1643.     mov    BYTE PTR [si],0
  1644.     ret
  1645. FOM_SHIFT    ENDP    
  1646.  
  1647.  
  1648. FOM_RETURN    PROC    
  1649.     mov    al,SY_RETURN
  1650.     jmp    FormatValue
  1651. FOM_RETURN    ENDP    
  1652.  
  1653.  
  1654. FOM_SHORTBRANCH    PROC    
  1655.     mov    al,SY_SHORTBRANCH
  1656.     jmp    FormatValue
  1657. FOM_SHORTBRANCH    ENDP    
  1658.  
  1659.  
  1660. FOM_LONGBRANCH    PROC    
  1661.     mov    al,SY_LONGBRANCH
  1662.     jmp    FormatValue
  1663. FOM_LONGBRANCH    ENDP    
  1664.  
  1665.  
  1666. FOM_FARBRANCH    PROC    
  1667.     mov    al,SY_SEGMENT
  1668.     call    FormatValue
  1669.     mov    BYTE PTR [si],':'
  1670.     inc    si
  1671.     mov    al,SY_ABSBRANCH
  1672.     jmp    FormatValue
  1673. FOM_FARBRANCH    ENDP    
  1674.  
  1675.  
  1676. FOM_ABSOLUTE    PROC    
  1677.     call    DoreqsPtrSizeOvride
  1678.     call    SegOverride
  1679.     mov    BYTE PTR [si],'['
  1680.     inc    si
  1681.     mov    BYTE PTR [si],0
  1682.     bt    [di+OPERAND.OEFLAGS],OMF_SCALED
  1683.     jnc    foa_notscaled
  1684.     mov    al,SY_WORDOFS
  1685.     call    FormatValue
  1686.     sub    ax,ax
  1687.     call    Scaled
  1688.     jmp    short foa_finish
  1689. foa_notscaled:
  1690.     mov    al,SY_ABSOLUTE
  1691.     call    FormatValue
  1692. foa_finish:
  1693.     mov    BYTE PTR [si],']'
  1694.     inc    si
  1695.     mov    BYTE PTR [si],0
  1696.     ret
  1697. FOM_ABSOLUTE    ENDP    
  1698.  
  1699.  
  1700. FOM_IMMEDIATE    PROC    
  1701.     bt    [di+OPERAND.OEFLAGS],OMF_BYTE
  1702.     mov    al,SY_WORDIMM
  1703.     jnc    short absformat
  1704.     test    [optsignedimm],1
  1705.     jnz    fi_signed
  1706.     push    ebx
  1707.     movzx    ebx,byte ptr [di + OPERAND.ADDRESS]
  1708.     mov    [di + OPERAND.ADDRESS],ebx
  1709.     pop    ebx
  1710.     jmp    FormatValue
  1711. fi_signed:
  1712.     mov    al,SY_BYTEOFS
  1713.     bt    [di+OPERAND.OEFLAGS],OMF_SIGNED
  1714.     jnc    short absformat
  1715.     mov    al,SY_SIGNEDIMM
  1716.     test    [optsignedimm],1
  1717.     jnz    absformat
  1718.     movsx    eax,byte ptr [di + OPERAND.ADDRESS]
  1719.     mov    [di + OPERAND.ADDRESS],eax
  1720.     mov    al,SY_WORDIMM
  1721. absformat:
  1722.     jmp    FormatValue
  1723. FOM_IMMEDIATE    ENDP    
  1724.  
  1725.  
  1726. FOM_REG    PROC    
  1727.     bt    [di+OPERAND.OEFLAGS],OMF_FST
  1728.     jnc    short foreg
  1729.     call    GetST
  1730.     ret
  1731. foreg:
  1732.     mov    al,[di+OPERAND.THEREG]
  1733.     call    GetReg
  1734.     ret
  1735. FOM_REG    ENDP    
  1736.  
  1737.  
  1738. FOM_BASED    PROC    
  1739.     call    DoreqsPtrSizeOvride
  1740.     call    SegOverride
  1741.     mov    BYTE PTR [si],'['
  1742.     inc    si
  1743.     mov    BYTE PTR [si],0
  1744.     bt    [di+OPERAND.OEFLAGS],OMF_ADR32
  1745.     jnc    fob_notscaled
  1746.     mov    al,1
  1747.     call    scaled
  1748.     jmp    short fob2
  1749. fob_notscaled:
  1750.     push    di
  1751.     push    si
  1752.     movzx    eax,BYTE PTR [di+OPERAND.THEREG]
  1753.     xchg    si,di
  1754.     mov    si,offset based
  1755.     movzx    esi,si
  1756.     movzx    ecx,cx
  1757.     mov    si,[esi+eax * 2]
  1758.     call    strcpy
  1759.     pop    si
  1760.     pop    di
  1761.     call    strlen
  1762.     add    si,ax
  1763. fob2:
  1764.     test    [di+OPERAND.OEFLAGS],OMF_OFFSET
  1765.     jz    short fob_noofs
  1766.     bt    [di+OPERAND.OEFLAGS],OMF_SIGNED_OFFSET
  1767.     mov    al,SY_SIGNEDOFS
  1768.     jc    fob_format
  1769.     mov    al,SY_WORDOFS
  1770.     bt    [di+OPERAND.OEFLAGS],OMF_WORD_OFFSET
  1771.     jc    fob_format
  1772.     mov    al,SY_BYTEOFS
  1773. fob_format:
  1774.     call    FormatValue
  1775. fob_noofs:
  1776.     mov    BYTE PTR [si],']'
  1777.     inc    si
  1778.     mov    BYTE PTR [si],0
  1779.     ret
  1780. FOM_BASED    ENDP    
  1781.  
  1782.  
  1783. FOM_SEGMENT    PROC    
  1784.     movzx    cx,[di+OPERAND.THEREG]
  1785.     sub    ax,ax
  1786.     call    GetSeg
  1787.     ret
  1788. FOM_SEGMENT    ENDP    
  1789.  
  1790.  
  1791. PutOperand    PROC    
  1792.     call    strlen
  1793.     add    si,ax
  1794.     mov    al,[di+OPERAND.CODE]
  1795.     dec    al
  1796.     js    short po_none
  1797.     push    0
  1798.     call    TableDispatch
  1799.     dw    17
  1800.     dw    fom_based
  1801.     dw    fom_segment
  1802.     dw    fom_reg
  1803.     dw    fom_immediate
  1804.     dw    fom_absolute
  1805.     dw    fom_farbranch
  1806.     dw    fom_longbranch
  1807.     dw    fom_shortbranch
  1808.     dw    fom_return
  1809.     dw    fom_shift
  1810.     dw    fom_int
  1811.     dw    fom_port
  1812.     dw    fom_sud
  1813.     dw    0
  1814.     dw    fom_trx
  1815.     dw    fom_drx
  1816.     dw    fom_crx
  1817.     dw    fom_fstreg
  1818. po_none:
  1819.     ret
  1820. PutOperand    ENDP    
  1821.  
  1822.  
  1823. FormatDisassembly    PROC    
  1824.     ENTER    256,0
  1825.     push    si
  1826.     lea    di,[bp-256]
  1827.     mov    BYTE PTR [di],0
  1828.     test    [segs],SG_REPZ
  1829.     push    di
  1830.     jz    fd_notrepz
  1831.     mov    si,offset st_repz
  1832.     call    strcpy
  1833. fd_notrepz:
  1834.     test    [segs],SG_REPNZ
  1835.     jz    fd_notrepnz
  1836.     mov    si,offset st_repnz
  1837.     call    strcpy
  1838. fd_notrepnz:
  1839.     pop    di
  1840.     xchg    si,di
  1841.     call    strlen
  1842.     add    si,ax
  1843.     xchg    si,di
  1844.     mov    si,offset nmmnemonic
  1845.     call    strcat
  1846.     lea    si,[bp-256]
  1847.     sub    ax,ax
  1848.     mov    al,TAB_ARGPOS
  1849.     call    TabTo
  1850.     mov    di,offset dest
  1851.     call    PutOperand
  1852.     mov    di,offset source
  1853.     test    [di+OPERAND.CODE],-1
  1854.     jz    short nosource
  1855.     mov    BYTE PTR [si],','
  1856.     inc    si
  1857.     mov    BYTE PTR [si],0
  1858.     call    PutOperand
  1859. nosource:
  1860.     mov    di,offset extraoperand
  1861.     test    [di+OPERAND.CODE],-1
  1862.     jz    short noextra
  1863.     mov    BYTE PTR [si],','
  1864.     inc    si
  1865.     mov    BYTE PTR [si],0
  1866.     call    PutOperand
  1867. noextra:
  1868.     pop    si    
  1869.     mov    BYTE PTR [si],0
  1870.     call    SegOverride
  1871.     mov    di,si
  1872.     lea    si,[bp-256]
  1873.     call    strcat
  1874.     LEAVE
  1875.     ret
  1876. FormatDisassembly    ENDP    
  1877.  
  1878.  
  1879. putdword:
  1880.     push    eax        ; To print a dword
  1881.     shr    eax,16        ; Print the high 16 bits
  1882.     call    putword
  1883.     pop    eax        ; And the low 16 bits
  1884. putword:
  1885.     push    ax        ; To print a word
  1886.     mov    al,ah        ; Print the high byte
  1887.     call    putbyte
  1888.     pop    ax        ; And the low byte
  1889. putbyte:
  1890.     push    ax        ; To print a byte
  1891.     shr    ax,4        ; Print the high nibble
  1892.     call    putnibble
  1893.     pop    ax        ; And the low nibble
  1894. putnibble:
  1895.     and    al,0fh        ; Get a nibble
  1896.     add    al,'0'        ; Make it numeric
  1897.     cmp    al,'9'        ; If supposed to be alphabetic
  1898.     jle    onib
  1899.     add    al,7        ; Add 7
  1900. onib:
  1901.     mov    [si],al
  1902.     inc    si
  1903.     ret
  1904.  
  1905. putwordox:
  1906.     bt    [di+OPERAND.OEFLAGS],OMF_OP32
  1907.     jnc    putword
  1908.     jmp    putdword
  1909. putwordax:
  1910.     bt    [di+OPERAND.OEFLAGS],OMF_ADR32
  1911.     jnc    putword
  1912.     jmp    putdword
  1913. FSY_SIGNEDOFS    PROC    
  1914.     push    bx
  1915.     mov    eax,[di+OPERAND.ADDRESS]
  1916.     bt    eax,7
  1917.     mov    bl,'+'
  1918.     jnc    fso_pos
  1919.     mov    bl,'-'
  1920.     neg    al
  1921. fso_pos:
  1922.     mov    byte ptr [si],bl
  1923.     inc si
  1924.     call    putbyte
  1925.     pop    bx
  1926.     ret
  1927. FSY_SIGNEDOFS    ENDP    
  1928.  
  1929.  
  1930. FSY_WORDOFS    PROC    
  1931.     push    bx
  1932.     mov    eax,[di+OPERAND.ADDRESS]
  1933.     cmp    ax,-4000h
  1934.     mov    bl,'+'
  1935.     jc    fsy_wouseplus
  1936.     neg    ax
  1937.     mov    bl,'-'
  1938. fsy_wouseplus:
  1939.     mov    byte ptr [si],bl
  1940.     inc si
  1941.     call    putwordax
  1942.     pop    bx
  1943.     ret
  1944. FSY_WORDOFS    ENDP    
  1945.  
  1946.  
  1947. FSY_BYTEOFS    PROC    
  1948.     mov    eax,[di+OPERAND.ADDRESS]
  1949.     call    putbyte
  1950.     ret
  1951. FSY_BYTEOFS    ENDP    
  1952.  
  1953.  
  1954. FSY_ABSOLUTE    PROC    
  1955.     mov    eax,[di+OPERAND.ADDRESS]
  1956.     call    putwordax
  1957.     ret
  1958. FSY_ABSOLUTE    ENDP    
  1959.  
  1960.  
  1961. FSY_SIGNEDIMM    PROC    
  1962.     jmp    fsy_signedofs
  1963. FSY_SIGNEDIMM    ENDP    
  1964.  
  1965.  
  1966. FSY_WORDIMM    PROC    
  1967.     mov    eax,[di+OPERAND.ADDRESS]
  1968.     call    putwordox
  1969.     ret
  1970. FSY_WORDIMM    ENDP    
  1971.  
  1972.  
  1973. FSY_BYTEIMM    PROC    
  1974.     mov    eax,[di+OPERAND.ADDRESS]
  1975.     call    putbyte
  1976.     ret
  1977. FSY_BYTEIMM    ENDP    
  1978.  
  1979.  
  1980. FSY_PORT    PROC    
  1981.     mov    eax,[di+OPERAND.ADDRESS]
  1982.     call    putbyte
  1983.     ret
  1984. FSY_PORT    ENDP    
  1985.  
  1986.  
  1987. FSY_INTR    PROC    
  1988.     mov    eax,[di+OPERAND.ADDRESS]
  1989.     call    putbyte
  1990.     ret
  1991. FSY_INTR    ENDP    
  1992.  
  1993.  
  1994. FSY_RETURN    PROC    
  1995.     mov    eax,[di+OPERAND.ADDRESS]
  1996.     call    putword
  1997.     ret
  1998. FSY_RETURN    ENDP    
  1999.  
  2000.  
  2001. FSY_ABSBRANCH    PROC    
  2002.     mov    eax,[di+OPERAND.ADDRESS]
  2003.     call    putword
  2004.     ret
  2005. FSY_ABSBRANCH    ENDP    
  2006.  
  2007.  
  2008. FSY_LONGBRANCH    PROC    
  2009.     mov    eax,[di+OPERAND.ADDRESS]
  2010.     call    putword
  2011.     ret
  2012. FSY_LONGBRANCH    ENDP    
  2013.  
  2014.  
  2015. FSY_SHORTBRANCH    PROC    
  2016.     mov    eax,[di+OPERAND.ADDRESS]
  2017.     call    putword
  2018.     ret
  2019. FSY_SHORTBRANCH    ENDP    
  2020.  
  2021.  
  2022. FSY_SHIFT    PROC    
  2023.     mov    eax,[di+OPERAND.ADDRESS]
  2024.     call    putbyte
  2025.     ret
  2026. FSY_SHIFT    ENDP    
  2027.  
  2028.  
  2029. FSY_SEGMENT    PROC    
  2030.     mov    ax,[di+OPERAND.OESEG]
  2031.     call    putword
  2032.     ret
  2033. FSY_SEGMENT    ENDP    
  2034.  
  2035.  
  2036. FormatValue    PROC    
  2037.     dec    al
  2038.     push    0
  2039.     call    TableDispatch
  2040.     dw    14
  2041.     dw    FSY_SIGNEDOFS,FSY_WORDOFS,FSY_BYTEOFS,FSY_ABSOLUTE
  2042.     dw    FSY_SIGNEDIMM,FSY_WORDIMM,FSY_BYTEIMM,FSY_PORT
  2043.     dw    FSY_INTR,FSY_RETURN,FSY_ABSBRANCH,FSY_LONGBRANCH
  2044.     dw    FSY_SHORTBRANCH,FSY_SHIFT,FSY_SEGMENT
  2045.     mov    byte ptr [si],0
  2046.     ret
  2047. FormatValue    ENDP    
  2048.  
  2049.  
  2050.  
  2051.  
  2052.  
  2053.  
  2054.  
  2055.  
  2056.  
  2057.  
  2058.  
  2059.  
  2060.  
  2061.  
  2062.  
  2063.  
  2064.  
  2065.  
  2066.  
  2067.  
  2068.  
  2069.  
  2070.  
  2071.  
  2072.  
  2073.  
  2074.  
  2075.  
  2076.  
  2077.  
  2078.  
  2079.  
  2080.  
  2081.  
  2082.  
  2083.  
  2084.  
  2085.  
  2086.  
  2087.  
  2088.  
  2089.  
  2090.  
  2091.  
  2092.  
  2093.  
  2094.  
  2095.  
  2096.  
  2097.  
  2098.  
  2099.  
  2100.  
  2101.  
  2102.  
  2103.  
  2104.  
  2105.  
  2106.  
  2107.  
  2108.  
  2109.  
  2110.  
  2111.  
  2112.  
  2113.  
  2114.  
  2115.  
  2116. END