home *** CD-ROM | disk | FTP | other *** search
/ For Beginners & Professional Hackers / cd.iso / hackers / tools / dis_asm.arj / DIS_ASM.ASM next >
Encoding:
Assembly Source File  |  1996-04-18  |  93.5 KB  |  4,177 lines

  1.  
  2. ;             ╔══════════════════════════════════════════════════╗
  3. ;             ║ *** ░▒▓█  äá¡¡δÑ ñ½∩ ñ¿ºáßßÑ¼í½¿α«óá¡¿∩ █▓▒░ *** ║
  4. ;             ╚══════════════════════════════════════════════════╝
  5.  
  6. command_symbol    db    'aaa', 'aad', 'aam', 'aas', 'adc', 'add'
  7.         db    'and', 'arpl', 'bound', 'bsf', 'bsr'
  8.         db    'bt', 'btc', 'btr', 'bts', 'call', 'cbw'
  9.         db    'cdq', 'clc', 'cld', 'cli', 'clts'
  10.         db    'cmc', 'cmp', 'cmpsb', 'cmpsw', 'cmpsd'
  11.         db    'cwd', 'cwde', 'daa', 'das', 'dec', 'div'
  12.         db    'enter', 'esc', 'hlt', 'ibts', 'idiv'
  13.         db    'imul', 'in', 'inc', 'insb', 'insw'
  14.         db    'insd', 'int', 'into', 'iret', 'iretd'
  15.         db    'jmp', 'ja', 'jnc', 'jc', 'jbe', 'jcxz'
  16.         db    'jz', 'jg', 'jnl', 'jl', 'jle', 'jnz'
  17.         db    'jno', 'jnp', 'jns', 'jo', 'jp', 'js'
  18.         db    'lahf', 'lar', 'lea', 'leave', 'lgdt'
  19.         db    'lidt', 'lds', 'les', 'lfs', 'lgs', 'lss'
  20.         db    'lldt', 'lmsw', 'lock', 'lodsb', 'lodsw'
  21.         db    'lodsd', 'loop', 'loopz', 'loopnz'
  22.         db    'lsl', 'ltr', 'mov', 'movsb', 'movsw'
  23.         db    'movsd', 'movsx', 'movzx', 'mul', 'neg'
  24.         db    'nop', 'not', 'or', 'out', 'outsb'
  25.         db    'outsw', 'outsd', 'pop', 'popa', 'popad'
  26.         db    'popf', 'popfd', 'push', 'pusha', 'pushad'
  27.         db    'pushf', 'pushfd', 'rcl', 'rcr'
  28.         db    'rol', 'ror', 'rep', 'repz', 'ret'
  29.         db    'sahf', 'shl', 'sar', 'shr', 'sbb'
  30.         db    'scasb', 'scasw', 'scasd', 'seta'
  31.         db    'setnc', 'setc', 'setna', 'setz', 'setg'
  32.         db    'setnl', 'setl', 'setle', 'setnz', 'setno'
  33.         db    'setnp', 'setns', 'seto', 'setp', 'sets'
  34.         db    'sgdt', 'sidt', 'shld', 'shrd', 'sldt'
  35.         db    'smsw', 'stc', 'std', 'sti', 'stosb'
  36.         db    'stosw', 'stosd', 'str', 'sub', 'test'
  37.         db    'verr', 'verw', 'wait', 'xbts', 'xchg'
  38.         db    'xlat', 'xor', 'db', 'repnz'
  39.         db    'es:', 'cs:', 'ss:', 'ds:', 'fs:', 'gs:'
  40.         db    'fld', 'fild', 'fbld', 'fst', 'fist', 'fstp'
  41.         db    'fistp', 'fbstp', 'fxch', 'fldz', 'fld1'
  42.         db    'fldpi', 'fldl2t', 'fldl2e', 'fldlg2'
  43.         db    'fldln2', 'fcom', 'ficom', 'fcomp', 'ficomp'
  44.         db    'fcompp', 'ftst', 'fxam', 'fadd', 'fiadd'
  45.         db    'faddp', 'fsub', 'fsubr', 'fsubp', 'fsubrp'
  46.         db    'fisub', 'fisubr', 'fmul', 'fimul', 'fmulp'
  47.         db    'fdiv', 'fdivr', 'fdivp', 'fdivrp', 'fidiv'
  48.         db    'fidivr', 'fsqrt', 'fscale', 'fprem'
  49.         db    'frndint', 'fxtract', 'fabs', 'fchs', 'fptan'
  50.         db    'fpatan', 'f2fm1', 'fyl2x', 'fyl2xp1'
  51.         db    'finit', 'fent', 'fdisi', 'fldcw', 'fstcw'
  52.         db    'fstsw', 'fclex', 'fstenv', 'fldenv', 'fsave'
  53.         db    'frstor', 'fincstp', 'fdecstp', 'ffree'
  54.         db    'fnop', 'fsincos'
  55.  
  56. offset_table    dw    00fh, 00fh, 00fh, 00fh, 00fh, 00fh, 17ch, 167h    ; 0
  57.         dw    153h, 153h, 153h, 153h, 153h, 153h, 17ch, 268h
  58.  
  59.         dw    00ch, 00ch, 00ch, 00ch, 00ch, 00ch, 17ch, 167h    ; 1
  60.         dw    1b9h, 1b9h, 1b9h, 1b9h, 1b9h, 1b9h, 17ch, 167h
  61.  
  62.         dw    012h, 012h, 012h, 012h, 012h, 012h, 268h, 062h    ; 2
  63.         dw    246h, 246h, 246h, 246h, 246h, 246h, 268h, 065h
  64.  
  65.         dw    265h, 265h, 265h, 265h, 265h, 265h, 268h, 000h    ; 3
  66.         dw    049h, 049h, 049h, 049h, 049h, 049h, 268h, 009h
  67.  
  68.         dw    087h, 087h, 087h, 087h, 087h, 087h, 087h, 087h    ; 4
  69.         dw    068h, 068h, 068h, 068h, 068h, 068h, 068h, 068h
  70.  
  71.         dw    17ch, 17ch, 17ch, 17ch, 17ch, 17ch, 17ch, 17ch    ; 5
  72.         dw    167h, 167h, 167h, 167h, 167h, 167h, 167h, 167h
  73.  
  74.         dw    180h, 16ah, 019h, 015h, 268h, 268h, 268h, 268h    ; 6
  75.         dw    17ch, 081h, 17ch, 081h, 08ah, 08eh, 158h, 15dh
  76.  
  77.         dw    0cfh, 0c6h, 0aeh, 0abh, 0b7h, 0c3h, 0b0h, 0a9h    ; 7
  78.         dw    0d3h, 0cch, 0d1h, 0c9h, 0beh, 0bbh, 0c0h, 0b9h
  79.  
  80.         dw    268h, 268h, 268h, 268h, 249h, 249h, 25dh, 25dh    ; 8
  81.         dw    12bh, 12bh, 12bh, 12bh, 12bh, 0dch, 12bh, 167h
  82.  
  83.         dw    14dh, 25dh, 25dh, 25dh, 25dh, 25dh, 25dh, 25dh    ; 9
  84.         dw    033h, 05bh, 02fh, 255h, 18bh, 173h, 1ach, 0d5h
  85.  
  86.         dw    12bh, 12bh, 12bh, 12bh, 12eh, 133h, 04ch, 051h    ; A
  87.         dw    249h, 249h, 234h, 239h, 107h, 10ch, 1bch, 1c1h
  88.  
  89.         dw    12bh, 12bh, 12bh, 12bh, 12bh, 12bh, 12bh, 12bh    ; B
  90.         dw    12bh, 12bh, 12bh, 12bh, 12bh, 12bh, 12bh, 12bh
  91.  
  92.         dw    268h, 268h, 1a9h, 1a9h, 0efh, 0ech, 12bh, 12bh    ; C
  93.         dw    06eh, 0dfh, 1a9h, 1a9h, 096h, 096h, 099h, 09dh
  94.  
  95.         dw    268h, 268h, 268h, 268h, 006h, 003h, 268h, 261h    ; D
  96.         dw    073h, 073h, 073h, 073h, 073h, 073h, 073h, 073h
  97.  
  98.         dw    11fh, 11ah, 116h, 0b3h, 085h, 085h, 155h, 155h    ; E
  99.         dw    02fh, 0a6h, 0a6h, 0a6h, 085h, 085h, 155h, 155h
  100.  
  101.         dw    103h, 268h, 26ah, 1a2h, 076h, 046h, 268h, 268h    ; F
  102.         dw    039h, 22bh, 03fh, 231h, 03ch, 22eh, 268h, 268h
  103.  
  104. length_table    db    03h, 03h, 03h, 03h, 03h, 03h, 04h, 03h        ; 0
  105.         db    02h, 02h, 02h, 02h, 02h, 02h, 04h, 02h
  106.  
  107.         db    03h, 03h, 03h, 03h, 03h, 03h, 04h, 03h        ; 1
  108.         db    03h, 03h, 03h, 03h, 03h, 03h, 04h, 03h
  109.  
  110.         db    03h, 03h, 03h, 03h, 03h, 03h, 02h, 03h        ; 2
  111.         db    03h, 03h, 03h, 03h, 03h, 03h, 02h, 03h
  112.  
  113.         db    03h, 03h, 03h, 03h, 03h, 03h, 02h, 03h        ; 3
  114.         db    03h, 03h, 03h, 03h, 03h, 03h, 02h, 03h
  115.  
  116.         db    03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h        ; 4
  117.         db    03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
  118.  
  119.         db    04h, 04h, 04h, 04h, 04h, 04h, 04h, 04h        ; 5
  120.         db    03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
  121.  
  122.         db    05h, 04h, 05h, 04h, 02h, 02h, 02h, 02h        ; 6
  123.         db    04h, 04h, 04h, 04h, 04h, 04h, 05h, 05h
  124.  
  125.         db    02h, 03h, 02h, 03h, 02h, 03h, 03h, 02h        ; 7
  126.         db    02h, 03h, 02h, 03h, 02h, 03h, 03h, 02h
  127.  
  128.         db    02h, 02h, 02h, 02h, 04h, 04h, 04h, 04h        ; 8
  129.         db    03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
  130.  
  131.         db    03h, 04h, 04h, 04h, 04h, 04h, 04h, 04h        ; 9
  132.         db    03h, 03h, 04h, 04h, 05h, 04h, 04h, 04h
  133.  
  134.         db    03h, 03h, 03h, 03h, 05h, 05h, 05h, 05h        ; A
  135.         db    04h, 04h, 05h, 05h, 05h, 05h, 05h, 05h
  136.  
  137.         db    03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h        ; B
  138.         db    03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
  139.  
  140.         db    02h, 02h, 03h, 03h, 03h, 03h, 03h, 03h        ; C
  141.         db    05h, 05h, 03h, 03h, 03h, 03h, 04h, 04h
  142.  
  143.         db    02h, 02h, 02h, 02h, 03h, 03h, 02h, 04h        ; D
  144.         db    03h, 03h, 03h, 03h, 03h, 03h, 03h, 03h
  145.  
  146.         db    06h, 05h, 04h, 04h, 02h, 02h, 03h, 03h        ; E
  147.         db    04h, 03h, 03h, 03h, 02h, 02h, 03h, 03h
  148.  
  149.         db    04h, 02h, 05h, 03h, 03h, 03h, 02h, 02h        ; F
  150.         db    03h, 03h, 03h, 03h, 03h, 03h, 02h, 02h
  151.  
  152. system_table    db    80h,  80h,  80h,  80h,  00h,  00h,  00h,  00h    ; 0
  153.         db    80h,  80h,  80h,  80h,  00h,  00h,  00h,  00h
  154.  
  155.         db    80h,  80h,  80h,  80h,  00h,  00h,  00h,  00h    ; 1
  156.         db    80h,  80h,  80h,  80h,  00h,  00h,  00h,  00h
  157.  
  158.         db    80h,  80h,  80h,  80h,  00h,  00h,  84h,  00h    ; 2
  159.         db    80h,  80h,  80h,  80h,  00h,  00h,  84h,  00h
  160.  
  161.         db    80h,  80h,  80h,  80h,  00h,  00h,  84h,  00h    ; 3
  162.         db    80h,  80h,  80h,  80h,  00h,  00h,  84h,  00h
  163.  
  164.         db    00h,  00h,  00h,  00h,  00h,  00h,  00h,  00h    ; 4
  165.         db    00h,  00h,  00h,  00h,  00h,  00h,  00h,  00h
  166.  
  167.         db    00h,  00h,  00h,  00h,  00h,  00h,  00h,  00h    ; 5
  168.         db    00h,  00h,  00h,  00h,  00h,  00h,  00h,  00h
  169.  
  170.         db    00h,  00h, 0C0h,  80h,  84h,  84h,  80h,  80h    ; 6
  171.         db    00h, 0A0h,  00h, 0A0h,  10h,  18h,  10h,  18h
  172.  
  173.         db    00h,  00h,  00h,  00h,  00h,  00h,  00h,  00h    ; 7
  174.         db    00h,  00h,  00h,  00h,  00h,  00h,  00h,  00h
  175.  
  176.         db    88h,  88h,  88h,  88h,  80h,  80h,  80h,  80h    ; 8
  177.         db    80h,  80h,  80h,  80h,  80h,  80h,  80h,  80h
  178.  
  179.         db    00h,  00h,  00h,  00h,  00h,  00h,  00h,  00h    ; 9
  180.         db    00h,  00h,  00h,  00h,  00h,  00h,  00h,  00h
  181.  
  182.         db    82h,  82h,  82h,  82h,  10h,  18h,  10h,  18h    ; A
  183.         db    00h,  00h,  10h,  18h,  10h,  18h,  10h,  18h
  184.  
  185.         db    00h,  00h,  00h,  00h,  00h,  00h,  00h,  00h    ; B
  186.         db    00h,  00h,  00h,  00h,  00h,  00h,  00h,  00h
  187.  
  188.         db    88h,  88h,  00h,  00h,  80h,  80h,  80h,  80h    ; C
  189.         db    00h,  00h,  00h,  00h,  00h,  00h,  00h,  00h
  190.  
  191.         db    88h,  88h,  88h,  88h,  00h,  00h,  00h,  00h    ; D
  192.         db    00h,  00h,  00h,  00h,  00h,  00h,  00h,  00h
  193.  
  194.         db    00h,  00h,  00h,  00h,  00h,  00h,  00h,  00h    ; E
  195.         db    00h,  00h,  00h,  00h,  00h,  00h,  00h,  00h
  196.  
  197.         db    00h,  00h,  00h,  00h,  00h,  00h,  88h,  88h    ; F
  198.         db    00h,  00h,  00h,  00h,  00h,  00h,  88h,  88h
  199.  
  200.  
  201. ;               ***  æΓαπ¬Γπαá íá⌐Γá - ¬«ñ¿α«óΘ¿¬á  ***
  202. ;
  203. ;    ┌───┬───┬───┬───┬───┬───┬───┬───┐
  204. ;    │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │
  205. ;    └─╥─┴─╥─┴─╥─┴─╥─┴─╥─┴─╥─┴─╥─┴─╥─┘
  206. ;         ║   ║   ║   ║   ║   ║   ║   ║
  207. ;         ║   ║   ║   ║   ║   ║   ║   ╚════>
  208. ;         ║   ║   ║   ║   ║   ║   ╚════════> Æ«½∞¬« ß »á¼∩Γ∞ε
  209. ;         ║   ║   ║   ║   ║   ╚════════════> ÅÑαѬ½ετáΓѽ∞ αѪ¿¼á
  210. ;         ║   ║   ║   ║   ╚════════════════> Ä»Ñαᵿ∩ ß αáßΦ¿αÑ¡¡δ¼ ¬«ñ«¼
  211. ;         ║   ║   ║   ╚════════════════════> é«º¼«ª¡á ¬«¼í¿¡áµ¿∩ ß rep
  212. ;         ║   ║   ╚════════════════════════> ìÑ «»αÑñѽ∩Γ∞ Γ¿»á «»Ñαᵿ¿
  213. ;         ║   ╚════════════════════════════> dword ptr ¿ß»«½∞ºπÑΓß∩ ó ¬«¼á¡ñÑ
  214. ;         ╚════════════════════════════════> é«º¼«ª¡á ß¼Ñ¡á ßÑú¼Ñ¡Γá
  215.  
  216.  
  217. offset_arop_1    dw    00fh, 153h, 00ch, 1b9h, 012h, 246h, 265h, 049h
  218. length_arop_1    db    03h,  02h,  03h,  03h,  03h,  03h,  03h,  03h
  219. system_arop_1    db    80h,  80h,  80h,  80h,  80h,  80h,  80h,  80h
  220.  
  221. offset_arop_2    dw    00fh, 153h, 00ch, 1b9h, 012h, 246h, 265h, 049h
  222. length_arop_2    db    03h,  02h,  03h,  03h,  03h,  03h,  03h,  03h
  223. system_arop_2    db    80h,  80h,  80h,  80h,  80h,  80h,  80h,  80h
  224.  
  225. offset_shift    dw    19ch, 19fh, 196h, 199h, 1b0h, 1b6h, 268h, 1b3h
  226. length_shift    db    03h,  03h,  03h,  03h,  03h,  03h,  02h,  03h
  227. system_shift    db    80h,  80h,  80h,  80h,  80h,  80h,  00h,  80h
  228.  
  229. offset_group_1    dw    249h, 268h, 150h, 14ah, 147h, 081h, 06bh, 07dh
  230. length_group_1    db    04h,  02h,  03h,  03h,  03h,  04h,  03h,  04h
  231. system_group_1    db    80h,  00h,  80h,  80h,  80h,  80h,  80h,  80h
  232.  
  233. offset_group_2    dw    087h, 068h, 268h, 268h, 268h, 268h, 268h, 268h
  234. length_group_2    db    03h,  03h,  02h,  02h,  02h,  02h,  02h,  02h
  235. system_group_2    db    80h,  80h,  00h,  00h,  00h,  00h,  00h,  00h
  236.  
  237. offset_group_3    dw    087h, 068h, 02fh, 02fh, 0a6h, 0a6h, 17ch, 268h
  238. length_group_3    db    03h,  03h,  04h,  04h,  03h,  03h,  04h,  02h
  239. system_group_3    db    80h,  80h,  80h,  80h,  80h,  80h,  80h,  00h
  240.  
  241.  
  242. offset_calling    dw    offset code_00h, offset code_01h
  243.         dw    offset code_02h, offset code_03h
  244.         dw    offset code_04h, offset code_05h
  245.         dw    offset code_06h, offset code_07h
  246.         dw    offset code_00h, offset code_01h
  247.         dw    offset code_02h, offset code_03h
  248.         dw    offset code_04h, offset code_05h
  249.         dw    offset code_0eh, offset code_0fh
  250.  
  251.         dw    offset code_00h, offset code_01h
  252.         dw    offset code_02h, offset code_03h
  253.         dw    offset code_04h, offset code_05h
  254.         dw    offset code_16h, offset code_17h
  255.         dw    offset code_00h, offset code_01h
  256.         dw    offset code_02h, offset code_03h
  257.         dw    offset code_04h, offset code_05h
  258.         dw    offset code_1eh, offset code_1fh
  259.  
  260.         dw    offset code_00h, offset code_01h
  261.         dw    offset code_02h, offset code_03h
  262.         dw    offset code_04h, offset code_05h
  263.         dw    offset code_26h, offset code_27h
  264.         dw    offset code_00h, offset code_01h
  265.         dw    offset code_02h, offset code_03h
  266.         dw    offset code_04h, offset code_05h
  267.         dw    offset code_2eh, offset code_27h
  268.  
  269.         dw    offset code_00h, offset code_01h
  270.         dw    offset code_02h, offset code_03h
  271.         dw    offset code_04h, offset code_05h
  272.         dw    offset code_36h, offset code_27h
  273.         dw    offset code_00h, offset code_01h
  274.         dw    offset code_02h, offset code_03h
  275.         dw    offset code_04h, offset code_05h
  276.         dw    offset code_3eh, offset code_27h
  277.  
  278.         dw    offset code_40h, offset code_41h
  279.         dw    offset code_42h, offset code_43h
  280.         dw    offset code_44h, offset code_45h
  281.         dw    offset code_46h, offset code_47h
  282.         dw    offset code_40h, offset code_41h
  283.         dw    offset code_42h, offset code_43h
  284.         dw    offset code_44h, offset code_45h
  285.         dw    offset code_46h, offset code_47h
  286.  
  287.         dw    offset code_40h, offset code_41h
  288.         dw    offset code_42h, offset code_43h
  289.         dw    offset code_44h, offset code_45h
  290.         dw    offset code_46h, offset code_47h
  291.         dw    offset code_40h, offset code_41h
  292.         dw    offset code_42h, offset code_43h
  293.         dw    offset code_44h, offset code_45h
  294.         dw    offset code_46h, offset code_47h
  295.  
  296.         dw    offset code_60h, offset code_61h
  297.         dw    offset code_03h, offset code_01h
  298.         dw    offset code_64h, offset code_65h
  299.         dw    offset code_66h, offset code_67h
  300.         dw    offset code_68h, offset code_69h
  301.         dw    offset code_6ah, offset code_6bh
  302.         dw    offset code_27h, offset code_6dh
  303.         dw    offset code_27h, offset code_6fh
  304.  
  305.         dw    offset code_70h, offset code_70h
  306.         dw    offset code_70h, offset code_70h
  307.         dw    offset code_70h, offset code_70h
  308.         dw    offset code_70h, offset code_70h
  309.         dw    offset code_70h, offset code_70h
  310.         dw    offset code_70h, offset code_70h
  311.         dw    offset code_70h, offset code_70h
  312.         dw    offset code_70h, offset code_70h
  313.  
  314.         dw    offset code_80h, offset code_81h
  315.         dw    offset code_82h, offset code_83h
  316.         dw    offset code_00h, offset code_01h
  317.         dw    offset code_00h, offset code_01h
  318.         dw    offset code_00h, offset code_01h
  319.         dw    offset code_02h, offset code_03h
  320.         dw    offset code_8ch, offset code_8dh
  321.         dw    offset code_8eh, offset code_8fh
  322.  
  323.         dw    offset code_27h, offset code_91h
  324.         dw    offset code_91h, offset code_91h
  325.         dw    offset code_91h, offset code_91h
  326.         dw    offset code_91h, offset code_91h
  327.         dw    offset code_98h, offset code_99h
  328.         dw    offset code_9ah, offset code_27h
  329.         dw    offset code_9ch, offset code_9dh
  330.         dw    offset code_27h, offset code_27h
  331.  
  332.         dw    offset code_a0h, offset code_a1h
  333.         dw    offset code_a2h, offset code_a3h
  334.         dw    offset code_27h, offset code_a5h
  335.         dw    offset code_27h, offset code_a5h
  336.         dw    offset code_04h, offset code_05h
  337.         dw    offset code_27h, offset code_a5h
  338.         dw    offset code_27h, offset code_a5h
  339.         dw    offset code_27h, offset code_a5h
  340.  
  341.         dw    offset code_b0h, offset code_b0h
  342.         dw    offset code_b0h, offset code_b0h
  343.         dw    offset code_b0h, offset code_b0h
  344.         dw    offset code_b0h, offset code_b0h
  345.         dw    offset code_b8h, offset code_b8h
  346.         dw    offset code_b8h, offset code_b8h
  347.         dw    offset code_b8h, offset code_b8h
  348.         dw    offset code_b8h, offset code_b8h
  349.  
  350.         dw    offset code_c0h, offset code_c1h
  351.         dw    offset code_c2h, offset code_c3h
  352.         dw    offset code_8dh, offset code_8dh
  353.         dw    offset code_c6h, offset code_c7h
  354.         dw    offset code_c8h, offset code_27h
  355.         dw    offset code_cah, offset code_cbh
  356.         dw    offset code_cdh, offset code_cdh
  357.         dw    offset code_27h, offset code_cfh
  358.  
  359.         dw    offset code_d0h, offset code_d1h
  360.         dw    offset code_d2h, offset code_d3h
  361.         dw    offset code_d4h, offset code_d4h
  362.         dw    offset code_d6h, offset code_27h
  363.         dw    offset code_d8h, offset code_d8h
  364.         dw    offset code_d8h, offset code_d8h
  365.         dw    offset code_d8h, offset code_d8h
  366.         dw    offset code_d8h, offset code_d8h
  367.  
  368.         dw    offset code_70h, offset code_70h
  369.         dw    offset code_70h, offset code_70h
  370.         dw    offset code_e4h, offset code_e4h
  371.         dw    offset code_e6h, offset code_e6h
  372.         dw    offset code_e8h, offset code_e8h
  373.         dw    offset code_9ah, offset code_70h
  374.         dw    offset code_ech, offset code_ech
  375.         dw    offset code_eeh, offset code_eeh
  376.  
  377.         dw    offset code_27h, offset code_d6h
  378.         dw    offset code_f2h, offset code_f2h
  379.         dw    offset code_27h, offset code_27h
  380.         dw    offset code_f6h, offset code_f7h
  381.         dw    offset code_27h, offset code_27h
  382.         dw    offset code_27h, offset code_27h
  383.         dw    offset code_27h, offset code_27h
  384.         dw    offset code_feh, offset code_ffh
  385.  
  386. command_regist    db    'al', 'cl', 'dl', 'bl', 'ah', 'ch', 'dh', 'bh'
  387.         db    'ax', 'cx', 'dx', 'bx', 'sp', 'bp', 'si', 'di'
  388. com_386_regist    db    'eax', 'ecx', 'edx', 'ebx'
  389.         db    'esp', 'ebp', 'esi', 'edi'
  390. segment_regist    db    'ds', 'cs', 'ss', 'es', 'fs', 'gs'
  391.  
  392. mod_rm_symbol    db    'ds:[bx+si]', 'ds:[bx+di]', 'ss:[bp+si]'
  393.         db    'ss:[bp+di]', 'ds:[si]', 'ds:[di]'
  394.         db    'ds:[0000h]', 'ds:[bx]'
  395.         db    'ds:[bx+si+00h]', 'ds:[bx+di+00h]'
  396.         db    'ss:[bp+si+00h]', 'ss:[bp+di+00h]'
  397.         db    'ds:[si+00h]', 'ds:[di+00h]', 'ss:[bp+00h]'
  398.         db    'ds:[bx+00h]'
  399.         db    'ds:[bx+si+0000h]', 'ds:[bx+di+0000h]'
  400.         db    'ss:[bp+si+0000h]', 'ss:[bp+di+0000h]'
  401.         db    'ds:[si+0000h]', 'ds:[di+0000h]'
  402.         db    'ss:[bp+0000h]', 'ds:[bx+0000h]'
  403.  
  404. mod_rm_offset    dw    0, 10, 20, 30, 40, 47, 54, 64
  405.         dw    71, 85, 99, 113, 127, 138, 149, 160
  406.         dw    171, 187, 203, 219, 235, 248, 261, 274
  407.  
  408. mod_rm_length    db    10, 10, 10, 10, 7, 7, 10, 7
  409.         db    14, 14, 14, 14, 11, 11, 11, 11
  410.         db    16, 16, 16, 16, 13, 13, 13, 13
  411.  
  412. mod_386_symbol    db    'ds:[eax]', 'ds:[ecx]', 'ds:[edx]', 'ds:[ebx]'
  413.         db    'sib', 'ds:[00000000h]', 'ds:[esi]', 'ds:[edi]'
  414.         db    'ds:[eax+00h]', 'ds:[ecx+00h]', 'ds:[edx+00h]'
  415.         db    'ds:[ebx+00h]', 'sib'
  416.         db    'ss:[ebp+00h]', 'ds:[esi+00h]', 'ds:[edi+00h]'
  417.         db    'ds:[eax+00000000h]', 'ds:[ecx+00000000h]'
  418.         db    'ds:[edx+00000000h]', 'ds:[ebx+00000000h]', 'sib'
  419.         db    'ss:[ebp+00000000h]', 'ds:[esi+00000000h]'
  420.         db    'ds:[edi+00000000h]'
  421.  
  422. mod_386_offset    dw    0, 8, 16, 24, 32, 35, 49, 57
  423.         dw    65, 77, 89, 101, 113, 116, 128, 140
  424.         dw    152, 170, 188, 206, 224, 227, 245, 263
  425.  
  426. mod_386_length    db    8, 8, 8, 8, 3, 14, 8, 8
  427.         db    12, 12, 12, 12, 3, 12, 12, 12
  428.         db    18, 18, 18, 18, 3, 18, 18, 18
  429.  
  430. mod_sib_symbol    db    'ds:[xxx*0h+eax]', 'ds:[xxx*0h+ecx]'
  431.         db    'ds:[xxx*0h+edx]', 'ds:[ebx+xxx*0h]'
  432.         db    'ds:[xxx*0h+esp]', 'ds:[xxx*0h+00000000h]'
  433.         db    'ds:[xxx*0h+esi]', 'ds:[xxx*0h+edi]'
  434.         db    'ds:[xxx*0h+eax+00h]', 'ds:[xxx*0h+ecx+00h]'
  435.         db    'ds:[xxx*0h+edx+00h]', 'ds:[xxx*0h+ebx+00h]'
  436.         db    'ds:[xxx*0h+esp+00h]', 'ds:[xxx*0h+ebp+00h]'
  437.         db    'ds:[xxx*0h+esi+00h]', 'ds:[xxx*0h+edi+00h]'
  438.         db    'ds:[xxx*0h+eax+00000000h]'
  439.         db    'ds:[xxx*0h+ecx+00000000h]'
  440.         db    'ds:[xxx*0h+edx+00000000h]'
  441.         db    'ds:[xxx*0h+ebx+00000000h]'
  442.         db    'ds:[xxx*0h+esp+00000000h]'
  443.         db    'ds:[xxx*0h+ebp+00000000h]'
  444.         db    'ds:[xxx*0h+esi+00000000h]'
  445.         db    'ds:[xxx*0h+edi+00000000h]'
  446.  
  447. mod_sib_offset    dw    0, 15, 30, 45, 60, 75, 96, 111
  448.         dw    126, 145, 164, 183, 202, 221, 240, 259
  449.         dw    278, 303, 328, 353, 378, 403, 428, 453
  450.  
  451. mod_sib_length    db    15, 15, 15, 15, 15, 21, 15, 15
  452.         db    19, 19, 19, 19, 19, 19, 19, 19
  453.         db    25, 25, 25, 25, 25, 25, 25, 25
  454.  
  455. byte_poz    db    'byte ptr'
  456. word_poz    db    'word ptr'
  457. dword_poz    db    'dword ptr'
  458.  
  459. string        db    80 dup (0)
  460.  
  461. adress        db    4 dup (0)        ; σαá¡¿Γß∩ ΓѬπΘ¿⌐ áñαÑß
  462. cur_adress    db    4 dup (0)        ; ñ½∩ αáßτÑΓá jmp - ß¼ÑΘÑ¡¿⌐
  463. off_string    db    4 dup (0)        ; ñ½∩ ßΓ᫬¿ - ß¼ÑΘÑ¡¿∩
  464.  
  465. byte_word    db    0            ; 1 = íá⌐Γ, 2 = ß½«ó«
  466. off_code    db    0            ; 1 = íá⌐Γ, 2 = ß½«ó«
  467. cpu_mode_1    db    0            ; 1 = 32
  468. cpu_mode_2    db    0            ; 1 = 32
  469.  
  470. yes_sib        db    0            ; αáßΦ¿αÑ¡¡δ⌐ íá⌐Γ sib
  471.  
  472. h_add        db    0            ; τ¿ß½« íá⌐Γ ó ¬«¼á¡ñÑ
  473.  
  474. new_segment    dw    00            ; ß¼ÑΘÑ¡¿Ñ ¡«ó«ú« ßÑú¼Ñ¡Γá
  475.  
  476. dis_cpu        proc    near
  477.  
  478.         push    ax
  479.         push    cx
  480.         push    dx
  481.         push    si
  482.         push    di
  483.         push    ds
  484.         call    clear            ; «τ¿ßΓ¬á íπΣÑαá
  485.         call    gen_adr            ; úÑ¡Ñαᵿ∩ áñαÑßá
  486.         call    str_adr            ; »αÑ«íαẫóá¡¿Ñ áñαÑßá
  487.         call    dis_asm            ; ñ¿ºáßßÑ¼í½¿α«óá¡¿Ñ ¬«¼á¡ñδ
  488.         pop    ds
  489.         pop    di
  490.         pop    si
  491.         pop    dx
  492.         pop    cx
  493.         pop    ax
  494.         retn
  495.  
  496. dis_cpu        endp
  497.  
  498. ;                       ***  Äτ¿ßΓ¬á íπΣÑαá ßΓ᫬¿  ***
  499.  
  500. clear        proc    near
  501.  
  502.         mov    cx,40            ; ñ½¿¡á ßΓ᫬¿
  503.         mov    di, offset string
  504.         xor    ax,ax            ; «τ¿ßΓ¬á ¡π½∩¼¿
  505.         push    es
  506.         push    ds
  507.         pop    es
  508.         cld
  509.         rep    stosw
  510.         pop    es
  511.         mov    byte ptr ds:[off_code], 0
  512.         mov    byte ptr ds:[yes_sib], 0
  513.         xor    ax,ax
  514.         mov    al, byte ptr ds:[h_add]    ; τ¿ß½« íá⌐Γ ó ¬«¼á¡ñÑ
  515.         add    bx,ax            ; »«½πτ¿¼ ¡«ó«Ñ ß¼ÑΘÑ¡¿Ñ
  516.         retn
  517.  
  518. clear        endp
  519.  
  520. ;                     ***  âÑ¡Ñαᵿ∩ áñαÑßá ßΓ᫬¿  ***
  521.  
  522. gen_adr        proc    near
  523.  
  524.         mov    si, offset adress
  525.         add    si,3            ; ¼½áñΦ¿⌐ αáºα∩ñ áñαÑßá
  526.         mov    cx,4            ; óßÑú« ó«ßѼ∞ αáºα∩ñ«ó
  527.         mov    al, byte ptr ds:[h_add]    ; ñ«íáó¿¼ τ¿ß½« íá⌐Γ
  528. raz_loop:
  529.         add    byte ptr ds:[si], al    ; »αÑñδñπΘÑ⌐ ¬«¼á¡ñδ
  530.         cmp    byte ptr ds:[si], 0fh    ; »ÑαÑ»«½¡Ñ¡¿Ñ ?
  531.         jbe    not_razr_corr        ; ¡ÑΓ ==> íѺ ¬«ααѬµ¿¿
  532.         xor    ax,ax
  533.         sub    byte ptr ds:[si], 10h
  534.         dec    si            ; «Γ¬«ααÑ¬Γ¿απѼ ßΓáαΦ¿⌐
  535.         mov    al,1
  536.         loop    raz_loop        ; ¿ Γᬠñ« ¬«¡µá
  537. not_razr_corr:
  538.         retn
  539.  
  540. gen_adr        endp
  541.  
  542. ;                 ***  ÅαÑ«íαẫóá¡¿Ñ áñαÑßá ó ßΓ᫬π  ***
  543.  
  544. str_adr        proc    near
  545.  
  546.         mov    cx,4            ; »αÑ«íαáºπѼ 8 íá⌐Γ
  547.         mov    si, offset adress    ; «Γßεñá íÑαѼ,
  548.         mov    di, offset string    ; á ßεñᠺᡫ߿¼
  549. str_loop:
  550.         mov    al, byte ptr ds:[si]    ; íá⌐Γ áñαÑßá
  551.         cmp    al,9            ; φΓ« µ¿Σαá ?
  552.         jbe    cifra            ; ñá ==> »ÑαÑ⌐ñѼ
  553.         add    al,7            ; ß¬«ααÑ¬Γ¿απѼ 
  554. cifra:
  555.         add    al,30h            ; ñ«íáó¿¼ ß¿¼ó«½ ¡π½∩
  556.         mov    byte ptr ds:[di], al    ; »«½πτ¿¼ ASCII - ¬«ñ
  557.         inc    si
  558.         inc    di
  559.         loop    str_loop        ; ¿ Γᬠñ« ¬«¡µá
  560.         retn
  561.  
  562. str_adr        endp
  563.  
  564. ;                     ***  ä¿ºáßßÑ¼í½¿α«óá¡¿Ñ ¬«¼á¡ñδ  ***
  565.  
  566. dis_asm        proc    near
  567.  
  568.         xor    ax,ax
  569.         mov    al, byte ptr es:[bx]    ; al = íá⌐Γ ¬«ñá
  570.         push    ax            ; ==> ß«σαá¡¿¼ ß¼ÑΘÑ¡¿Ñ ¬«ñá
  571.         shl    ax,1            ; ß¼ÑΘÑ¡¿Ñ ó Γáí½¿µÑ ß½«ó !
  572.         mov    si, offset offset_table    ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ
  573.         add    si,ax            ; ó Γáí½¿µÑ ß¼ÑΘÑ¡¿⌐
  574.         mov    dx, word ptr ds:[si]
  575.         mov    si, offset offset_calling    ; ß¼ÑΘÑ¡¿Ñ ó Γáí½¿µÑ
  576.         add    si,ax                ; «íαáí«Γ¬¿
  577.         mov    ax, word ptr ds:[si]
  578.         xchg    ax,dx
  579.         mov    si, offset command_symbol    ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ¡á
  580.         add    si,ax                ; ¼áΦ¿¡¡πε ¿¡ßΓαπ¬µ¿ε
  581.         pop    ax
  582.         push    si            ; ==> ß«σαá¡¿¼ ¡á ßΓѬÑ
  583.         mov    si, offset length_table
  584.         add    si,ax            ; óδíÑαѼ ñ½¿¡π ñ½∩
  585.         xor    cx,cx            ; »ÑαÑß佬¿
  586.         mov    cl, byte ptr ds:[si]
  587.         mov    si, offset system_table
  588.         add    si,ax            ; ß¿ßΓѼ¡á∩ ¿¡Σ«α¼áµ¿∩
  589.         xor    ax,ax
  590.         mov    al, byte ptr ds:[si]
  591.         pop    si            ; <== óδí«α¬á ß¼ÑΘÑ¡¿∩
  592.         xchg    ax,dx
  593.         mov    byte ptr ds:[h_add], 1    ; »«¬á ñ½¿¡á ¬«¼á¡ñδ = 1
  594.         call    ax
  595.         retn
  596.  
  597. dis_asm        endp
  598.  
  599.  
  600.  
  601. ;             ***  Äíαáí«Γ¬á Γ¿»«ó  Rm / R8  ¿  Rm / R16  ***
  602.  
  603. this_rm_r8_r16    proc    near
  604.  
  605.         call    operation_type
  606.         jz    op_with_regs        ; ñá ==> «íαáí«ΓáѼ «Γñѽ∞¡«
  607.         call    mnemo_calling
  608.         mov    byte ptr ds:[di], 2ch    ; ','
  609.         inc    di            ; ¡«óδ⌐ áñαÑß ñ½∩ óδó«ñá
  610.         call    form_register        ; Σ«α¼¿απѼ αÑú¿ßΓα
  611.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  612. op_with_regs:
  613.         call    write_mnemo        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  614.         call    reg_addition
  615.         call    form_register        ; ºá»¿ß∞ óΓ«α«ú« αÑú¿ßΓαá
  616.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  617.  
  618. this_rm_r8_r16    endp
  619.  
  620. ;                     ***  Ä»αÑñѽ∩ÑΓ Γ¿» «»Ñαᵿ¿  ***
  621.  
  622. operation_type    proc    near
  623.  
  624.         call    byte_or_word        ; «»αÑñѽ∩Ѽ Γ¿» «»Ñαᵿ¿
  625.         call    memory_or_regs        ; αáí«ΓáѼ ß αÑú¿ßΓαἿ ?
  626.         retn
  627.  
  628. operation_type    endp
  629.  
  630. ;                    ***  Ä»αÑñѽѡ¿Ñ Γ¿»á «»Ñαᵿ¿  ***
  631.  
  632. byte_or_word    proc    near
  633.  
  634.         cmp    ah,2
  635.         jz    ok_word
  636.         mov    byte ptr ds:[byte_word], 1    ; «»Ñαᵿ∩ ß íá⌐ΓἿ
  637.         jmp    short  ok_begin
  638. ok_word:
  639.         mov    byte ptr ds:[byte_word], 2    ; «»Ñαᵿ∩ ß« ß½«óἿ
  640. ok_begin:
  641.         and    dx,40h
  642.         cmp    dx,40h
  643.         jnz    no_dword_op
  644.         mov    byte ptr ds:[byte_word], 3
  645. no_dword_op:
  646.         inc    byte ptr ds:[h_add]        ; ¬«¼á¡ñá ==> 2 íá⌐Γá
  647.         retn
  648.  
  649. byte_or_word    endp
  650.  
  651. ;                 ***  Ä»αÑñѽ¿¼, ß τѼ íπñÑΓ «»Ñαᵿ∩  ***
  652.  
  653. memory_or_regs    proc    near
  654.  
  655.         xor    ax,ax
  656.         mov    al,byte ptr es:[bx+1]    ; ó«º∞¼Ñ¼ óΓ«α«⌐ íá⌐Γ
  657.         push    ax
  658.         and    al,11000000b
  659.         cmp    al,192            ; «»Ñαᵿ∩ ß αÑú¿ßΓαἿ ?
  660.         pop    ax
  661.         retn
  662.  
  663. memory_or_regs    endp
  664.  
  665. ;                    ***  éδó«ñ ¼¡Ñ¼«¡¿¬¿ ¬«¼á¡ñδ  ***
  666.  
  667. mnemo_calling    proc    near
  668.  
  669.         call    memory_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  670.         call    write_mnemo        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  671.         call    form_memory        ; Σ«α¼¿απѼ «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  672.         mov    di,27            ; áñαÑß ñ½∩ óδó«ñá
  673.         call    ins_mem_reg        ; óßΓáó¿¼ »Ñαóπε »«½«ó¿¡π
  674.         call    plus_offset        ; ñ«íáó¿¼ ß¼ÑΘÑ¡¿∩
  675.         retn
  676.  
  677. mnemo_calling    endp
  678.  
  679. ;                  ***  Ä»αÑñѽѡ¿Ñ ñ«óÑ߬á ß¼ÑΘÑ¡¿∩  ***
  680.  
  681. memory_cost    proc    near
  682.  
  683.         cmp    byte ptr ds:[cpu_mode_2], 1
  684.         jz    d32_operation
  685.         push    ax
  686.         and    al,11000111b        ; óδñѽ¿¼ «»Ñαᵿε ß »á¼∩Γ∞ε
  687.         cmp    al,6            ; DS : [d16] ?
  688.         jnz    not_in_first        ; ¡ÑΓ ==> »α«óÑα¿¼ ñá½∞ΦÑ
  689.         add    byte ptr ds:[h_add], 2    ; íπñÑΓ ÑΘÑ ß½«ó«
  690.         mov    byte ptr ds:[off_code], 2    ; ¬«Γ«α«Ñ ¡áñ« óδíαáΓ∞
  691.         pop    ax
  692.         jmp    short  bits_find
  693. not_in_first:
  694.         pop    ax
  695.         push    ax
  696.         and    al,11000000b        ; óδñѽ¿¼ «»Ñαᵿε ß »á¼∩Γ∞ε
  697.         cmp    al,64            ; SEG : [REG + d8] ?
  698.         jnz    not_in_second        ; ¡ÑΓ ==> »α«óÑα¿¼ ñá½∞ΦÑ
  699.         inc    byte ptr ds:[h_add]    ; íπñÑΓ ÑΘÑ íá⌐Γ
  700.         mov    byte ptr ds:[off_code], 1    ; ¡Ñ«íσ«ñ¿¼« óδíαáΓ∞
  701.         pop    ax
  702.         jmp    short  bits_find
  703. not_in_second:
  704.         cmp    al,128            ; SEG : [REG + d16] ?
  705.         jnz    not_in_third        ; ¡ÑΓ ==> º¡áτ¿Γ ß¼ÑΘÑ¡¿⌐ ¡ÑΓ
  706.         add    byte ptr ds:[h_add], 2    ; íπñÑΓ ÑΘÑ ß½«ó«
  707.         mov    byte ptr ds:[off_code], 2    ; ¡Ñ«íσ«ñ¿¼« óδíαáΓ∞
  708.         pop    ax
  709.         jmp    short  bits_find
  710. not_in_third:
  711.         mov    byte ptr ds:[off_code], 0    ; óδí¿αáΓ∞ ¡¿τÑú«
  712.         pop    ax
  713. bits_find:
  714.         retn
  715.  
  716. d32_operation:
  717.         push    ax
  718.         and    al,11000111b        ; óδñѽ¿¼ «»Ñαᵿε ß »á¼∩Γ∞ε
  719.         cmp    al,4            ; sib »α¿ßπΓßΓóπÑΓ ?
  720.         jz    look_386_sib
  721.         cmp    al,68
  722.         jz    look_386_sib
  723.         cmp    al,132
  724.         jz    look_386_sib
  725.         cmp    al,5            ; DS : [d32] ?
  726.         jnz    not_386_first        ; ¡ÑΓ ==> »α«óÑα¿¼ ñá½∞ΦÑ
  727.         add    byte ptr ds:[h_add], 4    ; íπñÑΓ ÑΘÑ 2 ß½«óá
  728.         mov    byte ptr ds:[off_code], 4    ; ¬«Γ«αδÑ ¡áñ« óδíαáΓ∞
  729.         pop    ax
  730.         jmp    short  bits_find
  731. not_386_first:
  732.         pop    ax
  733.         push    ax
  734. sib_lock:
  735.         pop    ax
  736.         push    ax
  737.         and    al,11000000b        ; óδñѽ¿¼ «»Ñαᵿε ß »á¼∩Γ∞ε
  738.         cmp    al,64            ; SEG : [REG + d8] ?
  739.         jnz    not_386_second        ; ¡ÑΓ ==> »α«óÑα¿¼ ñá½∞ΦÑ
  740.         inc    byte ptr ds:[h_add]    ; íπñÑΓ ÑΘÑ íá⌐Γ
  741.         mov    byte ptr ds:[off_code], 1    ; ¡Ñ«íσ«ñ¿¼« óδíαáΓ∞
  742.         pop    ax
  743.         jmp    short  bits_find
  744. not_386_second:
  745.         cmp    al,128            ; SEG : [REG + d32] ?
  746.         jnz    not_386_third        ; ¡ÑΓ ==> º¡áτ¿Γ ß¼ÑΘÑ¡¿⌐ ¡ÑΓ
  747.         add    byte ptr ds:[h_add], 4    ; íπñÑΓ ÑΘÑ 2 ß½«óá
  748.         mov    byte ptr ds:[off_code], 4    ; ¡Ñ«íσ«ñ¿¼« óδíαáΓ∞
  749.         pop    ax
  750.         jmp    short  bits_find
  751. not_386_third:
  752.         mov    byte ptr ds:[off_code], 0    ; óδí¿αáΓ∞ ¡¿τÑú«
  753.         pop    ax
  754.         jmp    short    bits_find
  755. look_386_sib:
  756.         inc    byte ptr ds:[h_add]    ; αáßΦ¿αÑ¡¡δ⌐ íá⌐Γ
  757.         mov    byte ptr ds:[yes_sib], 1
  758.         mov    al, byte ptr es:[bx+2]
  759.         push    ax
  760.         and    al,00000111b        ; »α«óÑα¬á ¡á αáßΦ¿αÑ¡¡δÑ
  761.         cmp    al,5            ; Γáí½¿µδ
  762.         pop    ax
  763.         jnz    sib_lock
  764.         add    byte ptr ds:[h_add], 4    ; íπñÑΓ ÑΘÑ 2 ß½«óá
  765.         mov    byte ptr ds:[off_code], 4    ; ¡Ñ«íσ«ñ¿¼« óδíαáΓ∞
  766.         pop    ax
  767.         jmp    short    bits_find
  768.  
  769. memory_cost    endp
  770.  
  771. ;                 ***  éδó«ñ ¼¡Ñ¼«¡¿¬¿ ¬«¼á¡ñδ ó íπΣÑα  ***
  772.  
  773. write_mnemo    proc    near
  774.  
  775.         push    ax
  776.         push    es
  777.         cmp    byte ptr ds:[cpu_mode_1], 1
  778.         jz    mode_66_problem
  779.         cmp    byte ptr ds:[cpu_mode_2], 1
  780.         jz    mode_67_problem
  781.         cmp    word ptr ds:[new_segment], 0000h
  782.         jz    not_segm_problem    ; ßÑú¼Ñ¡Γ ¡Ñ ¼Ñ¡∩ÑΓß∩
  783. write_lock:
  784.         inc    byte ptr ds:[h_add]    ; ¬«¼á¡ñá ßΓá½á í«½∞ΦÑ
  785.         dec    bx            ; ¡á «ñ¿¡ íá⌐Γ
  786.         call    translate        ; óδó«ñ¿¼ ¬«ñ
  787.         inc    bx            ; ¬á¬ íπñΓ« ¡¿τÑú« ¡Ñ í佫
  788.         jmp    short  make_instruction
  789. not_segm_problem:
  790.         call    translate        ; óδó«ñ¿¼ ¬«ñ, ºáΓѼ
  791. make_instruction:
  792.         push    cs
  793.         pop    es
  794.         call    ins_instruct        ; ¼¡Ñ¼«¡¿¬π ¬«¼á¡ñδ
  795.         pop    es
  796.         pop    ax
  797.         retn
  798.  
  799. mode_66_problem:
  800.         cmp    byte ptr ds:[cpu_mode_2], 1
  801.         jz    mode_@@_problem
  802.         cmp    word ptr ds:[new_segment], 0000h
  803.         jnz    segment_@@_problem
  804.         jmp    short    write_lock
  805. mode_@@_problem:
  806.         cmp    word ptr ds:[new_segment], 0000h
  807.         jnz    segment_@@@_problem
  808. segment_@@_problem:
  809.         add    byte ptr ds:[h_add], 2    ; ¬«¼á¡ñá ßΓá½á í«½∞ΦÑ
  810.         dec    bx
  811.         dec    bx
  812.         call    translate        ; óδó«ñ¿¼ ¬«ñ
  813.         inc    bx            ; ¬á¬ íπñΓ« ¡¿τÑú« ¡Ñ í佫
  814.         inc    bx
  815.         jmp    short  make_instruction
  816. segment_@@@_problem:
  817.         add    byte ptr ds:[h_add], 3    ; ¬«¼á¡ñá ßΓá½á í«½∞ΦÑ
  818.         dec    bx
  819.         dec    bx
  820.         dec    bx
  821.         call    translate        ; óδó«ñ¿¼ ¬«ñ
  822.         inc    bx            ; ¬á¬ íπñΓ« ¡¿τÑú« ¡Ñ í佫
  823.         inc    bx
  824.         inc    bx
  825.         jmp    short  make_instruction
  826.  
  827. mode_67_problem:
  828.         cmp    word ptr ds:[new_segment], 0000h
  829.         jnz    segment_@@_problem
  830.         jmp    short    write_lock
  831.  
  832. write_mnemo    endp
  833.  
  834. ;                  ***  éßΓáó¬á ¼áΦ¿¡¡«ú« ¬«ñá ¬«¼á¡ñδ  ***
  835.  
  836. translate    proc    near
  837.  
  838.         push    bx
  839.         push    cx
  840.         push    si
  841.         xor    ax,ax
  842.         mov    al, byte ptr ds:[h_add]    ; »«½πτ¿¼ τ¿ß½« íá⌐Γ
  843.         mov    cx,ax
  844.         cmp    cx,7
  845.         jbe    continue_translate
  846.         mov    cx,7
  847. continue_translate:
  848.         mov    si, offset string
  849.         add    si,6            ; óßΓáó½∩Ѽ ß 12-⌐ »«º¿µ¿¿
  850. code_loop:
  851.         xor    ax,ax
  852.         mov    al, byte ptr es:[bx]    ; »«½πτ¿¼ íá⌐Γ
  853.         call    conv_to_hex        ; ºáΓѼ ó 16-α¿τ¡δ⌐ Σ«α¼áΓ
  854.         inc    bx
  855.         add    si,4            ; ΓÑ»Ñα∞ ß½ÑñπεΘ¿⌐ íá⌐Γ
  856.         loop    code_loop        ; ¿ Γá¬, »«¬á ¡Ñ ¬«¡τáΓß∩
  857.         xor    ax,ax
  858.         mov    al, byte ptr ds:[h_add]    ; »«½πτ¿¼ τ¿ß½« íá⌐Γ
  859.         cmp    ax,7
  860.         jbe    exit_translate
  861.         dec    si
  862.         mov    word ptr ds:[si], '>-'    ; óδσ«ñ ºá úαá¡¿µπ
  863. exit_translate:
  864.         pop    si
  865.         pop    cx
  866.         pop    bx
  867.         retn
  868.  
  869. translate    endp
  870.  
  871. ;                ***  ÅαÑ«íαẫóá¡¿Ñ íá⌐Γá ó ßΓ᫬π  ***
  872.  
  873. conv_to_hex    proc    near
  874.  
  875.         push    cx            ; ax = íá⌐Γ
  876.         push    dx            ; si = ß¼ÑΘÑ¡¿Ñ ¬«¡µá ßΓ᫬¿
  877.         push    di
  878.         mov    cx,2            ; »αÑ«íαáºπѼ 1 íá⌐Γ
  879.         mov    di,10h            ; »πΓѼ ñѽѡ¿∩ ¡á 16
  880. conv_loop:
  881.         xor    dx,dx            ; ß óδτ¿ß½Ñ¡¿Ñ¼ «ßΓáΓ¬á
  882.         div    di
  883.         cmp    dl,9            ; »«½πτ¿½¿ µ¿Σαπ ?
  884.         jbe    conv_cif        ; ñá ==> »αÑ⌐ñѼ
  885.         add    dl,7            ; ß¬«ααÑ¬Γ¿απѼ
  886. conv_cif:
  887.         add    dl,30h            ; ñ«íáó¿¼ ß¿¼ó«½ '¡π½∩'
  888.         mov    byte ptr ds:[si], dl    ; ß«σαá¡¿¼ ASCII - ¬«ñ
  889.         dec    si
  890.         loop    conv_loop        ; ¿ Γᬠñ« ¬«¡µá
  891.         pop    di
  892.         pop    dx
  893.         pop    cx
  894.         retn
  895.  
  896. conv_to_hex    endp
  897.  
  898. ;                    ***  éßΓáó¬á ¼áΦ¿¡¡«⌐ ¿¡ßΓαπ¬µ¿¿  ***
  899.  
  900. ins_instruct    proc    near
  901.  
  902.         push    di
  903.         mov    di, offset string
  904.         add    di,20            ; óδτ¿ß½¿¼ ß¼ÑΘÑ¡¿Ñ
  905.         cld                ; ßíα«ß¿¼ Σ½áú ¡á»αáó½Ñ¡¿∩
  906.         rep    movsb            ; »ÑαÑΦ½Ñ¼ íá⌐Γδ
  907.         pop    di
  908.         retn
  909.  
  910. ins_instruct    endp
  911.  
  912. ;                  ***  ö«α¼¿απѼ «»Ñαᵿε ß »á¼∩Γ∞ε  ***
  913.  
  914. form_memory    proc    near
  915.  
  916.         push    ax
  917.         mov    cl,6
  918.         clc
  919.         shr    al,cl            ; óδñѽ¿¼ ßΓáαΦπε τáßΓ∞
  920.         mov    cx,8
  921.         mul    cx            ; ßñѽáѼ ¬á¬ ßΓáαΦ¿Ñ í¿Γδ
  922.         pop    cx
  923.         and    cl,00000111b        ; óδñѽ¿¼ ¼½áñΦπε τáßΓ∞
  924.         add    ax,cx            ; »«½πτ¿¼ »«½¡«Ñ ß¼ÑΘÑ¡¿Ñ
  925.         cmp    byte ptr ds:[cpu_mode_2], 1
  926.         jz    without_sib
  927.         mov    si, offset mod_rm_length
  928.         add    si,ax            ; óδßΓáó¿¼ ß¼ÑΘÑ¡¿Ñ ¡á ñ½¿¡π
  929.         mov    cl, byte ptr ds:[si]    ; cx = ñ½¿¡á mod r/m ßΓ᫬¿
  930.         shl    ax,1            ; »αÑ«íαáºπѼ ñ½∩ ß½«ó
  931.         mov    si, offset mod_rm_offset
  932.         add    si,ax            ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ¡á ß¼ÑΘÑ¡¿Ñ
  933.         mov    ax, word ptr ds:[si]
  934.         mov    si, offset mod_rm_symbol
  935.         add    si,ax            ; ΓÑ»Ñα∞ ß¼ÑΘÑ¡¿Ñ ¡á ß¿¼ó«½
  936.         retn
  937.  
  938. without_sib:
  939.         cmp    cl,4
  940.         jz    form_sib_present
  941.         mov    si, offset mod_386_length
  942.         add    si,ax            ; óδßΓáó¿¼ ß¼ÑΘÑ¡¿Ñ ¡á ñ½¿¡π
  943.         mov    cl, byte ptr ds:[si]    ; cx = ñ½¿¡á mod r/m ßΓ᫬¿
  944.         shl    ax,1            ; »αÑ«íαáºπѼ ñ½∩ ß½«ó
  945.         mov    si, offset mod_386_offset
  946.         add    si,ax            ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ¡á ß¼ÑΘÑ¡¿Ñ
  947.         mov    ax, word ptr ds:[si]
  948.         mov    si, offset mod_386_symbol
  949.         add    si,ax            ; ΓÑ»Ñα∞ ß¼ÑΘÑ¡¿Ñ ¡á ß¿¼ó«½
  950.         retn
  951.  
  952. form_sib_present:
  953.         mov    al, byte ptr es:[bx+1]
  954.         mov    cl,6
  955.         clc
  956.         shr    al,cl            ; óδñѽ¿¼ ßΓáαΦπε τáßΓ∞
  957.         mov    cx,8
  958.         mul    cx            ; ßñѽáѼ ¬á¬ ßΓáαΦ¿Ñ í¿Γδ
  959.         xor    cx,cx
  960.         mov    cl, byte ptr es:[bx+2]
  961.         and    cl,00000111b        ; óδñѽ¿¼ ¼½áñΦπε τáßΓ∞
  962.         add    ax,cx            ; »«½πτ¿¼ »«½¡«Ñ ß¼ÑΘÑ¡¿Ñ
  963.         mov    si, offset mod_sib_length
  964.         add    si,ax            ; óδßΓáó¿¼ ß¼ÑΘÑ¡¿Ñ ¡á ñ½¿¡π
  965.         mov    cl, byte ptr ds:[si]    ; cx = ñ½¿¡á mod r/m ßΓ᫬¿
  966.         shl    ax,1            ; »αÑ«íαáºπѼ ñ½∩ ß½«ó
  967.         mov    si, offset mod_sib_offset
  968.         add    si,ax            ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ¡á ß¼ÑΘÑ¡¿Ñ
  969.         mov    ax, word ptr ds:[si]
  970.         mov    si, offset mod_sib_symbol
  971.         add    si,ax            ; ΓÑ»Ñα∞ ß¼ÑΘÑ¡¿Ñ ¡á ß¿¼ó«½
  972.         retn
  973.  
  974. form_memory    endp
  975.  
  976. ;                    ***  éßΓáó¬á «»Ñαᵿ⌐ ß »á¼∩Γ∞ε  ***
  977.  
  978. ins_mem_reg    proc    near
  979.  
  980.         push    es
  981.         push    cx
  982.         push    si
  983.         xor    ax,ax
  984.         mov    al, byte ptr es:[bx]
  985.         mov    si, offset system_table
  986.         add    si,ax
  987.         mov    al, byte ptr ds:[si]
  988.         and    al,20h
  989.         push    cs
  990.         pop    es
  991.         add    di, offset string    ; Σ«α¼¿απѼ »«º¿µ¿ε óδó«ñá
  992.         cmp    byte ptr ds:[cpu_mode_2], 1
  993.         jz    d32_detect
  994.         cmp    byte ptr ds:[byte_word], 3
  995.         jz    this_dword
  996.         cmp    byte ptr ds:[byte_word], 2    ; «»Ñαᵿ∩ ß½«óἿ ?
  997.         jz    this_word            ; ñαπú«Ñ ß¼ÑΘÑ¡¿Ñ
  998.         mov    si, offset byte_poz        ; «»Ñα¿απѼ ß íá⌐ΓἿ
  999.         jmp    short  b_w_insert
  1000. this_dword:
  1001.         mov    si, offset dword_poz
  1002.         cmp    al,20h
  1003.         jz    d32_detect
  1004.         mov    cx,9
  1005.         cld
  1006.         rep    movsb            ; »ÑαÑß佬á 'dword ptr'
  1007.         jmp    short  after_detect
  1008. this_word:
  1009.         mov    si, offset word_poz    ; «»Ñα¿απѼ ß« ß½«óἿ
  1010. b_w_insert:
  1011.         cmp    al,20h
  1012.         jz    d32_detect
  1013.         mov    cx,8            ; »ÑαÑß佬á 8 íá⌐Γ ß««íΘÑ¡¿∩
  1014.         cld                ; ßíα«ß Σ½áúá ¡á»αáó½Ñ¡¿∩
  1015.         rep    movsb            ; »ÑαÑß佬á byte/word
  1016. after_detect:
  1017.         inc    di
  1018. d32_detect:
  1019.         pop    si
  1020.         pop    cx
  1021.         mov    dx,di            ; ß«σαá¡¿¼ »«º¿µ¿ε »ÑαÑß佬¿
  1022.         cld                ; ßíα«ß Σ½áúá ¡á»αáó½Ñ¡¿∩
  1023.         rep    movsb            ; »ÑαÑßδ½¬á «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  1024.         cmp    word ptr ds:[new_segment], 0000h
  1025.         jz    leave_segm_alone    ; ßÑú¼Ñ¡Γ ¡Ñ ¬«ααÑ¬Γ¿απѼ
  1026.         mov    ax, word ptr ds:[new_segment]
  1027.         mov    si, offset segment_regist
  1028.         add    si,ax            ; »«½πτ¿½¿ ß¼ÑΘÑ¡¿Ñ ¡á óσ«ñ
  1029.         push    cs
  1030.         pop    es
  1031.         xchg    dx,di            ; Σ«α¼¿απѼ ß¼ÑΘÑ¡¿Ñ ¡á óδσ«ñ
  1032.         movsb                ; »ÑαÑß佬á
  1033.         dec    di
  1034.         xchg    dx,di
  1035. leave_segm_alone:
  1036.         cmp    byte ptr ds:[yes_sib], 1
  1037.         jnz    no_386_index
  1038.         pop    es
  1039.         push    es
  1040.         xor    ax,ax
  1041.         mov    al, byte ptr es:[bx+2]
  1042.         push    ax
  1043.         and    al,00111000b
  1044.         mov    cl,3
  1045.         clc
  1046.         shr    al,cl
  1047.         cmp    al,4
  1048.         jz    no_index_reg
  1049.         mov    cx,3
  1050.         push    dx
  1051.         mul    cx
  1052.         pop    dx
  1053.         mov    si, offset com_386_regist
  1054.         add    si,ax
  1055.         xchg    dx,di
  1056.         add    di,4
  1057.         push    cs
  1058.         pop    es
  1059.         mov    cx,3
  1060.         cld
  1061.         rep    movsb
  1062.         sub    di,7
  1063.         xchg    dx,di
  1064.         jmp    short    f_mul
  1065. no_index_reg:
  1066.         xchg    dx,di
  1067.         add    di,4
  1068.         mov    word ptr ds:[di], '00'
  1069.         mov    byte ptr ds:[di+2], 'h'
  1070.         sub    di,4
  1071.         xchg    dx,di
  1072. f_mul:
  1073.         pop    ax
  1074.         and    al,11000000b
  1075.         mov    cl,6
  1076.         clc
  1077.         shr    al,cl
  1078.         xchg    al,cl
  1079.         mov    ax,1
  1080.         clc
  1081.         shl    al,cl
  1082.         add    al,30h
  1083.         xchg    dx,di
  1084.         add    di,8
  1085.         mov    byte ptr ds:[di], al
  1086.         sub    di,8
  1087.         xchg    dx,di
  1088. no_386_index:
  1089.         pop    es
  1090.         retn
  1091.  
  1092. ins_mem_reg    endp
  1093.  
  1094. ;                        ***  éδí«α¬á ß¼ÑΘÑ¡¿⌐  ***
  1095.  
  1096. plus_offset    proc    near
  1097.  
  1098.         cmp    byte ptr ds:[off_code], 0    ; óδí¿αáΓ∞ ¡ÑτÑú« ?
  1099.         jz    not_take_offset            ; ¡Ñ ¡áñ« ==> ¡Ñ íπñѼ
  1100.         mov    si,di
  1101.         sub    si,3            ; óδí¿αáΓ∞ ßεñá
  1102.         cmp    byte ptr ds:[off_code], 4
  1103.         jz    take_offset_dword
  1104.         cmp    byte ptr ds:[off_code], 2
  1105.         jz    take_offset_word
  1106.         xor    ax,ax
  1107.         mov    al, byte ptr es:[bx+2]    ; óδíÑαѼ »Ñαóδ⌐ íá⌐Γ
  1108.         cmp    byte ptr ds:[yes_sib], 0
  1109.         jz    no_@_sib_corr
  1110.         mov    al, byte ptr es:[bx+3]
  1111. no_@_sib_corr:
  1112.         cmp    byte ptr ds:[si-2], '+'
  1113.         jnz    no_convert
  1114.         test    al,80h
  1115.         jz    no_convert
  1116.         neg    al
  1117.         mov    byte ptr ds:[si-2], '-'
  1118. no_convert:
  1119.         call    conv_to_hex        ; »αÑ«íαáºπѼ ó ßΓ᫬π
  1120.         jmp    short  not_take_offset
  1121. take_offset_word:
  1122.         mov    ax, word ptr es:[bx+2]    ; óδíÑαѼ »Ñαóδ⌐ íá⌐Γ
  1123.         cmp    byte ptr ds:[yes_sib], 0
  1124.         jz    no_@@_sib_corr
  1125.         mov    ax, word ptr es:[bx+3]
  1126. no_@@_sib_corr:
  1127.         cmp    byte ptr ds:[si-4], '+'
  1128.         jnz    no_convertw
  1129.         test    ax,8000h
  1130.         jz    no_convertw
  1131.         neg    ax
  1132.         mov    byte ptr ds:[si-4], '-'
  1133. no_convertw:
  1134.         push    ax
  1135.         xor    ah,ah
  1136.         call    conv_to_hex
  1137.         pop    ax
  1138.         xchg    ah,al
  1139.         xor    ah,ah
  1140.         call    conv_to_hex
  1141. not_take_offset:
  1142.         retn
  1143. take_offset_dword:
  1144.         cmp    byte ptr ds:[yes_sib], 1
  1145.         jz    take_offset_plus
  1146.         mov    ax, word ptr es:[bx+2]    ; óδíÑαѼ »Ñαóδ⌐ íá⌐Γ
  1147.         push    ax
  1148.         xor    ah,ah
  1149.         call    conv_to_hex
  1150.         pop    ax
  1151.         xchg    ah,al
  1152.         xor    ah,ah
  1153.         call    conv_to_hex
  1154.         mov    ax, word ptr es:[bx+4]    ; óδíÑαѼ óΓ«α«⌐ íá⌐Γ
  1155.         push    ax
  1156.         xor    ah,ah
  1157.         call    conv_to_hex
  1158.         pop    ax
  1159.         xchg    ah,al
  1160.         xor    ah,ah
  1161.         call    conv_to_hex
  1162.         jmp    short    not_take_offset
  1163. take_offset_plus:
  1164.         mov    byte ptr ds:[yes_sib], 0
  1165.         inc    byte ptr ds:[off_code]
  1166.         mov    ax, word ptr es:[bx+3]    ; óδíÑαѼ »Ñαóδ⌐ íá⌐Γ
  1167.         push    ax
  1168.         xor    ah,ah
  1169.         call    conv_to_hex
  1170.         pop    ax
  1171.         xchg    ah,al
  1172.         xor    ah,ah
  1173.         call    conv_to_hex
  1174.         mov    ax, word ptr es:[bx+5]    ; óδíÑαѼ óΓ«α«⌐ íá⌐Γ
  1175.         push    ax
  1176.         xor    ah,ah
  1177.         call    conv_to_hex
  1178.         pop    ax
  1179.         xchg    ah,al
  1180.         xor    ah,ah
  1181.         call    conv_to_hex
  1182.         jmp    short    not_take_offset
  1183.  
  1184. plus_offset    endp
  1185.  
  1186. ;          ***  ö«α¼¿απѼ «»Ñαᵿε ß αÑú¿ßΓαἿ - ¿ßΓ«τ¡¿¬á¼¿  ***
  1187.  
  1188. form_register    proc    near
  1189.  
  1190.         push    ax
  1191.         push    si
  1192.         cmp    byte ptr ds:[cpu_mode_1], 1
  1193.         jz    expand_regist
  1194.         xor    ax,ax
  1195.         mov    al, byte ptr es:[bx+1]    ; »«½πτ¿¼ óΓ«α«⌐ íá⌐Γ
  1196.         and    al,00111000b        ; óδñѽ¿¼ óΓ«α«⌐ «»Ñαá¡ñ
  1197.         clc                ; ßíα«ß¿¼ carry - Σ½áú
  1198.         shr    ax,1
  1199.         shr    ax,1
  1200.         cmp    byte ptr ds:[byte_word], 1    ; «»Ñαᵿ∩ ß íá⌐ΓἿ ?
  1201.         jz    ok_byte            ; ñá ==> »ÑαÑ⌐ñѼ
  1202.         add    ax,16            ; ß¬«ααÑ¬Γ¿απѼ
  1203. ok_byte:
  1204.         mov    si, offset command_regist
  1205.         add    si,ax            ; ß¼ÑΘÑ¡¿Ñ ¡á óΓ«α«⌐ «»Ñαá¡ñ
  1206.         push    es
  1207.         push    cs
  1208.         pop    es
  1209.         cld                ; ßíα«ß¿¼ Σ½áú ¡á»αáó½Ñ¡¿∩
  1210.         movsw                ; »ÑαÑΦ½Ñ¼
  1211.         pop    es
  1212.         pop    si
  1213.         pop    ax
  1214.         retn
  1215.  
  1216. expand_regist:
  1217.         xor    ax,ax
  1218.         mov    al, byte ptr es:[bx+1]    ; »«½πτ¿¼ óΓ«α«⌐ íá⌐Γ
  1219.         and    al,00111000b        ; óδñѽ¿¼ óΓ«α«⌐ «»Ñαá¡ñ
  1220.         clc                ; ßíα«ß¿¼ carry - Σ½áú
  1221.         shr    ax,1
  1222.         shr    ax,1
  1223.         shr    ax,1
  1224.         push    cx
  1225.         mov    cx,3
  1226.         mul    cx
  1227.         mov    si, offset com_386_regist
  1228.         add    si,ax            ; ß¼ÑΘÑ¡¿Ñ ¡á óΓ«α«⌐ «»Ñαá¡ñ
  1229.         push    es
  1230.         push    cs
  1231.         pop    es
  1232.         mov    cx,3
  1233.         cld                ; ßíα«ß¿¼ Σ½áú ¡á»αáó½Ñ¡¿∩
  1234.         rep    movsb            ; »ÑαÑΦ½Ñ¼
  1235.         pop    es
  1236.         pop    cx
  1237.         pop    si
  1238.         pop    ax
  1239.         retn
  1240.  
  1241. form_register    endp
  1242.  
  1243. ;                  ***  éßΓáó¬á αÑú¿ßΓαá - »α¿Ñ¼¡¿¬á  ***
  1244.  
  1245. reg_addition    proc    near
  1246.  
  1247.         mov    di,27
  1248.         call    insert_register        ; ºá»¿ß∞ »Ñαó«ú« αÑú¿ßΓαá
  1249.         mov    byte ptr ds:[di], 2ch    ; ','
  1250.         inc    di            ; ¡«óδ⌐ áñαÑß ñ½∩ óδó«ñá
  1251.         retn
  1252.  
  1253. reg_addition    endp
  1254.  
  1255. ;                 ***  éßΓáó¬á αÑú¿ßΓαá - »α¿Ñ¼¡¿¬á  ***
  1256.  
  1257. insert_register    proc    near
  1258.  
  1259.         push    ax
  1260.         push    si
  1261.         add    di, offset string
  1262.         xor    ax,ax
  1263.         mov    al, byte ptr es:[bx+1]    ; óδíÑαѼ íá⌐Γ
  1264.         and    al,00000111b        ; óδñѽ¿¼ »Ñαóδ⌐ «»Ñαá¡ñ
  1265.         cmp    byte ptr ds:[cpu_mode_2], 1
  1266.         jz    change_ins_d32
  1267.         clc
  1268.         shl    ax,1
  1269.         cmp    byte ptr ds:[byte_word], 1    ; αÑú¿ßΓα íá⌐Γ«óδ⌐ ?
  1270.         jz    ok_byte_reg            ; ñá ==> »ÑαÑ⌐ñѼ
  1271.         add    ax,16            ; ß¬«ααÑ¬Γ¿απѼ
  1272. ok_byte_reg:
  1273.         mov    si, offset command_regist
  1274.         add    si,ax            ; ß¼ÑΘÑ¡¿Ñ ¡á »Ñαóδ⌐ «»Ñαá¡ñ
  1275.         push    es
  1276.         push    cs
  1277.         pop    es
  1278.         cld                ; ßíα«ß Σ½áúá ¡á»αáó½Ñ¡¿∩
  1279.         movsw                ; »ÑαÑß佬á
  1280.         pop    es
  1281.         pop    si
  1282.         pop    ax
  1283.         retn
  1284.  
  1285. change_ins_d32:
  1286.         push    cx
  1287.         mov    cx,3
  1288.         mul    cx
  1289.         mov    si, offset com_386_regist
  1290.         add    si,ax            ; ß¼ÑΘÑ¡¿Ñ ¡á »Ñαóδ⌐ «»Ñαá¡ñ
  1291.         push    es
  1292.         push    cs
  1293.         pop    es
  1294.         mov    cx,3
  1295.         cld                ; ßíα«ß Σ½áúá ¡á»αáó½Ñ¡¿∩
  1296.         rep    movsb            ; »ÑαÑß佬á
  1297.         pop    es
  1298.         pop    cx
  1299.         pop    si
  1300.         pop    ax
  1301.         retn
  1302.  
  1303. insert_register    endp
  1304.  
  1305. ;             ***  Äíαáí«Γ¬á Γ¿»«ó  R8 / Rm  ¿  R16 / Rm  ***
  1306.  
  1307. this_r8_r16_rm    proc    near
  1308.  
  1309.         call    operation_type
  1310.         jz    op_with_regis        ; ñá ==> «íαáí«ΓáѼ «Γñѽ∞¡«
  1311.         mov    di, offset string
  1312.         add    di,27            ; Σ«α¼¿απѼ áñαÑß ñ½∩ óδó«ñá
  1313.         call    form_register        ; ºá»¿ß∞ »Ñαó«ú« αÑú¿ßΓαá
  1314.         mov    byte ptr ds:[di], 2ch    ; ','
  1315.         sub    di, offset string
  1316.         inc    di
  1317.         call    memo_completed
  1318.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  1319. op_with_regis:
  1320.         call    write_mnemo        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  1321.         mov    di, offset string
  1322.         add    di,27            ; Σ«α¼¿απѼ áñαÑß ñ½∩ óδó«ñá
  1323.         call    form_register        ; ºá»¿ß∞ »Ñαó«ú« αÑú¿ßΓαá
  1324.         mov    byte ptr ds:[di], 2ch    ; ','
  1325.         sub    di, offset string
  1326.         inc    di
  1327.         call    insert_register        ; ºá»¿ß∞ óΓ«α«ú« αÑú¿ßΓαá
  1328.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  1329.  
  1330. this_r8_r16_rm    endp
  1331.  
  1332. ;                  ***  ÄΣ«α¼½Ñ¡¿Ñ «»Ñαᵿ⌐ ß »á¼∩Γ∞ε  ***
  1333.  
  1334. memo_completed    proc    near
  1335.  
  1336.         call    memory_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  1337.         call    write_mnemo        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  1338.         call    form_memory        ; Σ«α¼¿απѼ «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  1339.         call    ins_mem_reg        ; óßΓáó¿¼ »Ñαóπε »«½«ó¿¡π
  1340.         call    plus_offset        ; ñ«íáó¿¼ ß¼ÑΘÑ¡¿∩
  1341.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  1342.  
  1343. memo_completed    endp
  1344.  
  1345. ;               ***  Äíαáí«Γ¬á Γ¿»«ó AL,i8 ¿ AX,i16  ***
  1346.  
  1347. ali8_axi16    proc    near
  1348.  
  1349.         push    cx
  1350.         push    si
  1351.         push    di
  1352.         call    byte_or_word        ; «»αÑñѽ¿¼ Γ¿» «»Ñαᵿ¿
  1353.         call    write_al_ax        ; óßΓáó¬á αÑú¿ßΓαá ¿ ºá»∩Γ«⌐
  1354.         mov    si,di
  1355.         xor    ax,ax
  1356.         mov    al, byte ptr es:[bx+1]        ; óδíÑαѼ »Ñαóδ⌐ íá⌐Γ
  1357.         cmp    byte ptr ds:[cpu_mode_2], 1
  1358.         jnz    write_byte_or_word
  1359.         add    si,7
  1360.         call    conv_to_hex        ; »αÑ«íαáºπѼ
  1361.         inc    byte ptr ds:[h_add]    ; »½εß íá⌐Γ
  1362.         xor    ax,ax
  1363.         mov    al,byte ptr es:[bx+2]    ; óδíÑαѼ óΓ«α«⌐ íá⌐Γ
  1364.         call    conv_to_hex        ; »αÑ«íαáºπѼ
  1365.         inc    byte ptr ds:[h_add]    ; »½εß íá⌐Γ
  1366.         xor    ax,ax
  1367.         mov    al,byte ptr es:[bx+3]    ; óδíÑαѼ ΓαÑΓ¿⌐ íá⌐Γ
  1368.         call    conv_to_hex        ; »αÑ«íαáºπѼ
  1369.         inc    byte ptr ds:[h_add]    ; »½εß íá⌐Γ
  1370.         xor    ax,ax
  1371.         mov    al,byte ptr es:[bx+4]    ; óδíÑαѼ τÑΓóÑαΓδ⌐ íá⌐Γ
  1372.         call    conv_to_hex        ; »αÑ«íαáºπѼ
  1373.         add    si,9
  1374.         jmp    short    quit_al_ax
  1375. write_byte_or_word:
  1376.         cmp    byte ptr ds:[byte_word], 2    ; óδí¿αáΓ∞ ß½«ó« ?
  1377.         jz    take_word            ; ñá ==> óδíÑαѼ
  1378.         inc    si
  1379.         call    conv_to_hex        ; »αÑ«íαáºπѼ
  1380.         add    si,3
  1381.         jmp    short  quit_al_ax
  1382. take_word:
  1383.         add    si,3
  1384.         call    conv_to_hex        ; »αÑ«íαáºπѼ
  1385.         inc    byte ptr ds:[h_add]    ; »½εß íá⌐Γ
  1386.         xor    ax,ax
  1387.         mov    al,byte ptr es:[bx+2]    ; óδíÑαѼ óΓ«α«⌐ íá⌐Γ
  1388.         call    conv_to_hex        ; »αÑ«íαáºπѼ
  1389.         add    si,5
  1390. quit_al_ax:
  1391.         mov    byte ptr ds:[si],68h    ; 'h'
  1392.         pop    di
  1393.         pop    si
  1394.         pop    cx
  1395.         call    write_mnemo        ; óδó«ñ ¼¡Ñ¼«¬«¼á¡ñδ
  1396.         retn
  1397.  
  1398. ali8_axi16    endp
  1399.  
  1400. ;                       ***  éßΓáó¬á AL ¿½¿ AX  ***
  1401.  
  1402. write_al_ax    proc    near
  1403.  
  1404.         cmp    byte ptr ds:[cpu_mode_1], 1
  1405.         jz    write_eax
  1406.         xor    ax,ax
  1407.         cmp    byte ptr ds:[byte_word], 1    ; «»Ñαᵿ∩ ß íá⌐ΓἿ ?
  1408.         jz    al_byte                ; ñá ==> »ÑαÑ⌐ñѼ
  1409.         add    ax,16                ; ß¬«ααÑ¬Γ¿απѼ
  1410. al_byte:
  1411.         mov    si, offset command_regist
  1412.         add    si,ax            ; ß¼ÑΘÑ¡¿Ñ ¡á óΓ«α«⌐ «»Ñαá¡ñ
  1413.         mov    di, offset string
  1414.         add    di,27            ; ß¼ÑΘÑ¡¿Ñ ñ½∩ óδó«ñá
  1415.         push    es
  1416.         push    cs
  1417.         pop    es
  1418.         cld                ; ßíα«ß¿¼ Σ½áú ¡á»αáó½Ñ¡¿∩
  1419.         movsw                ; »ÑαÑΦ½Ñ¼
  1420. exit_write_al_ax:
  1421.         pop    es
  1422.         mov    byte ptr ds:[di], 2ch    ; ','
  1423.         inc    di
  1424.         retn
  1425.  
  1426. write_eax:
  1427.         mov    si, offset com_386_regist
  1428.         mov    di, offset string
  1429.         add    di,27            ; ß¼ÑΘÑ¡¿Ñ ñ½∩ óδó«ñá
  1430.         push    es
  1431.         push    cx
  1432.         push    cs
  1433.         pop    es
  1434.         mov    cx,3
  1435.         cld                ; ßíα«ß¿¼ Σ½áú ¡á»αáó½Ñ¡¿∩
  1436.         rep    movsb            ; »ÑαÑΦ½Ñ¼
  1437.         pop    cx
  1438.         jmp    short    exit_write_al_ax
  1439.  
  1440. write_al_ax    endp
  1441.  
  1442. ;               ***  Ä»Ñαᵿ¿ Γ¿»á PUSH / POP αÑú¿ßΓα  ***
  1443.  
  1444. push_pop_oper    proc    near
  1445.  
  1446.         push    dx
  1447.         call    write_mnemo        ; óδó«ñ ¼¡Ñ¼«¬«¼á¡ñδ
  1448.         pop    dx
  1449.         cmp    dx,2
  1450.         jz    push_pop_d32
  1451.         cmp    dx,1
  1452.         jz    push_pop_segreg
  1453.         mov    si, offset command_regist
  1454.         add    si,ax
  1455. add_register:
  1456.         mov    di, offset string
  1457.         add    di,27            ; Σ«α¼¿απѼ óδó«ñ
  1458.         push    es
  1459.         push    cs
  1460.         pop    es
  1461.         cld                ; ßíα«ß Σ½áúá ¡á»αáó½Ñ¡¿∩
  1462.         movsw                ; »ÑαÑß佬á
  1463.         pop    es
  1464.         retn
  1465.  
  1466. push_pop_segreg:
  1467.         mov    si, offset segment_regist
  1468.         add    si,ax
  1469.         jmp    short    add_register
  1470.  
  1471. push_pop_d32:
  1472.         mov    si, offset com_386_regist
  1473.         add    si,ax
  1474.         mov    di, offset string
  1475.         add    di,27            ; Σ«α¼¿απѼ óδó«ñ
  1476.         push    es
  1477.         push    cs
  1478.         pop    es
  1479.         mov    cx,3
  1480.         cld                ; ßíα«ß Σ½áúá ¡á»αáó½Ñ¡¿∩
  1481.         rep    movsb            ; »ÑαÑß佬á
  1482.         pop    es
  1483.         retn
  1484.  
  1485. push_pop_oper    endp
  1486.  
  1487. ;                 ***  çñÑß∞ «íαáíáΓδóáÑΓß∩ ¬«¼á¡ñá DB  ***
  1488.  
  1489. this_db        proc    near
  1490.  
  1491.         call    write_mnemo        ; óδó«ñ¿¼ ¼¡Ñ¼«¡¿¬π ¬«¼á¡ñδ
  1492.         xor    ax,ax
  1493.         mov    al, byte ptr es:[bx]    ; óδí¿αáѼ íá⌐Γ
  1494.         mov    si, offset string
  1495.         add    si,29            ; Σ«α¼¿απѼ ß¼ÑΘÑ¡¿Ñ
  1496.         mov    byte ptr ds:[si], 68h    ; ñ«»¿ßδóáѼ 'h'
  1497.         dec    si
  1498.         call    conv_to_hex        ; »αÑ«íαẫóδóáѼ ó ßΓ᫬π
  1499.         retn        
  1500.  
  1501. this_db        endp
  1502.  
  1503. ;                 *** è«½¿τÑßΓó« íá⌐Γ ñ½∩  push i16/i32 ***
  1504.  
  1505. count_detect    proc    near
  1506.  
  1507.         add    byte ptr ds:[h_add], 2
  1508.         cmp    byte ptr ds:[cpu_mode_1], 0
  1509.         jz    exit_detect_count
  1510.         add    byte ptr ds:[h_add], 2
  1511. exit_detect_count:
  1512.         retn
  1513.  
  1514. count_detect    endp
  1515.  
  1516. ;                  *** éδó«ñ íá⌐Γ«ó ñ½∩  push i16/i32 ***
  1517.  
  1518. insert_number    proc    near
  1519.  
  1520.         cmp    byte ptr ds:[cpu_mode_1], 1
  1521.         jz    push_offset_dword
  1522.         add    si,3
  1523.         mov    ax, word ptr es:[bx+1]    ; óδíÑαѼ »Ñαóδ⌐ íá⌐Γ
  1524.         push    ax
  1525.         xor    ah,ah
  1526.         call    conv_to_hex
  1527.         pop    ax
  1528.         xchg    ah,al
  1529.         xor    ah,ah
  1530.         call    conv_to_hex
  1531.         add    si,5
  1532.         mov    byte ptr ds:[si], 'h'
  1533.         retn
  1534. push_offset_dword:
  1535.         add    si,7
  1536.         mov    ax, word ptr es:[bx+1]    ; óδíÑαѼ »Ñαóδ⌐ íá⌐Γ
  1537.         push    ax
  1538.         xor    ah,ah
  1539.         call    conv_to_hex
  1540.         pop    ax
  1541.         xchg    ah,al
  1542.         xor    ah,ah
  1543.         call    conv_to_hex
  1544.         mov    ax, word ptr es:[bx+3]    ; óδíÑαѼ óΓ«α«⌐ íá⌐Γ
  1545.         push    ax
  1546.         xor    ah,ah
  1547.         call    conv_to_hex
  1548.         pop    ax
  1549.         xchg    ah,al
  1550.         xor    ah,ah
  1551.         call    conv_to_hex
  1552.         add    si,9
  1553.         mov    byte ptr ds:[si], 'h'
  1554.         retn
  1555.  
  1556. insert_number    endp
  1557.  
  1558. ;                      *** éδó«ñ íá⌐Γá ñ½∩  push i8 ***
  1559.  
  1560. insert_byte_num    proc    near
  1561.  
  1562.         inc    si
  1563.         xor    ax,ax
  1564.         mov    al, byte ptr es:[bx+1]    ; óδíÑαѼ »Ñαóδ⌐ íá⌐Γ
  1565.         call    conv_to_hex
  1566.         add    si,3
  1567.         mov    byte ptr ds:[si], 'h'
  1568.         retn
  1569.  
  1570. insert_byte_num    endp
  1571.  
  1572. ;                   ***  ö«α¼¿α«óá¡¿Ñ ΓѬπΘÑú« áñαÑßá  ***
  1573.  
  1574. form_curr_adr    proc    near
  1575.  
  1576.         push    es
  1577.         push    cs
  1578.         pop    es
  1579.         mov    si, offset adress    ; »α«ßΓ« ß¡¿¼áѼ ¬«»¿ε
  1580.         mov    di, offset cur_adress    ; ΓѬπΘÑú« áñαÑßá ñ½∩
  1581.         mov    cx,4            ; ñá½∞¡Ñ⌐ΦÑ⌐ Ñú« «íαáí«Γ¬¿
  1582.         cld
  1583.         rep    movsb
  1584.         pop    es
  1585.         retn
  1586.  
  1587. form_curr_adr    endp
  1588.  
  1589. ;                   ***  ö«α¼¿α«óá¡¿Ñ ¡«ó«ú« áñαÑßá  ***
  1590.  
  1591. form_new_adr    proc    near
  1592.  
  1593.         push    ax
  1594.         push    ax
  1595.         push    dx
  1596.         cmp    byte ptr ds:[cpu_mode_1], 0
  1597.         jz    no_d32_1_jmp
  1598.         mov    ax,1
  1599.         call    convert_offset
  1600.         call    plus_byte_word
  1601. no_d32_1_jmp:
  1602.         cmp    byte ptr ds:[cpu_mode_2], 0
  1603.         jz    no_d32_2_jmp
  1604.         mov    ax,1
  1605.         call    convert_offset
  1606.         call    plus_byte_word
  1607. no_d32_2_jmp:
  1608.         pop    dx
  1609.         pop    ax
  1610.         cmp    dx,2            ; ñ½¿¡¡δ⌐ jmp ?
  1611.         jz    test_word        ; ñá ==> «íαáí«Γ¬á ß½«ó
  1612.         and    al,10000000b
  1613.         cmp    al,128            ; ßΓáαΦ¿⌐ í¿Γ πßΓá¡«ó½Ñ¡ ?
  1614.         pop    ax
  1615.         jz    mines_byte        ; ñá ==> »α䪫¬ "óóÑασ"
  1616.         jmp    short  plus_byte    ; ¿¡áτÑ ==> »α䪫¬ "󡿺"
  1617. test_word:
  1618.         and    ah,10000000b
  1619.         cmp    ah,128            ; á¡á½«ú¿τ¡á∩ »α«óÑα¬á,
  1620.         pop    ax            ; ¡« ñ½∩ ñ½¿¡¡«ú« jmp
  1621.         jz    mines_word
  1622.         jmp    short  plus_word
  1623. mines_byte:
  1624.         push    ax
  1625.         mov    si, offset off_string
  1626.         mov    word ptr ds:[si], 0000h    ; »α«¿ºó«ñ¿¼ ¬«ααѬµ¿ε ºá
  1627.         mov    word ptr ds:[si+2], 0100h ; ßτÑΓ ñ«íáó½Ñ¡¿∩ íá⌐Γá
  1628.         call    plus_byte_word        ; (óΓ«α«⌐ »«½πτ¿¼ ºá ßτÑΓ not)
  1629.         pop    ax
  1630.         not    ax
  1631.         xor    ah,ah
  1632.         call    convert_offset        ; »αÑ«íαáºπѼ Σ«α¼áΓδ
  1633.         call    minus_byte_word        ; »α䪫¬ "óóÑασ"
  1634.         retn
  1635. plus_byte:
  1636.         call    convert_offset
  1637.         call    plus_byte_word
  1638.         mov    si, offset off_string
  1639.         mov    word ptr ds:[si], 0000h    ; á¡á½«ú¿τ¡á∩ ¬«ααѬµ¿∩
  1640.         mov    word ptr ds:[si+2], 0200h
  1641.         call    plus_byte_word        ; »α䪫¬ "󡿺"
  1642.         retn
  1643. mines_word:
  1644.         push    ax
  1645.         mov    si, offset off_string
  1646.         mov    word ptr ds:[si], 0000h    ; ¬«ααѬµ¿∩ ñ½∩ ß½«ó
  1647.         mov    word ptr ds:[si+2], 0200h
  1648.         call    plus_byte_word
  1649.         pop    ax
  1650.         not    ax
  1651.         call    convert_offset        ; »αÑ«íαáºπѼ Σ«α¼áΓδ
  1652.         call    minus_byte_word        ; »α䪫¬ "óóÑασ"
  1653.         retn
  1654. plus_word:
  1655.         call    convert_offset        ; »αÑ«íαáºπѼ Σ«α¼áΓδ
  1656.         call    plus_byte_word
  1657.         mov    si, offset off_string
  1658.         mov    word ptr ds:[si], 0000h
  1659.         mov    word ptr ds:[si+2], 0300h
  1660.         call    plus_byte_word        ; »α䪫¬ "󡿺"
  1661.         retn
  1662.  
  1663. form_new_adr    endp
  1664.  
  1665. ;                  ***  éδó«ñ ßΣ«α¼¿α«óá¡¡«ú« áñαÑßá  ***
  1666.  
  1667. write_adress    proc    near
  1668.  
  1669.         mov    cx,4            ; »αÑ«íαáºπѼ 8 íá⌐Γ
  1670.         mov    si, offset cur_adress    ; «Γßεñá íÑαѼ,
  1671.         mov    di, offset string    ; á ßεñᠺᡫ߿¼
  1672.         add    di,27
  1673. str_adr_loop:
  1674.         mov    al, byte ptr ds:[si]    ; íá⌐Γ áñαÑßá
  1675.         cmp    al,9            ; φΓ« µ¿Σαá ?
  1676.         jbe    adr_cifra        ; ñá ==> »ÑαÑ⌐ñѼ
  1677.         add    al,7            ; ß¬«ααÑ¬Γ¿απѼ 
  1678. adr_cifra:
  1679.         add    al,30h            ; ñ«íáó¿¼ ß¿¼ó«½ ¡π½∩
  1680.         mov    byte ptr ds:[di], al    ; »«½πτ¿¼ ASCII - ¬«ñ
  1681.         inc    si
  1682.         inc    di
  1683.         loop    str_adr_loop        ; ¿ Γᬠñ« ¬«¡µá
  1684.         retn
  1685.  
  1686. write_adress    endp
  1687.  
  1688. ;                 ***  ä«íáó½Ñ¡¿Ñ ¬ áñαÑßπ íá⌐Γá/ß½«óá  ***
  1689.  
  1690. plus_byte_word    proc    near
  1691.  
  1692.         mov    si, offset cur_adress
  1693.         add    si,3            ; ¼½áñΦ¿⌐ αáºα∩ñ áñαÑßá
  1694.         mov    di, offset off_string
  1695.         add    di,3            ; ¼½áñΦ¿⌐ αáºα∩ñ ß½áúáѼ«ú«
  1696.         xor    ax,ax
  1697. raz_adr_loop:
  1698.         mov    al, byte ptr ds:[di]    ; óΓ«α«Ñ ß½áúáѼ«Ñ
  1699.         add    byte ptr ds:[si], al    ; ß½«ª¿¼
  1700.         add    byte ptr ds:[si], ah    ; ¿ «Γ¬«ααÑ¬Γ¿απѼ
  1701.         cmp    byte ptr ds:[si], 0fh    ; »ÑαÑ»«½¡Ñ¡¿Ñ ?
  1702.         jbe    plus_razr_corr        ; ¡ÑΓ ==> íѺ ¬«ααѬµ¿¿
  1703.         mov    ah,1            ; íδ½ »ÑαÑ¡«ß
  1704.         sub    byte ptr ds:[si], 10h    ; ¬«ααѬµ¿∩ ¼½áñΦÑú« αáºα∩ñá
  1705.         dec    si            ; «Γ¬«ααÑ¬Γ¿απѼ ßΓáαΦ¿⌐
  1706.         dec    di
  1707.         cmp    di, (offset off_string - 1) ; ß½áúáѼ«Ñ ¬«¡τ¿½«ß∞ ?
  1708.         jbe    ex_off_add
  1709.         jmp    short  raz_adr_loop    ; ¿ Γᬠñ« ¬«¡µá
  1710. ex_off_add:
  1711.         inc    di
  1712.         mov    byte ptr ds:[di], 0    ; Γ«½∞¬« ¬«ααÑ¬Γ¿απѼ
  1713.         cmp    si, (offset cur_adress - 1)
  1714.         jbe    exit_off        ; »«¬á óßÑ ¡Ñ «Γ¬«ααÑ¬Γ¿απѼ
  1715.         jmp    short  raz_adr_loop
  1716. plus_razr_corr:
  1717.         dec    si
  1718.         dec    di            ; ß½«ªÑ¡¿Ñ íѺ ¬«ααѬµ¿¿
  1719.         xor    ah,ah
  1720.         cmp    di, (offset off_string - 1)    ; «íαáí«Γ¬á óδσ«ñá
  1721.         jbe    exit_off
  1722.         jmp    short  raz_adr_loop
  1723. exit_off:
  1724.         retn
  1725.  
  1726. plus_byte_word    endp
  1727.  
  1728. ;                 ***  éδτ¿Γá¡¿Ñ ¿º áñαÑßá íá⌐Γá/ß½«óá  ***
  1729.  
  1730. minus_byte_word    proc    near
  1731.  
  1732.         mov    si, offset cur_adress
  1733.         add    si,3            ; ¼½áñΦ¿⌐ αáºα∩ñ áñαÑßá
  1734.         mov    di, offset off_string
  1735.         add    di,3            ; ¼½áñΦ¿⌐ αáºα∩ñ óδτ¿ΓáѼ«ú«
  1736.         xor    ax,ax
  1737. razr_adr_loop:
  1738.         mov    al, byte ptr ds:[di]    ; óδτ¿ΓáѼ«Ñ
  1739.         sub    byte ptr ds:[si], al    ; óδτ¿ΓáѼ
  1740.         sub    byte ptr ds:[si], ah    ; ¿ ¬«ααÑ¬Γ¿απѼ
  1741.         cmp    byte ptr ds:[si], 0fh    ; »ÑαÑ»«½¡Ñ¡¿Ñ ?
  1742.         jbe    minus_razr_corr        ; ¡ÑΓ ==> íѺ ¬«ααѬµ¿¿
  1743.         mov    ah,1            ; íδ½ ºáѼ
  1744.         and    byte ptr ds:[si], 00001111b    ; ßíα«ß ßΓáαΦ¿σ í¿Γ«ó
  1745.         dec    si
  1746.         dec    di
  1747.         cmp    di, (offset off_string - 1)    ; »α«óÑα¬á ¬«¡µá
  1748.         jbe    ex_of_sub
  1749.         jmp    short  razr_adr_loop    ; ¿ Γᬠñ« ¬«¡µá
  1750. ex_of_sub:
  1751.         inc    di
  1752.         mov    byte ptr ds:[di], 0        ; óδτ¿ΓáѼ«Ñ ¬«¡τ¿½«ß∞
  1753.         cmp    si, offset (offset cur_adress - 1)  ; »α«óÑα¬á óδσ«ñá
  1754.         jbe    exit_of
  1755.         jmp    short  razr_adr_loop
  1756. minus_razr_corr:
  1757.         dec    si
  1758.         dec    di            ; óδτ¿Γá¡¿Ñ íѺ ¬«ααѬµ¿¿
  1759.         xor    ah,ah            ; ß «Γ߽Ѫ¿ó᡿Ѽ óδσ«ñá
  1760.         cmp    di, (offset off_string - 1)
  1761.         jbe    exit_of
  1762.         jmp    short  razr_adr_loop
  1763. exit_of:
  1764.         retn
  1765.  
  1766. minus_byte_word    endp
  1767.  
  1768. ;                     ***  ÅαÑ«íαẫóá¡¿Ñ ß¼ÑΘÑ¡¿∩  ***
  1769.  
  1770. convert_offset    proc    near
  1771.  
  1772.         mov    si, offset off_string
  1773.         add    si,3
  1774.         mov    cx,4            ; »αÑ«íαáºπѼ 2 íá⌐Γá
  1775.         mov    di,10h            ; »πΓѼ ñѽѡ¿∩ ¡á 16
  1776. conv_adr_loop:
  1777.         xor    dx,dx            ; ß óδτ¿ß½Ñ¡¿Ñ¼ «ßΓáΓ¬á
  1778.         div    di
  1779.         mov    byte ptr ds:[si], dl    ; ß«σαá¡¿¼ τ¿ß½«
  1780.         dec    si
  1781.         loop    conv_adr_loop        ; ¿ Γᬠñ« ¬«¡µá
  1782.         retn
  1783.  
  1784. convert_offset    endp
  1785.  
  1786. ;      ***  Åα«¿ºó«ñ¿Γß∩ «íαáí«Γ¬á Γ¿»á  Rm <== segment register  ***
  1787.  
  1788. rm_seg_reg    proc    near
  1789.  
  1790.         call    operation_type
  1791.         jz    segm_into_reg        ; ñá ==> «íαáí«ΓáѼ «Γñѽ∞¡«
  1792.         call    memory_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  1793.         call    write_segm_into        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  1794.         jc    exit_segm_into        ; «íαáíáΓδóáÑΓß∩ ¬á¬ DB
  1795.         call    special_output
  1796.         call    form_segm_index        ; Σ«α¼¿απѼ º¡áτÑ¡¿Ñ
  1797. exit_segm_into:
  1798.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  1799. segm_into_reg:
  1800.         call    write_segm_into        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  1801.         call    reg_addition
  1802.         call    form_segm_index        ; ºá»¿ß∞ º¡áτÑ¡¿∩
  1803.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  1804.  
  1805. rm_seg_reg    endp
  1806.  
  1807. ;       ***  ÄΓñѽ∞¡δ⌐ óδó«ñ ñ½∩ «»Ñαᵿ⌐ Γ¿»á  Rm <== seg_reg  ***
  1808.  
  1809. write_segm_into    proc    near
  1810.  
  1811.         push    ax
  1812.         xor    ax,ax
  1813.         mov    al, byte ptr es:[bx+1]    ; al = íá⌐Γ ¬«ñá
  1814.         and    al,00111000b        ; óδñѽ¿¼ óΓ«α«⌐ «»Ñαá¡ñ
  1815.         clc                ; ßíα«ß¿¼ carry - Σ½áú
  1816.         mov    cl,3            ; »αÑ«íαẫóá¡¿Ñ Σ«α¼áΓ«ó
  1817.         shr    ax,cl
  1818.         cmp    ax,6
  1819.         jae    make_segm_like_db
  1820.         jmp    short  live_segm_alone
  1821. make_segm_like_db:
  1822.         mov    byte ptr ds:[h_add], 1    ; óßÑú« «ñ¿¡ íá⌐Γ
  1823.         pop    ax
  1824.         mov    cl,2
  1825.         mov    si, offset command_symbol
  1826.         add    si,268h            ; ¬«ñ DB
  1827.         stc
  1828.         pushf
  1829.         call    this_db            ; «íαáí«Γ¬á ¬á¬ DB
  1830.         jmp    short  mnemo_segment_write
  1831. live_segm_alone:
  1832.         pop    ax
  1833.         clc
  1834.         pushf
  1835.         call    write_mnemo        ; óδó«ñ¿¼ ¼¡Ñ¼«¬«¼á¡ñπ
  1836. mnemo_segment_write:
  1837.         popf
  1838.         retn
  1839.  
  1840. write_segm_into    endp
  1841.  
  1842. ;                 ***  Åα«µÑñπαá ñ½∩ ß»Ñµ¿á½∞¡«ú« óδó«ñá  ***
  1843.  
  1844. special_output    proc    near
  1845.  
  1846.         call    form_memory        ; Σ«α¼¿απѼ «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  1847.         mov    di,27            ; áñαÑß ñ½∩ óδó«ñá
  1848.         call    ins_mem_reg        ; óßΓáó¿¼ »Ñαóπε »«½«ó¿¡π
  1849.         call    plus_offset        ; ñ«íáó¿¼ ß¼ÑΘÑ¡¿∩
  1850.         mov    byte ptr ds:[di], 2ch    ; ','
  1851.         inc    di            ; ¡«óδ⌐ áñαÑß ñ½∩ óδó«ñá
  1852.         retn
  1853.  
  1854. special_output    endp
  1855.  
  1856. ;   ***  Åα«µÑñπαá ñ½∩ «»αÑñѽѡ¿∩ ¿ Σ«α¼¿α«óá¡¿∩ ßÑú¼Ñ¡Γ¡δσ αÑú¿ßΓα«ó  ***
  1857.  
  1858. form_segm_index    proc    near
  1859.  
  1860.         push    ax
  1861.         push    cx
  1862.         push    si
  1863.         xor    ax,ax
  1864.         mov    al, byte ptr es:[bx+1]    ; al = íá⌐Γ ¬«ñá
  1865.         and    al,00111000b        ; óδñѽ¿¼ óΓ«α«⌐ «»Ñαá¡ñ
  1866.         clc                ; ßíα«ß¿¼ carry - Σ½áú
  1867.         mov    cl,3            ; »αÑ«íαẫóá¡¿Ñ Σ«α¼áΓ«ó
  1868.         shr    ax,cl
  1869.         cmp    al,0
  1870.         jz    may_reg_es
  1871.         cmp    al,1
  1872.         jz    may_reg_cs        ; «»αÑñѽѡ¿Ñ ßÑú¼Ñ¡Γ¡«ú«
  1873.         cmp    al,2            ; αÑú¿ßΓαá
  1874.         jz    may_reg_ss
  1875.         cmp    al,3
  1876.         jz    may_reg_ds
  1877.         cmp    al,4
  1878.         jz    may_reg_fs
  1879.         mov    al,10
  1880.         jmp    short  now_make
  1881. may_reg_es:
  1882.         mov    al,6
  1883.         jmp    short  now_make
  1884. may_reg_cs:
  1885.         mov    al,2
  1886.         jmp    short  now_make
  1887. may_reg_ss:
  1888.         mov    al,4
  1889.         jmp    short  now_make
  1890. may_reg_ds:
  1891.         mov    al,0
  1892.         jmp    short  now_make
  1893. may_reg_fs:
  1894.         mov    al,8
  1895. now_make:
  1896.         mov    si, offset segment_regist
  1897.         add    si,ax            ; ß¼ÑΘÑ¡¿Ñ ¡á óΓ«α«⌐ «»Ñαá¡ñ
  1898.         push    es
  1899.         push    cs
  1900.         pop    es
  1901.         cld                ; ßíα«ß¿¼ Σ½áú ¡á»αáó½Ñ¡¿∩
  1902.         movsw                ; »ÑαÑΦ½Ñ¼
  1903.         pop    es
  1904.         pop    si
  1905.         pop    cx
  1906.         pop    ax
  1907.         clc
  1908.         retn
  1909.  
  1910. form_segm_index    endp
  1911.  
  1912. ;                     ***  Äíαáí«Γ¬á lea - ¬«¼á¡ñ  ***
  1913.  
  1914. lea_operation    proc    near
  1915.  
  1916.         call    operation_type
  1917.         jz    not_lea_compat        ; ñá ==> lea ¡Ñ »«ññÑনóáÑΓ
  1918.         mov    di, offset string
  1919.         add    di,27            ; Σ«α¼¿απѼ áñαÑß ñ½∩ óδó«ñá
  1920.         call    form_register        ; ºá»¿ß∞ »Ñαó«ú« αÑú¿ßΓαá
  1921.         mov    byte ptr ds:[di], 2ch    ; ','
  1922.         call    memory_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  1923.         call    write_mnemo        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  1924.         call    form_memory        ; Σ«α¼¿απѼ «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  1925.         mov    di,30            ; áñαÑß ñ½∩ óδó«ñá
  1926.         cmp    byte ptr ds:[cpu_mode_1], 0
  1927.         jz    no_d32_lea
  1928.         inc    di
  1929. no_d32_lea:
  1930.         call    ins_mem_reg        ; óßΓáó¿¼ »Ñαóπε »«½«ó¿¡π
  1931.         call    plus_offset        ; ñ«íáó¿¼ ß¼ÑΘÑ¡¿∩
  1932.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  1933. not_lea_compat:
  1934.         mov    byte ptr ds:[h_add], 1    ; óßÑú« «ñ¿¡ íá⌐Γ
  1935.         xor    cx,cx
  1936.         mov    cl,2
  1937.         mov    si, offset command_symbol
  1938.         add    si,268h            ; ¬«ñ DB
  1939.         call    this_db            ; «íαáí«Γ¬á ¬á¬ DB
  1940.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  1941.  
  1942. lea_operation    endp
  1943.  
  1944. ;             ***  Äíαáí«Γ¬á Γ¿»«ó  segment regist <== Rm  ***
  1945.  
  1946. seg_reg_rm    proc    near
  1947.  
  1948.         call    operation_type
  1949.         jz    seg_with_reg        ; ñá ==> «íαáí«ΓáѼ «Γñѽ∞¡«
  1950.         mov    di, offset string
  1951.         add    di,27            ; Σ«α¼¿απѼ áñαÑß ñ½∩ óδó«ñá
  1952.         call    form_segm_reg        ; ºá»¿ß∞ »Ñαó«ú« αÑú¿ßΓαá
  1953.         jc    exit_seg_with_reg
  1954.         mov    byte ptr ds:[di], 2ch    ; ','
  1955.         call    memory_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  1956.         call    write_mnemo        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  1957.         call    form_memory        ; Σ«α¼¿απѼ «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  1958.         mov    di,30            ; áñαÑß ñ½∩ óδó«ñá
  1959.         call    ins_mem_reg        ; óßΓáó¿¼ »Ñαóπε »«½«ó¿¡π
  1960.         call    plus_offset        ; ñ«íáó¿¼ ß¼ÑΘÑ¡¿∩
  1961. exit_seg_with_reg:
  1962.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  1963. seg_with_reg:
  1964.         mov    di, offset string
  1965.         add    di,27            ; Σ«α¼¿απѼ áñαÑß ñ½∩ óδó«ñá
  1966.         call    form_segm_reg        ; ºá»¿ß∞ »Ñαó«ú« αÑú¿ßΓαá
  1967.         jc    exit_seg_with_reg
  1968.         mov    byte ptr ds:[di], 2ch    ; ','
  1969.         call    write_mnemo        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  1970.         mov    di,30
  1971.         call    insert_register        ; ºá»¿ß∞ óΓ«α«ú« αÑú¿ßΓαá
  1972.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  1973.  
  1974. seg_reg_rm    endp
  1975.  
  1976. ;     ***  éδó«ñ ßÑú¼Ñ¡Γ¡δσ αÑú¿ßΓα«ó «»Ñαᵿ⌐ Γ¿»á  seg_reg <== Rm  ***
  1977.  
  1978. form_segm_reg    proc    near
  1979.  
  1980.         push    ax
  1981.         push    cx
  1982.         push    si
  1983.         xor    ax,ax
  1984.         mov    al, byte ptr es:[bx+1]    ; »«½πτ¿¼ óΓ«α«⌐ íá⌐Γ
  1985.         and    al,00111000b        ; óδñѽ¿¼ óΓ«α«⌐ «»Ñαá¡ñ
  1986.         clc                ; ßíα«ß¿¼ carry - Σ½áú
  1987.         mov    cl,3
  1988.         shr    al,cl
  1989.         cmp    al,6
  1990.         jae    i_sure_db
  1991.         call    form_segm_index
  1992.         pop    si
  1993.         pop    cx
  1994.         pop    ax
  1995.         clc
  1996.         retn
  1997. i_sure_db:
  1998.         mov    byte ptr ds:[h_add], 1    ; óßÑú« «ñ¿¡ íá⌐Γ
  1999.         pop    si
  2000.         pop    cx
  2001.         pop    ax
  2002.         mov    cl,2
  2003.         mov    si, offset command_symbol
  2004.         add    si,268h            ; ¬«ñ DB
  2005.         stc
  2006.         pushf
  2007.         call    this_db            ; «íαáí«Γ¬á ¬á¬ DB
  2008.         popf
  2009.         retn
  2010.  
  2011. form_segm_reg    endp
  2012.  
  2013. ;                ***  Äíαáí«Γ¬á «»Ñαᵿ¿  pop  ¿º »á¼∩Γ¿  ***
  2014.  
  2015. pop_rm_oper    proc    near
  2016.  
  2017.         call    look_db_pop        ; »α«óÑα¬á ¡á ¬«ααÑ¬Γ¡«ßΓ∞
  2018.         jc    exit_pop_oper
  2019.         call    operation_type
  2020.         jz    pop_regs_oper        ; ñá ==> «íαáí«ΓáѼ «Γñѽ∞¡«
  2021.         call    mnemo_calling
  2022. exit_pop_oper:
  2023.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2024. pop_regs_oper:
  2025.         call    write_mnemo        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  2026.         mov    di,27
  2027.         call    insert_register        ; ºá»¿ß∞ »Ñαó«ú« αÑú¿ßΓαá
  2028.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2029.  
  2030. pop_rm_oper    endp
  2031.  
  2032. ;   ***  Åα«óÑα¬á ¡á ¬«ααÑ¬Γ¡«ßΓ∞ óΓ«α«ú« íá⌐Γá «»Ñαᵿ¿ Γ¿»á  pop Rm  ***
  2033.  
  2034. look_db_pop    proc    near
  2035.  
  2036.         push    ax
  2037.         xor    ax,ax
  2038.         mov    al, byte ptr es:[bx+1]    ; al = íá⌐Γ ¬«ñá
  2039.         and    al,00111000b        ; óδñѽ¿¼ óΓ«α«⌐ «»Ñαá¡ñ
  2040.         cmp    ax,0
  2041.         pop    ax
  2042.         jnz    look_pop_like_db
  2043.         jmp    short  keep_db_out
  2044. look_pop_like_db:
  2045.         mov    byte ptr ds:[h_add], 1    ; óßÑú« «ñ¿¡ íá⌐Γ
  2046.         mov    cl,2
  2047.         mov    si, offset command_symbol
  2048.         add    si,268h            ; ¬«ñ DB
  2049.         stc
  2050.         pushf
  2051.         call    this_db            ; «íαáí«Γ¬á ¬á¬ DB
  2052.         popf
  2053.         retn
  2054. keep_db_out:
  2055.         clc
  2056.         retn
  2057.  
  2058. look_db_pop    endp
  2059.  
  2060. ;                       ***  éδó«ñ  ax, word_reg  ***
  2061.  
  2062. simple_record    proc    near
  2063.  
  2064.         push    es
  2065.         xor    ax,ax
  2066.         mov    al, byte ptr es:[bx]    ; »«½πτ¿¼ ¬«ñ ¬«¼á¡ñδ
  2067.         push    cs
  2068.         pop    es
  2069.         cmp    byte ptr ds:[cpu_mode_1], 1
  2070.         jz    simple_d32
  2071.         mov    si, offset command_regist  ; π¬áºáΓѽ∞ ¡á αÑú¿ßΓαδ
  2072.         add    si,16               ; Γ¿»á word
  2073.         mov    di, offset string
  2074.         add    di,27            ; »«º¿µ¿∩ óδó«ñá
  2075.         cld
  2076.         movsw                ; óδó«ñ αÑú¿ßΓαá ax
  2077.         mov    byte ptr ds:[di], 2ch    ; ','
  2078.         inc    di
  2079.         sub    ax,90h            ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ
  2080.         clc
  2081.         shl    ax,1            ; * 2 ñ½∩ áñαÑßᵿ¿ ¬ ß½«óá¼
  2082.         mov    si, offset command_regist
  2083.         add    si,16            ; Σ«α¼¿απѼ ß¼ÑΘÑ¡¿Ñ
  2084.         add    si,ax            ; ¿ßΓ«τ¡¿¬á
  2085.         cld
  2086.         movsw                ; óδó«ñ óΓ«α«ú« αÑú¿ßΓαá
  2087.         pop    es
  2088.         retn
  2089. simple_d32:
  2090.         mov    si, offset com_386_regist  ; π¬áºáΓѽ∞ ¡á αÑú¿ßΓαδ
  2091.         mov    di, offset string
  2092.         add    di,27            ; »«º¿µ¿∩ óδó«ñá
  2093.         mov    cx,3
  2094.         cld
  2095.         rep    movsb            ; óδó«ñ αÑú¿ßΓαá eax
  2096.         mov    byte ptr ds:[di], 2ch    ; ','
  2097.         inc    di
  2098.         sub    ax,90h            ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ
  2099.         mov    cx,3
  2100.         mul    cx
  2101.         mov    si, offset com_386_regist
  2102.         add    si,ax
  2103.         mov    cx,3
  2104.         cld
  2105.         rep    movsb            ; óδó«ñ óΓ«α«ú« αÑú¿ßΓαá
  2106.         pop    es
  2107.         retn
  2108.  
  2109. simple_record    endp
  2110.  
  2111. ;               ***  ö«α¼¿απѼ áñαÑß ñ½∩  JMP / CALL  FAR  ***
  2112.  
  2113. form_far_record    proc    near
  2114.  
  2115.         push    ax
  2116.         push    si
  2117.         mov    si, offset string
  2118.         add    si,35            ; φΓ« »«ß½Ññ¡¿⌐ íá⌐Γ ß¼ÑΘÑ¡¿∩
  2119.         cmp    byte ptr ds:[cpu_mode_1], 1
  2120.         jz    d32_call_jmp
  2121.         xor    ax,ax
  2122.         mov    al, byte ptr es:[bx+1]    ; óΓ«α«⌐ íá⌐Γ ß¼ÑΘÑ¡¿∩
  2123.         call    conv_to_hex        ; »ÑαÑó«ñ ó ßΓ᫬π
  2124.         xor    ax,ax
  2125.         mov    al, byte ptr es:[bx+2]    ; »Ñαóδ⌐ íá⌐Γ ß¼ÑΘÑ¡¿∩
  2126.         call    conv_to_hex        ; »ÑαÑó«ñ ó ßΓ᫬π
  2127.         mov    byte ptr ds:[si],3ah    ; ':'
  2128.         dec    si
  2129.         xor    ax,ax
  2130.         mov    al, byte ptr es:[bx+3]    ; óΓ«α«⌐ íá⌐Γ ßÑú¼Ñ¡Γá
  2131.         call    conv_to_hex        ; »ÑαÑó«ñ ó ßΓ᫬π
  2132.         xor    ax,ax
  2133.         mov    al, byte ptr es:[bx+4]    ; »Ñαóδ⌐ íá⌐Γ ßÑú¼Ñ¡Γá
  2134.         call    conv_to_hex        ; »ÑαÑó«ñ ó ßΓ᫬π
  2135.         add    byte ptr ds:[h_add], 4    ; »½εß 4 íá⌐Γá áñαÑßá
  2136.         pop    si
  2137.         pop    ax
  2138.         retn
  2139. d32_call_jmp:
  2140.         add    si,4
  2141.         xor    ax,ax
  2142.         mov    al, byte ptr es:[bx+1]    ; τÑΓóÑαΓδ⌐ íá⌐Γ ß¼ÑΘÑ¡¿∩
  2143.         call    conv_to_hex        ; »ÑαÑó«ñ ó ßΓ᫬π
  2144.         xor    ax,ax
  2145.         mov    al, byte ptr es:[bx+2]    ; ΓαÑΓ¿⌐ íá⌐Γ ß¼ÑΘÑ¡¿∩
  2146.         call    conv_to_hex        ; »ÑαÑó«ñ ó ßΓ᫬π
  2147.         xor    ax,ax
  2148.         mov    al, byte ptr es:[bx+3]    ; óΓ«α«⌐ íá⌐Γ ß¼ÑΘÑ¡¿∩
  2149.         call    conv_to_hex        ; »ÑαÑó«ñ ó ßΓ᫬π
  2150.         xor    ax,ax
  2151.         mov    al, byte ptr es:[bx+4]    ; »Ñαóδ⌐ íá⌐Γ ß¼ÑΘÑ¡¿∩
  2152.         call    conv_to_hex        ; »ÑαÑó«ñ ó ßΓ᫬π
  2153.         mov    byte ptr ds:[si],3ah    ; ':'
  2154.         dec    si
  2155.         xor    ax,ax
  2156.         mov    al, byte ptr es:[bx+5]    ; óΓ«α«⌐ íá⌐Γ ßÑú¼Ñ¡Γá
  2157.         call    conv_to_hex        ; »ÑαÑó«ñ ó ßΓ᫬π
  2158.         xor    ax,ax
  2159.         mov    al, byte ptr es:[bx+6]    ; »Ñαóδ⌐ íá⌐Γ ßÑú¼Ñ¡Γá
  2160.         call    conv_to_hex        ; »ÑαÑó«ñ ó ßΓ᫬π
  2161.         add    byte ptr ds:[h_add], 6    ; »½εß 4 íá⌐Γá áñαÑßá
  2162.         pop    si
  2163.         pop    ax
  2164.         retn
  2165.  
  2166. form_far_record    endp
  2167.  
  2168. ;         ***  Äíαáí«Γ¬á «»Ñαᵿ⌐ Γ¿»á  al (ax) <== mem8 (16)  ***
  2169.  
  2170. alx_mem8_16    proc    near
  2171.  
  2172.         call    byte_or_word        ; «»αÑñѽ∩Ѽ Γ¿» «»Ñαᵿ¿
  2173.         mov    di, offset string
  2174.         add    di,27            ; Σ«α¼¿απѼ áñαÑß ñ½∩ óδó«ñá
  2175.         call    mode_detect        ; ºá»¿ß∞ »Ñαó«ú« αÑú¿ßΓαá
  2176.         mov    byte ptr ds:[di], 2ch    ; ','
  2177.         call    detect_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  2178.         call    write_mnemo        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  2179.         call    form_memory        ; Σ«α¼¿απѼ «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  2180.         mov    di,30            ; áñαÑß ñ½∩ óδó«ñá
  2181.         cmp    byte ptr ds:[cpu_mode_1], 0
  2182.         jz    no_mem8_16_corr
  2183.         inc    di
  2184. no_mem8_16_corr:
  2185.         call    ins_mem_reg        ; óßΓáó¿¼ óΓ«απε »«½«ó¿¡π
  2186.         call    plus_some_off        ; ñ«íáó¿¼ ß¼ÑΘÑ¡¿∩
  2187.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2188.  
  2189. alx_mem8_16    endp
  2190.  
  2191. ;                   ***  Åα«óÑα¬á ¿ óδó«ñ al ¿½¿ ax  ***
  2192.  
  2193. mode_detect    proc    near
  2194.  
  2195.         push    ax
  2196.         push    cx
  2197.         push    si
  2198.         xor    ax,ax
  2199.         cmp    byte ptr ds:[cpu_mode_1], 1
  2200.         jz    mode_d32_detect
  2201.         cmp    byte ptr ds:[byte_word], 1    ; «»Ñαᵿ∩ ß íá⌐ΓἿ ?
  2202.         jz    detect_byte        ; ñá ==> »ÑαÑ⌐ñѼ
  2203.         add    ax,16            ; ß¬«ααÑ¬Γ¿απѼ
  2204. detect_byte:
  2205.         mov    si, offset command_regist
  2206.         add    si,ax            ; ß¼ÑΘÑ¡¿Ñ ¡á óΓ«α«⌐ «»Ñαá¡ñ
  2207.         push    es
  2208.         push    cs
  2209.         pop    es
  2210.         cld                ; ßíα«ß¿¼ Σ½áú ¡á»αáó½Ñ¡¿∩
  2211.         movsw                ; »ÑαÑΦ½Ñ¼
  2212.         pop    es
  2213.         pop    si
  2214.         pop    cx
  2215.         pop    ax
  2216.         retn
  2217. mode_d32_detect:
  2218.         mov    si, offset com_386_regist
  2219.         add    si,ax
  2220.         push    es
  2221.         push    cs
  2222.         pop    es
  2223.         mov    cx,3
  2224.         cld                ; ßíα«ß¿¼ Σ½áú ¡á»αáó½Ñ¡¿∩
  2225.         rep    movsb            ; »ÑαÑΦ½Ñ¼
  2226.         pop    es
  2227.         pop    si
  2228.         pop    cx
  2229.         pop    ax
  2230.         retn
  2231.  
  2232. mode_detect    endp
  2233.  
  2234. ;                ***  éδí«α¬á ¡Ñ»«ßαÑñßΓóÑ¡¡«ú« áñαÑßá  ***
  2235.  
  2236. detect_cost    proc    near
  2237.  
  2238.         cmp    byte ptr ds:[cpu_mode_2], 1
  2239.         jz    detect_d32_cost
  2240.         mov    ax,6                ; DS : d16
  2241.         add    byte ptr ds:[h_add], 1        ; íπñÑΓ ÑΘÑ ß½«ó«
  2242.         mov    byte ptr ds:[off_code], 2    ; ¬«Γ«α«Ñ ¡áñ« óδíαáΓ∞
  2243.         retn
  2244. detect_d32_cost:
  2245.         mov    ax,5                ; DS : d32
  2246.         add    byte ptr ds:[h_add], 3        ; íπñÑΓ ÑΘÑ ß½«ó«
  2247.         mov    byte ptr ds:[off_code], 3    ; ¬«Γ«α«Ñ ¡áñ« óδíαáΓ∞
  2248.         retn
  2249.  
  2250. detect_cost    endp
  2251.  
  2252. ;             ***  éδí«α¬á ß¼ÑΘÑ¡¿⌐ ñ½∩ π»α«ΘÑ¡¡δ󠬫¼á¡ñ  ***
  2253.  
  2254. plus_some_off    proc    near
  2255.  
  2256.         cmp    byte ptr ds:[off_code], 0 ; óδí¿αáΓ∞ ¡¿τÑú« ¡Ñ ¡áñ« ?
  2257.         jz    not_make_offset          ; ¡Ñ ¡áñ« ==> ¡Ñ íπñѼ
  2258.         mov    si,di
  2259.         sub    si,3            ; óδí¿αáΓ∞ ßεñá
  2260.         xor    ax,ax
  2261.         mov    al, byte ptr es:[bx+1]    ; óδíÑαѼ »Ñαóδ⌐ íá⌐Γ
  2262.         call    conv_to_hex          ; »αÑ«íαáºπѼ ó ßΓ᫬π
  2263.         cmp    byte ptr ds:[off_code], 1 ; ÑΘÑ óδí¿αáΓ∞ ?
  2264.         jz    not_make_offset
  2265.         xor    ax,ax
  2266.         mov    al, byte ptr es:[bx+2]    ; óδíÑαѼ óΓ«α«⌐ íá⌐Γ
  2267.         call    conv_to_hex        ; »αÑ«íαáºπѼ ó ßΓ᫬π
  2268.         cmp    byte ptr ds:[off_code], 2 ; ÑΘÑ óδí¿αáΓ∞ ?
  2269.         jz    not_make_offset
  2270.         xor    ax,ax
  2271.         mov    al, byte ptr es:[bx+3]    ; óδíÑαѼ óΓ«α«⌐ íá⌐Γ
  2272.         call    conv_to_hex        ; »αÑ«íαáºπѼ ó ßΓ᫬π
  2273.         xor    ax,ax
  2274.         mov    al, byte ptr es:[bx+4]    ; óδíÑαѼ óΓ«α«⌐ íá⌐Γ
  2275.         call    conv_to_hex        ; »αÑ«íαáºπѼ ó ßΓ᫬π
  2276. not_make_offset:
  2277.         retn
  2278.  
  2279. plus_some_off    endp
  2280.  
  2281. ;         ***  Äíαáí«Γ¬á «»Ñαᵿ⌐ Γ¿»á  mem8 (16) <== al (ax)  ***
  2282.  
  2283. mem8_16_alx    proc    near
  2284.  
  2285.         call    byte_or_word        ; «»αÑñѽ∩Ѽ Γ¿» «»Ñαᵿ¿
  2286.         call    detect_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  2287.         call    write_mnemo        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  2288.         call    form_memory        ; Σ«α¼¿απѼ «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  2289.         mov    di,27            ; áñαÑß ñ½∩ óδó«ñá
  2290.         call    ins_mem_reg        ; óßΓáó¿¼ »Ñαóπε »«½«ó¿¡π
  2291.         call    plus_some_off        ; ñ«íáó¿¼ ß¼ÑΘÑ¡¿∩
  2292.         mov    byte ptr ds:[di], 2ch    ; ','
  2293.         inc    di            ; ¡«óδ⌐ áñαÑß ñ½∩ óδó«ñá
  2294.         call    mode_detect        ; Σ«α¼¿απѼ αÑú¿ßΓα
  2295.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2296.  
  2297. mem8_16_alx    endp
  2298.  
  2299. ;       ***  Äíαáí«Γ¬á ¬«¼á¡ñ Γ¿»á  al(ax) - bh(di) <== im8(16)  ***
  2300.  
  2301. alax_bhdi_im8_16    proc    near
  2302.  
  2303.         push    cx
  2304.         push    si
  2305.         call    byte_or_word        ; «»αÑñѽ¿¼ Γ¿» «»Ñαᵿ¿
  2306.         dec    byte ptr ds:[h_add]
  2307.         call    write_al_di        ; óßΓáó¬á αÑú¿ßΓαá ¿ ºá»∩Γ«⌐
  2308.         call    small_cause        ; óδí«α¬á º¡áτÑ¡¿∩
  2309.         pop    si
  2310.         pop    cx
  2311.         call    write_mnemo        ; óδó«ñ ¼¡Ñ¼«¬«¼á¡ñπ
  2312.         retn
  2313.  
  2314. alax_bhdi_im8_16    endp
  2315.  
  2316. ;                        ***  éßΓáó¬á AL - DI  ***
  2317.  
  2318. write_al_di    proc    near
  2319.  
  2320.         xor    ax,ax
  2321.         mov    al, byte ptr es:[bx]    ; »«½πτ¿¼ íá⌐Γ ¬«ñá
  2322.         sub    ax,00b0h        ; ¬«ααѬµ¿∩
  2323.         cmp    byte ptr ds:[cpu_mode_1], 1
  2324.         jz    write_d32_al_di
  2325.         clc
  2326.         shl    ax,1
  2327.         mov    si, offset command_regist
  2328.         add    si,ax            ; ß¼ÑΘÑ¡¿Ñ ¡á óΓ«α«⌐ «»Ñαá¡ñ
  2329.         mov    di, offset string
  2330.         add    di,27            ; ß¼ÑΘÑ¡¿Ñ ñ½∩ óδó«ñá
  2331.         push    es
  2332.         push    cs
  2333.         pop    es
  2334.         cld                ; ßíα«ß¿¼ Σ½áú ¡á»αáó½Ñ¡¿∩
  2335.         movsw                ; »ÑαÑΦ½Ñ¼
  2336.         pop    es
  2337.         mov    byte ptr ds:[di], 2ch    ; ','
  2338.         inc    di
  2339.         retn
  2340. write_d32_al_di:
  2341.         cmp    ax,8
  2342.         jb    corr_@@_d32
  2343.         sub    ax,8
  2344. corr_@@_d32:
  2345.         mov    cx,3
  2346.         mul    cx
  2347.         mov    si, offset com_386_regist
  2348.         add    si,ax            ; ß¼ÑΘÑ¡¿Ñ ¡á óΓ«α«⌐ «»Ñαá¡ñ
  2349.         mov    di, offset string
  2350.         add    di,27            ; ß¼ÑΘÑ¡¿Ñ ñ½∩ óδó«ñá
  2351.         push    es
  2352.         push    cs
  2353.         pop    es
  2354.         mov    cx,3
  2355.         cld                ; ßíα«ß¿¼ Σ½áú ¡á»αáó½Ñ¡¿∩
  2356.         rep    movsb            ; »ÑαÑΦ½Ñ¼
  2357.         pop    es
  2358.         mov    byte ptr ds:[di], 2ch    ; ','
  2359.         inc    di
  2360.         retn
  2361.  
  2362. write_al_di    endp
  2363.  
  2364. ;            ***  éδí«α¬á ß¼ÑΘÑ¡¿⌐ ñ½∩ ß«¬αáΘÑ¡¡δ󠬫¼á¡ñ  ***
  2365.  
  2366. small_cause    proc    near
  2367.  
  2368.         mov    si,di
  2369.         cmp    byte ptr ds:[byte_word], 2    ; óδí¿αáΓ∞ ß½«ó« ?
  2370.         jz    make_word            ; ñá ==> óδíÑαѼ
  2371.         inc    byte ptr ds:[h_add]
  2372.         call    insert_byte_num
  2373.         retn
  2374. make_word:
  2375.         call    count_detect
  2376.         call    insert_number
  2377.         retn
  2378.  
  2379. small_cause    endp
  2380.  
  2381. ;         ***  Äíß½πª¿óá¡¿Ñ «»Ñαᵿ⌐ Γ¿»á  ret((n/f)+offset)  ***
  2382.  
  2383. return_oper    proc    near
  2384.  
  2385.         mov    di, offset string
  2386.         add    di,23
  2387.         cmp    ah,1            ; «íαáí«Γ¬á retn ?
  2388.         jnz    not_ret_near
  2389.         mov    byte ptr ds:[di], 6eh    ; 'n'
  2390.         jmp    short  make_only
  2391. not_ret_near:
  2392.         cmp    ah,3            ; «íαáí«Γ¬á retn+offset ?
  2393.         jnz    not_ret_near_off
  2394.         mov    byte ptr ds:[di], 6eh    ; 'n'
  2395.         jmp    short  making_off
  2396. not_ret_near_off:
  2397.         cmp    ah,2            ; «íαáí«Γ¬á retf ?
  2398.         jnz    not_ret_far
  2399.         mov    byte ptr ds:[di], 66h    ; 'f'
  2400.         jmp    short  make_only
  2401. not_ret_far:
  2402.         mov    byte ptr ds:[di], 66h    ; «íαáí«Γ¬á retf+offset
  2403. making_off:
  2404.         push    cx
  2405.         push    si
  2406.         mov    byte ptr ds:[byte_word], 2    ; óδí«α¬á ß½«óá
  2407.         mov    di, offset string
  2408.         add    di,27            ; Σ«α¼¿απѼ ß¼ÑΘÑ¡¿Ñ
  2409.         call    small_cause        ; óδí«α¬á ß¼ÑΘÑ¡¿∩
  2410.         pop    si
  2411.         pop    cx
  2412. make_only:
  2413.         call    write_mnemo        ; óδó«ñ¿¼ ¼¡Ñ¼«¬«¼á¡ñπ
  2414.         retn
  2415.  
  2416. return_oper    endp
  2417.  
  2418. ;        ***  Äíαáí«Γ¬á «»Ñαᵿ⌐ »«ñ¼¡«ªÑßΓóá mem <== im8(16)  ***
  2419.  
  2420. this_mem_im8_16    proc    near
  2421.  
  2422.         push    cx
  2423.         push    si
  2424.         call    operation_type
  2425.         jz    mem_with_regs        ; ñá ==> «íαáí«ΓáѼ «Γñѽ∞¡«
  2426.         call    memory_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  2427.         call    form_memory
  2428.         mov    di,27
  2429.         call    ins_mem_reg
  2430.         call    plus_offset
  2431.         mov    byte ptr ds:[di], 2ch    ; ','
  2432.         inc    di
  2433.         push    bx
  2434.         xor    ax,ax
  2435.         mov    al, byte ptr ds:[off_code]
  2436.         add    bx,ax
  2437.         inc    bx
  2438.         cmp    byte ptr ds:[yes_sib], 0
  2439.         jz    no_@_mem_corr
  2440.         inc    bx
  2441. no_@_mem_corr:
  2442.         call    small_cause        ; Σ«α¼¿απѼ º¡áτÑ¡¿Ñ
  2443.         pop    bx
  2444.         pop    si
  2445.         pop    cx
  2446.         call    write_mnemo
  2447.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2448. mem_with_regs:
  2449.         call    reg_addition
  2450.         push    bx
  2451.         xor    ax,ax
  2452.         mov    al, byte ptr ds:[off_code]
  2453.         add    bx,ax
  2454.         inc    bx
  2455.         call    small_cause        ; ºá»¿ß∞ º¡áτÑ¡¿∩
  2456.         pop    bx
  2457.         pop    si
  2458.         pop    cx
  2459.         call    write_mnemo
  2460.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2461.  
  2462. this_mem_im8_16    endp
  2463.  
  2464. ;  ***  Çα¿Σ¼ÑΓ¿τÑ߬¿Ñ «»Ñαᵿ¿ ß αáßΦ¿αÑ¡¡δ¼ ¬«ñ«¼ Γ¿»á Rm/i8 ¿ Rm/i16  ***
  2465.  
  2466. ariph_oper_1    proc    near
  2467.  
  2468.         cmp    ah,2
  2469.         jz    no_@_ariph_1_minus
  2470.         dec    byte ptr ds:[h_add]
  2471. no_@_ariph_1_minus:
  2472.         call    operation_type
  2473.         jz    ariph_1_with_regs    ; ñá ==> «íαáí«ΓáѼ «Γñѽ∞¡«
  2474.         call    memory_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  2475.         call    form_memory
  2476.         mov    di,27
  2477.         call    ins_mem_reg
  2478.         call    plus_offset
  2479.         mov    byte ptr ds:[di], 2ch    ; ','
  2480.         inc    di
  2481.         push    bx
  2482.         xor    ax,ax
  2483.         mov    al, byte ptr ds:[off_code]
  2484.         add    bx,ax
  2485.         inc    bx
  2486.         cmp    byte ptr ds:[yes_sib], 0
  2487.         jz    no_@_ariph_1_corr
  2488.         inc    bx
  2489. no_@_ariph_1_corr:
  2490.         call    small_cause        ; Σ«α¼¿απѼ º¡áτÑ¡¿Ñ
  2491.         pop    bx
  2492.         call    write_ariph_1
  2493.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2494. ariph_1_with_regs:
  2495.         call    reg_addition
  2496.         push    bx
  2497.         xor    ax,ax
  2498.         mov    al, byte ptr ds:[off_code]
  2499.         add    bx,ax
  2500.         inc    bx
  2501.         call    small_cause        ; ºá»¿ß∞ º¡áτÑ¡¿∩
  2502.         pop    bx
  2503.         call    write_ariph_1
  2504.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2505.  
  2506. ariph_oper_1    endp
  2507.  
  2508. ;           ***  éδó«ñ ¼¡Ñ¼«¬«ñá áα¿Σ¼ÑΓ¿τÑ߬«⌐ «»Ñαᵿ¿ Γ¿»á 1  ***
  2509.  
  2510. write_ariph_1    proc    near
  2511.  
  2512.         push    ax
  2513.         xor    ax,ax
  2514.         mov    al, byte ptr es:[bx+1]    ; al = íá⌐Γ ¬«ñá
  2515.         and    al,00111000b        ; óδñѽ¿¼ óΓ«α«⌐ «»Ñαá¡ñ
  2516.         clc                ; ßíα«ß¿¼ carry - Σ½áú
  2517.         mov    cl,3            ; »αÑ«íαẫóá¡¿Ñ Σ«α¼áΓ«ó
  2518.         shr    ax,cl
  2519.         push    ax            ; ==> ß«σαá¡¿¼ ß¼ÑΘÑ¡¿Ñ ¬«ñá
  2520.         shl    ax,1              ; ß¼ÑΘÑ¡¿Ñ ó Γáí½¿µÑ ß½«ó !
  2521.         mov    si, offset offset_arop_1  ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ó
  2522.         add    si,ax              ; Γáí½¿µÑ ß¼ÑΘÑ¡¿⌐
  2523.         mov    ax, word ptr ds:[si]      ; »«½πτ¿¼ ΓαÑíπѼ«Ñ ß¼ÑΘÑ¡¿Ñ
  2524.         mov    si, offset command_symbol ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ¡á
  2525.         add    si,ax              ; ¼áΦ¿¡¡πε ¿¡ßΓαπ¬µ¿ε
  2526.         pop    ax              ; <== óδíÑαѼ ß¼ÑΘÑ¡¿Ñ
  2527.         push    si              ; ===> ß«σαá¡¿¼ ¡á ßΓѬÑ
  2528.         mov    si, offset length_arop_1
  2529.         add    si,ax            ; óδíÑαѼ ñ½¿¡π ñ½∩
  2530.         xor    cx,cx            ; »ÑαÑß佬¿
  2531.         mov    cl, byte ptr ds:[si]
  2532.         pop    si            ; <=== óδí«α¬á ß¼ÑΘÑ¡¿∩
  2533.         pop    ax
  2534.         call    write_mnemo        ; óδó«ñ¿¼ ¼¡Ñ¼«¬«¼á¡ñπ
  2535.         retn
  2536.  
  2537. write_ariph_1    endp
  2538.  
  2539. ; ***  Çα¿Σ¼ÑΓ¿τÑ߬¿Ñ «»Ñαᵿ¿ ß αáßΦ¿αÑ¡¡δ¼ ¬«ñ«¼ Γ¿»á Rm8/i8 ¿ Rm16/i8  ***
  2540.  
  2541. ariph_oper_2    proc    near
  2542.  
  2543.         call    operation_type
  2544.         jz    ariph_2_with_regs    ; ñá ==> «íαáí«ΓáѼ «Γñѽ∞¡«
  2545.         call    memory_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  2546.         call    form_memory
  2547.         mov    di,27
  2548.         call    ins_mem_reg
  2549.         call    plus_offset
  2550.         mov    byte ptr ds:[di], 2ch    ; ','
  2551.         inc    di
  2552.         push    bx
  2553.         xor    ax,ax
  2554.         mov    al, byte ptr ds:[off_code]
  2555.         add    bx,ax
  2556.         inc    bx
  2557.         cmp    byte ptr ds:[yes_sib], 0
  2558.         jz    no_@_ariph_2_corr
  2559.         inc    bx
  2560. no_@_ariph_2_corr:
  2561.         mov    si,di
  2562.         call    insert_byte_num
  2563.         pop    bx
  2564.         call    write_ariph_2
  2565.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2566. ariph_2_with_regs:
  2567.         call    reg_addition
  2568.         push    bx
  2569.         xor    ax,ax
  2570.         mov    al, byte ptr ds:[off_code]
  2571.         add    bx,ax
  2572.         inc    bx
  2573.         mov    si,di
  2574.         call    insert_byte_num
  2575.         pop    bx
  2576.         call    write_ariph_2
  2577.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2578.  
  2579. ariph_oper_2    endp
  2580.  
  2581. ;           ***  éδó«ñ ¼¡Ñ¼«¬«ñá áα¿Σ¼ÑΓ¿τÑ߬«⌐ «»Ñαᵿ¿ Γ¿»á 1  ***
  2582.  
  2583. write_ariph_2    proc    near
  2584.  
  2585.         push    ax
  2586.         xor    ax,ax
  2587.         mov    al, byte ptr es:[bx+1]    ; al = íá⌐Γ ¬«ñá
  2588.         and    al,00111000b        ; óδñѽ¿¼ óΓ«α«⌐ «»Ñαá¡ñ
  2589.         clc                ; ßíα«ß¿¼ carry - Σ½áú
  2590.         mov    cl,3            ; »αÑ«íαẫóá¡¿Ñ Σ«α¼áΓ«ó
  2591.         shr    ax,cl
  2592.         push    ax            ; ==> ß«σαá¡¿¼ ß¼ÑΘÑ¡¿Ñ ¬«ñá
  2593.         shl    ax,1              ; ß¼ÑΘÑ¡¿Ñ ó Γáí½¿µÑ ß½«ó !
  2594.         mov    si, offset offset_arop_2  ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ó
  2595.         add    si,ax              ; Γáí½¿µÑ ß¼ÑΘÑ¡¿⌐
  2596.         mov    ax, word ptr ds:[si]      ; »«½πτ¿¼ ΓαÑíπѼ«Ñ ß¼ÑΘÑ¡¿Ñ
  2597.         mov    si, offset command_symbol ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ¡á
  2598.         add    si,ax              ; ¼áΦ¿¡¡πε ¿¡ßΓαπ¬µ¿ε
  2599.         pop    ax              ; <== óδíÑαѼ ß¼ÑΘÑ¡¿Ñ
  2600.         push    si              ; ===> ß«σαá¡¿¼ ¡á ßΓѬÑ
  2601.         mov    si, offset length_arop_2
  2602.         add    si,ax            ; óδíÑαѼ ñ½¿¡π ñ½∩
  2603.         xor    cx,cx            ; »ÑαÑß佬¿
  2604.         mov    cl, byte ptr ds:[si]
  2605.         pop    si            ; <=== óδí«α¬á ß¼ÑΘÑ¡¿∩
  2606.         pop    ax
  2607.         call    write_mnemo        ; óδó«ñ¿¼ ¼¡Ñ¼«¬«¼á¡ñπ
  2608.         retn
  2609.  
  2610. write_ariph_2    endp
  2611.  
  2612. ;              ***  æñó¿ú«óδÑ «»Ñαᵿ¿ Γ¿»á shift, im  ***
  2613.  
  2614. shift_oper_im    proc    near
  2615.  
  2616.         inc    byte ptr ds:[h_add]
  2617.         call    operation_type
  2618.         jz    shift_im_with_regs    ; ñá ==> «íαáí«ΓáѼ «Γñѽ∞¡«
  2619.         call    memory_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  2620.         call    write_shift_im        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  2621.         jc    no_shift_im_this    ; Γᬫ⌐ ¬«¼á¡ñδ ¡ÑΓ
  2622.         call    form_memory        ; Σ«α¼¿απѼ «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  2623.         mov    di,27            ; áñαÑß ñ½∩ óδó«ñá
  2624.         call    ins_mem_reg        ; óßΓáó¿¼ »Ñαóπε »«½«ó¿¡π
  2625.         call    plus_offset        ; ñ«íáó¿¼ ß¼ÑΘÑ¡¿∩
  2626.         mov    byte ptr ds:[di], 2ch    ; ','
  2627.         inc    di            ; ¡«óδ⌐ áñαÑß ñ½∩ óδó«ñá
  2628.         push    bx
  2629.         xor    ax,ax
  2630.         mov    al, byte ptr ds:[off_code]
  2631.         add    bx,ax
  2632.         inc    bx
  2633.         cmp    byte ptr ds:[yes_sib], 0
  2634.         jz    no_@_shift_im_corr
  2635.         inc    bx
  2636. no_@_shift_im_corr:
  2637.         mov    si,di
  2638.         call    insert_byte_num
  2639.         pop    bx
  2640. no_shift_im_this:
  2641.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2642. shift_im_with_regs:
  2643.         call    write_shift_im        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  2644.         jc    no_shift_im_this    ; Γᬫ⌐ ¬«¼á¡ñδ ¡ÑΓ
  2645.         call    reg_addition
  2646.         push    bx
  2647.         xor    ax,ax
  2648.         mov    al, byte ptr ds:[off_code]
  2649.         add    bx,ax
  2650.         inc    bx
  2651.         mov    si,di
  2652.         call    insert_byte_num
  2653.         pop    bx
  2654.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2655.  
  2656. shift_oper_im    endp
  2657.  
  2658. ;             ***  éδó«ñ ¼¡Ñ¼«¡¿¬¿ ñ½∩ shift - «»Ñαᵿ¿  ***
  2659.  
  2660. write_shift_im    proc    near
  2661.  
  2662.         push    ax
  2663.         xor    ax,ax
  2664.         mov    al, byte ptr es:[bx+1]    ; al = íá⌐Γ ¬«ñá
  2665.         and    al,00111000b        ; óδñѽ¿¼ óΓ«α«⌐ «»Ñαá¡ñ
  2666.         clc                ; ßíα«ß¿¼ carry - Σ½áú
  2667.         mov    cl,3            ; »αÑ«íαẫóá¡¿Ñ Σ«α¼áΓ«ó
  2668.         shr    ax,cl
  2669.         push    ax            ; ==> ß«σαá¡¿¼ ß¼ÑΘÑ¡¿Ñ ¬«ñá
  2670.         shl    ax,1            ; ß¼ÑΘÑ¡¿Ñ ó Γáí½¿µÑ ß½«ó !
  2671.         mov    si, offset offset_shift    ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ó
  2672.         add    si,ax            ; Γáí½¿µÑ ß¼ÑΘÑ¡¿⌐
  2673.         mov    ax, word ptr ds:[si]      ; »«½πτ¿¼ ΓαÑíπѼ«Ñ ß¼ÑΘÑ¡¿Ñ
  2674.         mov    si, offset command_symbol ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ¡á
  2675.         add    si,ax              ; ¼áΦ¿¡¡πε ¿¡ßΓαπ¬µ¿ε
  2676.         pop    ax            ; <== óδíÑαѼ ß¼ÑΘÑ¡¿Ñ
  2677.         push    si            ; ===> ß«σαá¡¿¼ ¡á ßΓѬÑ
  2678.         mov    si, offset length_shift
  2679.         add    si,ax            ; óδíÑαѼ ñ½¿¡π ñ½∩
  2680.         xor    cx,cx            ; »ÑαÑß佬¿
  2681.         mov    cl, byte ptr ds:[si]
  2682.         pop    si            ; <=== óδí«α¬á ß¼ÑΘÑ¡¿∩
  2683.         cmp    ax,6            ; ó Γáí½¿µπ ñ¿ºáßßѼí½Ñαá
  2684.         jz    shift_like_db
  2685.         jmp    short  shift_alone
  2686. shift_like_db:
  2687.         mov    byte ptr ds:[h_add], 1    ; óßÑú« «ñ¿¡ íá⌐Γ
  2688.         pop    ax
  2689.         stc
  2690.         pushf
  2691.         call    this_db            ; «íαáí«Γ¬á ¬á¬ DB
  2692.         jmp    short  mnemo_shift_write
  2693. shift_alone:
  2694.         pop    ax
  2695.         clc
  2696.         pushf
  2697.         call    write_mnemo        ; óδó«ñ¿¼ ¼¡Ñ¼«¬«¼á¡ñπ
  2698. mnemo_shift_write:
  2699.         popf
  2700.         retn
  2701.  
  2702. write_shift_im    endp
  2703.  
  2704. ;              ***  æñó¿ú«óδÑ «»Ñαᵿ¿ Γ¿»á shift, 1  ***
  2705.  
  2706. shift_oper_1    proc    near
  2707.  
  2708.         call    operation_type
  2709.         jz    shift_1_with_regs    ; ñá ==> «íαáí«ΓáѼ «Γñѽ∞¡«
  2710.         call    memory_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  2711.         call    write_shift_im        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  2712.         jc    no_shift_1_this        ; Γᬫ⌐ ¬«¼á¡ñδ ¡ÑΓ
  2713.         call    form_memory        ; Σ«α¼¿απѼ «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  2714.         mov    di,27            ; áñαÑß ñ½∩ óδó«ñá
  2715.         call    ins_mem_reg        ; óßΓáó¿¼ »Ñαóπε »«½«ó¿¡π
  2716.         call    plus_offset        ; ñ«íáó¿¼ ß¼ÑΘÑ¡¿∩
  2717.         mov    byte ptr ds:[di], 2ch    ; ','
  2718.         inc    di            ; ¡«óδ⌐ áñαÑß ñ½∩ óδó«ñá
  2719.         mov    byte ptr ds:[di], 31h    ; Σ«α¼¿απѼ º¡áτÑ¡¿Ñ "1"
  2720. no_shift_1_this:
  2721.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2722. shift_1_with_regs:
  2723.         call    write_shift_im        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  2724.         jc    no_shift_1_this        ; Γᬫ⌐ ¬«¼á¡ñδ ¡ÑΓ
  2725.         call    reg_addition
  2726.         mov    byte ptr ds:[di], 31h    ; Σ«α¼¿απѼ º¡áτÑ¡¿Ñ "1"
  2727.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2728.  
  2729. shift_oper_1    endp
  2730.  
  2731. ;              ***  æñó¿ú«óδÑ «»Ñαᵿ¿ Γ¿»á shift, cl  ***
  2732.  
  2733. shift_oper_cl    proc    near
  2734.  
  2735.         call    operation_type
  2736.         jz    shift_cl_with_regs    ; ñá ==> «íαáí«ΓáѼ «Γñѽ∞¡«
  2737.         call    memory_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  2738.         call    write_shift_im        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  2739.         jc    no_shift_cl_this    ; Γᬫ⌐ ¬«¼á¡ñδ ¡ÑΓ
  2740.         call    form_memory        ; Σ«α¼¿απѼ «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  2741.         mov    di,27            ; áñαÑß ñ½∩ óδó«ñá
  2742.         call    ins_mem_reg        ; óßΓáó¿¼ »Ñαóπε »«½«ó¿¡π
  2743.         call    plus_offset        ; ñ«íáó¿¼ ß¼ÑΘÑ¡¿∩
  2744.         mov    byte ptr ds:[di], 2ch    ; ','
  2745.         inc    di            ; ¡«óδ⌐ áñαÑß ñ½∩ óδó«ñá
  2746.         mov    word ptr ds:[di], 6c63h    ; Σ«α¼¿απѼ º¡áτÑ¡¿Ñ "cl"
  2747. no_shift_cl_this:
  2748.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2749. shift_cl_with_regs:
  2750.         call    write_shift_im        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  2751.         jc    no_shift_cl_this    ; Γᬫ⌐ ¬«¼á¡ñδ ¡ÑΓ
  2752.         call    reg_addition
  2753.         mov    word ptr ds:[di], 6c63h    ; Σ«α¼¿απѼ º¡áτÑ¡¿Ñ "cl"
  2754.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2755.  
  2756. shift_oper_cl    endp
  2757.  
  2758. ;         ***/  Ä»Ñαᵿ¿ ß αáßΦ¿αÑ¡¡δ¼ ¬«ñ«¼ ¬«¼á¡ñδ úαπ»»δ 1  /***
  2759.  
  2760. ariph_group_1    proc    near
  2761.  
  2762.         call    operation_type
  2763.         jz    group_1_with_regs    ; ñá ==> «íαáí«ΓáѼ «Γñѽ∞¡«
  2764.         call    memory_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  2765.         push    ax
  2766.         push    cx
  2767.         xor    ax,ax
  2768.         xor    cx,cx
  2769.         mov    al, byte ptr es:[bx+1]
  2770.         and    al,00111000b
  2771.         mov    cl,3
  2772.         clc
  2773.         shr    ax,cl
  2774.         cmp    ax,0
  2775.         jz    expand_test
  2776.         cmp    ax,1
  2777.         pop    cx
  2778.         pop    ax
  2779.         jz    exit_group_1
  2780.         call    form_memory        ; Σ«α¼¿απѼ «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  2781.         mov    di,27            ; áñαÑß ñ½∩ óδó«ñá
  2782.         call    ins_mem_reg        ; óßΓáó¿¼ »Ñαóπε »«½«ó¿¡π
  2783.         call    plus_offset        ; ñ«íáó¿¼ ß¼ÑΘÑ¡¿∩
  2784. exit_group_1:
  2785.         call    write_group_1        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  2786.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2787. expand_test:
  2788.         pop    cx
  2789.         pop    ax
  2790.         call    form_memory        ; Σ«α¼¿απѼ «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  2791.         mov    di,27            ; áñαÑß ñ½∩ óδó«ñá
  2792.         call    ins_mem_reg        ; óßΓáó¿¼ »Ñαóπε »«½«ó¿¡π
  2793.         call    plus_offset        ; ñ«íáó¿¼ ß¼ÑΘÑ¡¿∩
  2794.  
  2795. this_is_a_test:
  2796.         mov    byte ptr ds:[di], 2ch    ; ','
  2797.         inc    di            ; ¡«óδ⌐ áñαÑß ñ½∩ óδó«ñá
  2798.         push    bx
  2799.         xor    ax,ax
  2800.         mov    al, byte ptr ds:[off_code]
  2801.         add    bx,ax
  2802.         inc    bx
  2803.         cmp    byte ptr ds:[yes_sib], 0
  2804.         jz    no_@@_gr_corr
  2805.         inc    bx
  2806. no_@@_gr_corr:
  2807.         mov    si,di
  2808.         call    small_cause
  2809.         pop    bx
  2810.         jmp    short    exit_group_1
  2811. group_1_with_regs:
  2812.         push    ax
  2813.         push    cx
  2814.         xor    ax,ax
  2815.         xor    cx,cx
  2816.         mov    al, byte ptr es:[bx+1]
  2817.         and    al,00111000b
  2818.         mov    cl,3
  2819.         clc
  2820.         shr    ax,cl
  2821.         cmp    ax,0
  2822.         jz    expand_test_reg
  2823.         cmp    ax,1
  2824.         pop    cx
  2825.         pop    ax
  2826.         jz    exit_group_1
  2827.         mov    di,27
  2828.         call    insert_register        ; ºá»¿ß∞ »Ñαó«ú« αÑú¿ßΓαá
  2829.         jmp    short    exit_group_1
  2830. expand_test_reg:
  2831.         pop    cx
  2832.         pop    ax
  2833.         mov    di,27
  2834.         call    insert_register        ; ºá»¿ß∞ »Ñαó«ú« αÑú¿ßΓαá
  2835.         jmp    short    this_is_a_test
  2836.  
  2837. ariph_group_1    endp
  2838.  
  2839. ;               ***  éδó«ñ ¼¡Ñ¼«¡¿¬¿ ñ½∩ ¬«¼á¡ñ úαπ»»δ 1  ***
  2840.  
  2841. write_group_1    proc    near
  2842.  
  2843.         push    ax
  2844.         xor    ax,ax
  2845.         mov    al, byte ptr es:[bx+1]    ; al = íá⌐Γ ¬«ñá
  2846.         and    al,00111000b        ; óδñѽ¿¼ óΓ«α«⌐ «»Ñαá¡ñ
  2847.         clc                ; ßíα«ß¿¼ carry - Σ½áú
  2848.         mov    cl,3            ; »αÑ«íαẫóá¡¿Ñ Σ«α¼áΓ«ó
  2849.         shr    ax,cl
  2850.         push    ax            ; ==> ß«σαá¡¿¼ ß¼ÑΘÑ¡¿Ñ ¬«ñá
  2851.         shl    ax,1               ; ß¼ÑΘÑ¡¿Ñ ó Γáí½¿µÑ ß½«ó !
  2852.         mov    si, offset offset_group_1  ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ó
  2853.         add    si,ax               ; Γáí½¿µÑ ß¼ÑΘÑ¡¿⌐
  2854.         mov    ax, word ptr ds:[si]       ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ
  2855.         mov    si, offset command_symbol  ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ¡á
  2856.         add    si,ax               ; ¼áΦ¿¡¡πε ¿¡ßΓαπ¬µ¿ε
  2857.         pop    ax            ; <== óδíÑαѼ ß¼ÑΘÑ¡¿Ñ
  2858.         push    si            ; ===> ß«σαá¡¿¼ ¡á ßΓѬÑ
  2859.         mov    si, offset length_group_1
  2860.         add    si,ax            ; óδíÑαѼ ñ½¿¡π ñ½∩
  2861.         xor    cx,cx            ; »ÑαÑß佬¿
  2862.         mov    cl, byte ptr ds:[si]
  2863.         pop    si            ; <=== óδí«α¬á ß¼ÑΘÑ¡¿∩
  2864.         cmp    ax,1            ; ó Γáí½¿µπ ñ¿ºáßßѼí½Ñαá
  2865.         jz    group_1_like_db
  2866.         jmp    short  group_1_alone
  2867. group_1_like_db:
  2868.         mov    byte ptr ds:[h_add], 1    ; óßÑú« «ñ¿¡ íá⌐Γ
  2869.         pop    ax
  2870.         call    this_db            ; «íαáí«Γ¬á ¬á¬ DB
  2871.         retn
  2872. group_1_alone:
  2873.         pop    ax
  2874.         call    write_mnemo        ; óδó«ñ¿¼ ¼¡Ñ¼«¬«¼á¡ñπ
  2875.         retn
  2876.  
  2877. write_group_1    endp
  2878.  
  2879. ;         ***/  Ä»Ñαᵿ¿ ß αáßΦ¿αÑ¡¡δ¼ ¬«ñ«¼ ¬«¼á¡ñδ úαπ»»δ 2  /***
  2880.  
  2881. ariph_group_2    proc    near
  2882.  
  2883.         call    operation_type
  2884.         jz    group_2_with_regs    ; ñá ==> «íαáí«ΓáѼ «Γñѽ∞¡«
  2885.         call    memory_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  2886.         call    write_group_2        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  2887.         jc    exit_group_2        ; Γᬫ⌐ ¬«¼á¡ñδ ¡ÑΓ
  2888.         call    form_memory        ; Σ«α¼¿απѼ «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  2889.         mov    di,27            ; áñαÑß ñ½∩ óδó«ñá
  2890.         call    ins_mem_reg        ; óßΓáó¿¼ »Ñαóπε »«½«ó¿¡π
  2891.         call    plus_offset        ; ñ«íáó¿¼ ß¼ÑΘÑ¡¿∩
  2892. exit_group_2:
  2893.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2894. group_2_with_regs:
  2895.         call    write_group_2        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  2896.         jc    exit_group_2
  2897.         mov    di,27
  2898.         call    insert_register        ; ºá»¿ß∞ »Ñαó«ú« αÑú¿ßΓαá
  2899.         retn
  2900.  
  2901. ariph_group_2    endp
  2902.  
  2903. ;               ***  éδó«ñ ¼¡Ñ¼«¡¿¬¿ ñ½∩ ¬«¼á¡ñ úαπ»»δ 2  ***
  2904.  
  2905. write_group_2    proc    near
  2906.  
  2907.         push    ax
  2908.         xor    ax,ax
  2909.         mov    al, byte ptr es:[bx+1]    ; al = íá⌐Γ ¬«ñá
  2910.         and    al,00111000b        ; óδñѽ¿¼ óΓ«α«⌐ «»Ñαá¡ñ
  2911.         clc                ; ßíα«ß¿¼ carry - Σ½áú
  2912.         mov    cl,3            ; »αÑ«íαẫóá¡¿Ñ Σ«α¼áΓ«ó
  2913.         shr    ax,cl
  2914.         push    ax            ; ==> ß«σαá¡¿¼ ß¼ÑΘÑ¡¿Ñ ¬«ñá
  2915.         shl    ax,1            ; ß¼ÑΘÑ¡¿Ñ ó Γáí½¿µÑ ß½«ó !
  2916.         mov    si, offset offset_group_2    ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ó
  2917.         add    si,ax            ; Γáí½¿µÑ ß¼ÑΘÑ¡¿⌐
  2918.         mov    ax, word ptr ds:[si]    ; »«½πτ¿¼ ΓαÑíπѼ«Ñ ß¼ÑΘÑ¡¿Ñ
  2919.         mov    si, offset command_symbol    ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ¡á
  2920.         add    si,ax            ; ¼áΦ¿¡¡πε ¿¡ßΓαπ¬µ¿ε
  2921.         pop    ax            ; <== óδíÑαѼ ß¼ÑΘÑ¡¿Ñ
  2922.         push    si            ; ===> ß«σαá¡¿¼ ¡á ßΓѬÑ
  2923.         mov    si, offset length_group_2
  2924.         add    si,ax            ; óδíÑαѼ ñ½¿¡π ñ½∩
  2925.         xor    cx,cx            ; »ÑαÑß佬¿
  2926.         mov    cl, byte ptr ds:[si]
  2927.         pop    si            ; <=== óδí«α¬á ß¼ÑΘÑ¡¿∩
  2928.         cmp    ax,1            ; ó Γáí½¿µπ ñ¿ºáßßѼí½Ñαá
  2929.         ja    group_2_like_db
  2930.         jmp    short  group_2_alone
  2931. group_2_like_db:
  2932.         mov    byte ptr ds:[h_add], 1    ; óßÑú« «ñ¿¡ íá⌐Γ
  2933.         pop    ax
  2934.         stc
  2935.         pushf
  2936.         call    this_db            ; «íαáí«Γ¬á ¬á¬ DB
  2937.         jmp    short  mnemo_group_2_write
  2938. group_2_alone:
  2939.         pop    ax
  2940.         clc
  2941.         pushf
  2942.         call    write_mnemo        ; óδó«ñ¿¼ ¼¡Ñ¼«¬«¼á¡ñπ
  2943. mnemo_group_2_write:
  2944.         popf
  2945.         retn
  2946.  
  2947. write_group_2    endp
  2948.  
  2949. ;         ***/  Ä»Ñαᵿ¿ ß αáßΦ¿αÑ¡¡δ¼ ¬«ñ«¼ ¬«¼á¡ñδ úαπ»»δ 3  /***
  2950.  
  2951. ariph_group_3    proc    near
  2952.  
  2953.         call    operation_type
  2954.         jz    group_3_with_regs    ; ñá ==> «íαáí«ΓáѼ «Γñѽ∞¡«
  2955.         call    memory_cost        ; óδí«α¬á ß¼ÑΘÑ¡¿⌐
  2956.         call    write_group_3        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  2957.         jc    exit_group_3        ; Γᬫ⌐ ¬«¼á¡ñδ ¡ÑΓ
  2958.         call    form_memory        ; Σ«α¼¿απѼ «»Ñαᵿ¿ ß »á¼∩Γ∞ε
  2959.         mov    di,27            ; áñαÑß ñ½∩ óδó«ñá
  2960.         call    ins_mem_reg        ; óßΓáó¿¼ »Ñαóπε »«½«ó¿¡π
  2961.         call    plus_offset        ; ñ«íáó¿¼ ß¼ÑΘÑ¡¿∩
  2962. exit_group_3:
  2963.         retn                ; óÑα¡Ñ¼ß∩ ¿º »α«µÑñπαδ
  2964. group_3_with_regs:
  2965.         call    write_group_3        ; Σ«α¼¿απѼ ¼¡Ñ¼«¬«¼á¡ñπ
  2966.         jc    exit_group_3
  2967.         mov    di,27
  2968.         call    insert_register        ; ºá»¿ß∞ »Ñαó«ú« αÑú¿ßΓαá
  2969.         retn
  2970.  
  2971. ariph_group_3    endp
  2972.  
  2973. ;               ***  éδó«ñ ¼¡Ñ¼«¡¿¬¿ ñ½∩ ¬«¼á¡ñ úαπ»»δ 3  ***
  2974.  
  2975. write_group_3    proc    near
  2976.  
  2977.         push    ax
  2978.         xor    ax,ax
  2979.         mov    al, byte ptr es:[bx+1]    ; al = íá⌐Γ ¬«ñá
  2980.         and    al,00111000b        ; óδñѽ¿¼ óΓ«α«⌐ «»Ñαá¡ñ
  2981.         clc                ; ßíα«ß¿¼ carry - Σ½áú
  2982.         mov    cl,3            ; »αÑ«íαẫóá¡¿Ñ Σ«α¼áΓ«ó
  2983.         shr    ax,cl
  2984.         push    ax            ; ==> ß«σαá¡¿¼ ß¼ÑΘÑ¡¿Ñ ¬«ñá
  2985.         shl    ax,1               ; ß¼ÑΘÑ¡¿Ñ ó Γáí½¿µÑ ß½«ó !
  2986.         mov    si, offset offset_group_3  ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ó
  2987.         add    si,ax               ; Γáí½¿µÑ ß¼ÑΘÑ¡¿⌐
  2988.         mov    ax, word ptr ds:[si]       ; »«½πτ¿¼ ΓαÑíπѼ«Ñ ß¼ÑΘÑ¡¿Ñ
  2989.         mov    si, offset command_symbol  ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ¡á
  2990.         add    si,ax               ; ¼áΦ¿¡¡πε ¿¡ßΓαπ¬µ¿ε
  2991.         pop    ax            ; <== óδíÑαѼ ß¼ÑΘÑ¡¿Ñ
  2992.         push    si            ; ===> ß«σαá¡¿¼ ¡á ßΓѬÑ
  2993.         mov    si, offset length_group_3
  2994.         add    si,ax            ; óδíÑαѼ ñ½¿¡π ñ½∩
  2995.         xor    cx,cx            ; »ÑαÑß佬¿
  2996.         mov    cl, byte ptr ds:[si]
  2997.         pop    si            ; <=== óδí«α¬á ß¼ÑΘÑ¡¿∩
  2998.         cmp    ax,7            ; ó Γáí½¿µπ ñ¿ºáßßѼí½Ñαá
  2999.         jz    group_3_like_db
  3000.         cmp    ax,2
  3001.         jz    exp_w_c_j_p
  3002.         cmp    ax,3
  3003.         jz    exp_d_c_j
  3004.         cmp    ax,4
  3005.         jz    exp_w_c_j_p
  3006.         cmp    ax,5
  3007.         jz    exp_d_c_j
  3008.         cmp    ax,6
  3009.         jz    exp_w_c_j_p
  3010.         jmp    short  group_3_alone
  3011. group_3_like_db:
  3012.         mov    byte ptr ds:[h_add], 1    ; óßÑú« «ñ¿¡ íá⌐Γ
  3013.         pop    ax
  3014.         stc
  3015.         pushf
  3016.         call    this_db                ; «íαáí«Γ¬á ¬á¬ DB
  3017.         jmp    short  mnemo_group_3_write
  3018. exp_w_c_j_p:
  3019.         mov    byte ptr ds:[byte_word], 2    ; word - «»Ñαᵿ∩
  3020.         jmp    short  group_3_alone
  3021. exp_d_c_j:
  3022.         mov    byte ptr ds:[byte_word], 3    ; dword - «»Ñαᵿ∩
  3023. group_3_alone:
  3024.         pop    ax
  3025.         clc
  3026.         pushf
  3027.         call    write_mnemo        ; óδó«ñ¿¼ ¼¡Ñ¼«¬«¼á¡ñπ
  3028. mnemo_group_3_write:
  3029.         popf
  3030.         retn
  3031.  
  3032. write_group_3    endp
  3033.  
  3034. ;                 ***  Äíß½πª¿óá¡¿Ñ ¿º¼Ñ¡Ñ¡¿⌐ ßÑú¼Ñ¡Γ«ó  ***
  3035.  
  3036. seg_reg_oper    proc    near
  3037.  
  3038.         xor    ax,ax
  3039.         mov    al, byte ptr es:[bx+1]
  3040.         mov    si, offset system_table
  3041.         add    si,ax
  3042.         mov    al, byte ptr ds:[si]
  3043.         test    al,80h
  3044.         jnz    segment_may_be_change
  3045.  
  3046.         jmp    short    like_register
  3047.  
  3048. segment_may_be_change:
  3049.         test    al,02h
  3050.         jnz    used_in_next
  3051.         test    al,04h
  3052.         jnz    like_register
  3053.         test    al,08h
  3054.         jnz    use_like_expand
  3055.         xor    ax,ax
  3056.         mov    al, byte ptr es:[bx+1]
  3057.         cmp    al,66h
  3058.         jz    used_in_next
  3059.         cmp    al,67h
  3060.         jz    used_in_next
  3061.         xor    ax,ax
  3062.         mov    al, byte ptr es:[bx+2]
  3063.         and    al,0c0h
  3064.         cmp    al,0c0h
  3065.         jz    like_register
  3066.  
  3067. used_in_next:
  3068.         mov    word ptr ds:[new_segment], dx
  3069.         inc    bx
  3070.         call    dis_asm
  3071.         dec    bx
  3072.         mov    word ptr ds:[new_segment], 0
  3073.         retn
  3074.  
  3075. use_like_expand:
  3076.         xor    ax,ax
  3077.         mov    al, byte ptr es:[bx+2]
  3078.         cmp    al,81h
  3079.         ja    no_@_arop_1
  3080.         mov    si, offset system_arop_1
  3081.         jmp    short    second_@_continue
  3082. no_@_arop_1:
  3083.         cmp    al,83h
  3084.         ja    no_@_arop_2
  3085.         mov    si, offset system_arop_2
  3086.         jmp    short    second_@_continue
  3087. no_@_arop_2:
  3088.         cmp    al,0d3h
  3089.         ja    no_@_shift
  3090.         mov    si, offset system_shift
  3091.         jmp    short    second_@_continue
  3092. no_@_shift:
  3093.         cmp    al,0f7h
  3094.         ja    no_group_1
  3095.         mov    si, offset system_group_1
  3096.         jmp    short    second_@_continue
  3097. no_group_1:
  3098.         cmp    al,0feh
  3099.         jnz    no_group_2
  3100.         mov    si, offset system_group_2
  3101.         jmp    short    second_@_continue
  3102. no_group_2:
  3103.         mov    si, offset system_group_3
  3104. second_@_continue:
  3105.         and    al,00111000b
  3106.         mov    cl,3
  3107.         clc
  3108.         shr    ax,cl
  3109.         add    si,ax
  3110.         mov    al, byte ptr ds:[si]
  3111.         test    al,80h
  3112.         jz    like_register
  3113.         jmp    short    used_in_next
  3114.  
  3115. like_register:
  3116.         mov    byte ptr ds:[h_add], 1
  3117.         xor    cx,cx
  3118.         mov    cl,3
  3119.         mov    si, offset command_symbol
  3120.         xor    ax,ax
  3121.         mov    al, byte ptr es:[bx]
  3122.         cmp    al,26h
  3123.         jnz    no_@_es
  3124.         add    si, 26fh
  3125.         jmp    short    seg_@_continue
  3126. no_@_es:
  3127.         cmp    al,2eh
  3128.         jnz    no_@_cs
  3129.         add    si, 272h
  3130.         jmp    short    seg_@_continue
  3131. no_@_cs:
  3132.         cmp    al,36h
  3133.         jnz    no_@_ss
  3134.         add    si, 275h
  3135.         jmp    short    seg_@_continue
  3136. no_@_ss:
  3137.         cmp    al,3eh
  3138.         jnz    no_@_ds
  3139.         add    si, 278h
  3140.         jmp    short    seg_@_continue
  3141. no_@_ds:
  3142.         cmp    al,64h
  3143.         jnz    no_@_fs
  3144.         add    si, 27bh
  3145.         jmp    short    seg_@_continue
  3146. no_@_fs:
  3147.         add    si, 27eh
  3148. seg_@_continue:
  3149.         call    write_mnemo
  3150.         retn
  3151.  
  3152. seg_reg_oper    endp
  3153.  
  3154.  
  3155. ;   ┌────────────────────────────────────────────────────────────────────┐
  3156. ;   │  *** ░▒▓█  ìáτὫß∞ ¡Ñ»«ßαÑñßΓóÑ¡¡«Ñ ñ¿ºáßßÑ¼í½¿α«óá¡¿Ñ  █▓▒░ ***  │
  3157. ;   └────────────────────────────────────────────────────────────────────┘
  3158.  
  3159.  
  3160. code_00h    proc    near
  3161.  
  3162.         mov    ah,1
  3163.         call    this_rm_r8_r16
  3164.         retn
  3165.  
  3166. code_00h    endp
  3167.  
  3168. code_01h    proc    near
  3169.  
  3170.         mov    ah,2
  3171.         call    this_rm_r8_r16
  3172.         retn
  3173.  
  3174. code_01h    endp
  3175.  
  3176. code_02h    proc    near
  3177.  
  3178.         mov    ah,1
  3179.         call    this_r8_r16_rm
  3180.         retn
  3181.  
  3182. code_02h    endp
  3183.  
  3184. code_03h    proc    near
  3185.  
  3186.         mov    ah,2
  3187.         call    this_r8_r16_rm
  3188.         retn
  3189.  
  3190. code_03h    endp
  3191.  
  3192. code_04h    proc    near
  3193.  
  3194.         mov  ah,1
  3195.         call ali8_axi16
  3196.         retn
  3197.  
  3198. code_04h    endp
  3199.  
  3200. code_05h    proc    near
  3201.  
  3202.         mov  ah,2
  3203.         call ali8_axi16
  3204.         retn
  3205.  
  3206. code_05h    endp
  3207.  
  3208. code_06h    proc    near
  3209.  
  3210.         mov    ax,6
  3211.         mov    dx,1
  3212.         call    push_pop_oper
  3213.         retn
  3214.  
  3215. code_06h    endp
  3216.  
  3217. code_07h    proc    near
  3218.  
  3219.         mov    ax,6
  3220.         mov    dx,1
  3221.         call    push_pop_oper
  3222.         retn
  3223.  
  3224. code_07h    endp
  3225.  
  3226. code_0eh    proc    near
  3227.  
  3228.         mov    ax,2
  3229.         mov    dx,1
  3230.         call    push_pop_oper
  3231.         retn
  3232.  
  3233. code_0eh    endp
  3234.  
  3235. code_0fh    proc    near
  3236.  
  3237.         call    this_db
  3238.         retn
  3239.  
  3240. code_0fh    endp
  3241.  
  3242. code_16h    proc    near
  3243.  
  3244.         mov    ax,4
  3245.         mov    dx,1
  3246.         call    push_pop_oper
  3247.         retn
  3248.  
  3249. code_16h    endp
  3250.  
  3251. code_17h    proc    near
  3252.  
  3253.         mov    ax,4
  3254.         mov    dx,1
  3255.         call    push_pop_oper
  3256.         retn
  3257.  
  3258. code_17h    endp
  3259.  
  3260. code_1eh    proc    near
  3261.  
  3262.         mov    ax,0
  3263.         mov    dx,1
  3264.         call    push_pop_oper
  3265.         retn
  3266.  
  3267. code_1eh    endp
  3268.  
  3269. code_1fh    proc    near
  3270.  
  3271.         mov    ax,0
  3272.         mov    dx,1
  3273.         call    push_pop_oper
  3274.         retn
  3275.  
  3276. code_1fh    endp
  3277.  
  3278. code_26h    proc    near
  3279.  
  3280.         mov    dx,06h
  3281.         call    seg_reg_oper
  3282.         retn
  3283.  
  3284. code_26h    endp
  3285.  
  3286. code_27h    proc    near
  3287.  
  3288.         call    write_mnemo
  3289.         retn
  3290.  
  3291. code_27h    endp
  3292.  
  3293. code_2eh    proc    near
  3294.  
  3295.         mov    dx,02h
  3296.         call    seg_reg_oper
  3297.         retn
  3298.  
  3299. code_2eh    endp
  3300.  
  3301. code_36h    proc    near
  3302.  
  3303.         mov    dx,04h
  3304.         call    seg_reg_oper
  3305.         retn
  3306.  
  3307. code_36h    endp
  3308.  
  3309. code_3eh    proc    near
  3310.  
  3311.         mov    dx,00h
  3312.         call    seg_reg_oper
  3313.         retn
  3314.  
  3315. code_3eh    endp
  3316.  
  3317. code_40h    proc    near
  3318.  
  3319.         mov    ax,16
  3320.         xor    dx,dx
  3321.         cmp    byte ptr ds:[cpu_mode_1], 0
  3322.         jz    no_40h_32bit_reg
  3323.         xor    ax,ax
  3324.         mov    dx,2
  3325. no_40h_32bit_reg:
  3326.         call    push_pop_oper
  3327.         retn
  3328.  
  3329. code_40h    endp
  3330.  
  3331. code_41h    proc    near
  3332.  
  3333.         mov    ax,18
  3334.         xor    dx,dx
  3335.         cmp    byte ptr ds:[cpu_mode_1], 0
  3336.         jz    no_41h_32bit_reg
  3337.         mov    ax,3
  3338.         mov    dx,2
  3339. no_41h_32bit_reg:
  3340.         call    push_pop_oper
  3341.         retn
  3342.  
  3343. code_41h    endp
  3344.  
  3345. code_42h    proc    near
  3346.  
  3347.         mov    ax,20
  3348.         xor    dx,dx
  3349.         cmp    byte ptr ds:[cpu_mode_1], 0
  3350.         jz    no_42h_32bit_reg
  3351.         mov    ax,6
  3352.         mov    dx,2
  3353. no_42h_32bit_reg:
  3354.         call    push_pop_oper
  3355.         retn
  3356.  
  3357. code_42h    endp
  3358.  
  3359. code_43h    proc    near
  3360.  
  3361.         mov    ax,22
  3362.         xor    dx,dx
  3363.         cmp    byte ptr ds:[cpu_mode_1], 0
  3364.         jz    no_43h_32bit_reg
  3365.         mov    ax,9
  3366.         mov    dx,2
  3367. no_43h_32bit_reg:
  3368.         call    push_pop_oper
  3369.         retn
  3370.  
  3371. code_43h    endp
  3372.  
  3373. code_44h    proc    near
  3374.  
  3375.         mov    ax,24
  3376.         xor    dx,dx
  3377.         cmp    byte ptr ds:[cpu_mode_1], 0
  3378.         jz    no_44h_32bit_reg
  3379.         mov    ax,12
  3380.         mov    dx,2
  3381. no_44h_32bit_reg:
  3382.         call    push_pop_oper
  3383.         retn
  3384.  
  3385. code_44h    endp
  3386.  
  3387. code_45h    proc    near
  3388.  
  3389.         mov    ax,26
  3390.         xor    dx,dx
  3391.         cmp    byte ptr ds:[cpu_mode_1], 0
  3392.         jz    no_45h_32bit_reg
  3393.         mov    ax,15
  3394.         mov    dx,2
  3395. no_45h_32bit_reg:
  3396.         call    push_pop_oper
  3397.         retn
  3398.  
  3399. code_45h    endp
  3400.  
  3401. code_46h    proc    near
  3402.  
  3403.         mov    ax,28
  3404.         xor    dx,dx
  3405.         cmp    byte ptr ds:[cpu_mode_1], 0
  3406.         jz    no_46h_32bit_reg
  3407.         mov    ax,18
  3408.         mov    dx,2
  3409. no_46h_32bit_reg:
  3410.         call    push_pop_oper
  3411.         retn
  3412.  
  3413. code_46h    endp
  3414.  
  3415. code_47h    proc    near
  3416.  
  3417.         mov    ax,30
  3418.         xor    dx,dx
  3419.         cmp    byte ptr ds:[cpu_mode_1], 0
  3420.         jz    no_47h_32bit_reg
  3421.         mov    ax,21
  3422.         mov    dx,2
  3423. no_47h_32bit_reg:
  3424.         call    push_pop_oper
  3425.         retn
  3426.  
  3427. code_47h    endp
  3428.  
  3429. code_60h    proc    near
  3430.  
  3431.         cmp    byte ptr ds:[cpu_mode_1], 0
  3432.         jz    no_32bit_push
  3433.         add    si,5
  3434.         inc    cx
  3435. no_32bit_push:
  3436.         call    write_mnemo
  3437.         retn
  3438.  
  3439. code_60h    endp
  3440.  
  3441. code_61h    proc    near
  3442.  
  3443.         cmp    byte ptr ds:[cpu_mode_1], 0
  3444.         jz    no_32bit_pop
  3445.         add    si,4
  3446.         inc    cx
  3447. no_32bit_pop:
  3448.         call    write_mnemo
  3449.         retn
  3450.  
  3451. code_61h    endp
  3452.  
  3453. code_64h    proc    near
  3454.  
  3455.         mov    dx,0ah
  3456.         call    seg_reg_oper
  3457.         retn
  3458.  
  3459. code_64h    endp
  3460.  
  3461. code_65h    proc    near
  3462.  
  3463.         mov    dx,0ch
  3464.         call    seg_reg_oper
  3465.         retn
  3466.  
  3467. code_65h    endp
  3468.  
  3469. code_66h    proc    near
  3470.  
  3471.         mov    byte ptr ds:[cpu_mode_1], 1
  3472.         inc    bx
  3473.         call    dis_asm
  3474.         dec    bx
  3475.         mov    byte ptr ds:[cpu_mode_1], 0
  3476.         retn
  3477.  
  3478. code_66h    endp
  3479.  
  3480. code_67h    proc    near
  3481.  
  3482.         mov    byte ptr ds:[cpu_mode_2], 1
  3483.         inc    bx
  3484.         call    dis_asm
  3485.         dec    bx
  3486.         mov    byte ptr ds:[cpu_mode_2], 0
  3487.         retn
  3488.  
  3489. code_67h    endp
  3490.  
  3491. code_68h    proc    near
  3492.  
  3493.         call    count_detect
  3494.         call    write_mnemo
  3495.         mov    si, offset string
  3496.         add    si,27
  3497.         call    insert_number
  3498.         retn
  3499.  
  3500. code_68h    endp
  3501.  
  3502. code_69h    proc    near
  3503.  
  3504.         call    count_detect
  3505.         call    code_03h
  3506.         mov    byte ptr ds:[di], 2ch    ; ','
  3507.         inc    di
  3508.         mov    si,di
  3509.         push    bx
  3510.         xor    ax,ax
  3511.         mov    al, byte ptr ds:[off_code]
  3512.         add    bx,ax
  3513.         inc    bx
  3514.         call    insert_number
  3515.         pop    bx
  3516.         retn
  3517.  
  3518. code_69h    endp
  3519.  
  3520. code_6ah    proc    near
  3521.  
  3522.         inc    byte ptr ds:[h_add]
  3523.         call    write_mnemo
  3524.         mov    si, offset string
  3525.         add    si,27
  3526.         call    insert_byte_num
  3527.         retn
  3528.  
  3529. code_6ah    endp
  3530.  
  3531. code_6bh    proc    near
  3532.  
  3533.         inc    byte ptr ds:[h_add]
  3534.         call    code_03h
  3535.         mov    byte ptr ds:[di], 2ch    ; ','
  3536.         inc    di
  3537.         mov    si,di
  3538.         push    bx
  3539.         xor    ax,ax
  3540.         mov    al, byte ptr ds:[off_code]
  3541.         add    bx,ax
  3542.         inc    bx
  3543.         call    insert_byte_num
  3544.         pop    bx
  3545.         retn
  3546.  
  3547. code_6bh    endp
  3548.  
  3549. code_6dh    proc    near
  3550.  
  3551.         cmp    byte ptr ds:[cpu_mode_1], 0
  3552.         jz    no_32bit_insd
  3553.         add    si,4
  3554. no_32bit_insd:
  3555.         call    write_mnemo
  3556.         retn
  3557.  
  3558. code_6dh    endp
  3559.  
  3560. code_6fh    proc    near
  3561.  
  3562.         cmp    byte ptr ds:[cpu_mode_1], 0
  3563.         jz    no_32bit_outsd
  3564.         add    si,5
  3565. no_32bit_outsd:
  3566.         call    write_mnemo
  3567.         retn
  3568.  
  3569. code_6fh    endp
  3570.  
  3571. code_70h    proc    near
  3572.  
  3573.         inc    byte ptr ds:[h_add]    ; »½εß íá⌐Γ ß¼ÑΘÑ¡¿∩
  3574.         call    write_mnemo        ; óδó«ñ ¼¡Ñ¼«¡¿¬¿ ¬«¼á¡ñδ
  3575.         call    form_curr_adr        ; Σ«α¼¿α«óá¡¿Ñ ΓѬπΘÑú« áñαÑßá
  3576.         xor    ax,ax
  3577.         mov    al, byte ptr es:[bx+1]    ; íá⌐Γ ß¼ÑΘÑ¡¿∩
  3578.         mov    dx,1            ; Γ«½∞¬« íá⌐Γ
  3579.         call    form_new_adr        ; úÑ¡Ñαᵿ∩ ¡«ó«ú« áñαÑßá
  3580.         call    write_adress        ; óδó«ñ ¡«ó«ú« áñαÑßá
  3581.         retn
  3582.  
  3583. code_70h    endp
  3584.  
  3585. code_80h    proc    near
  3586.  
  3587.         mov    ah,1
  3588.         inc    byte ptr ds:[h_add]    ; íπñÑΓ óδí«α¬á i8
  3589.         call    ariph_oper_1
  3590.         retn
  3591.  
  3592. code_80h    endp
  3593.  
  3594. code_81h    proc    near
  3595.  
  3596.         mov    ah,2
  3597.         call    ariph_oper_1
  3598.         retn
  3599.  
  3600. code_81h    endp
  3601.  
  3602. code_82h    proc    near
  3603.  
  3604.         mov    ah,1
  3605.         inc    byte ptr ds:[h_add]    ; íπñÑΓ óδí«α¬á i8
  3606.         call    ariph_oper_2
  3607.         retn
  3608.  
  3609. code_82h    endp
  3610.  
  3611. code_83h    proc    near
  3612.  
  3613.         mov    ah,2
  3614.         inc    byte ptr ds:[h_add]    ; íπñÑΓ óδí«α¬á i8
  3615.         call    ariph_oper_2
  3616.         retn
  3617.  
  3618. code_83h    endp
  3619.  
  3620. code_8ch    proc    near
  3621.  
  3622.         mov    ah,2
  3623.         call    rm_seg_reg
  3624.         retn
  3625.  
  3626. code_8ch    endp
  3627.  
  3628. code_8dh    proc    near
  3629.  
  3630.         mov    ah,2
  3631.         call    lea_operation
  3632.         retn
  3633.  
  3634. code_8dh    endp
  3635.  
  3636. code_8eh    proc    near
  3637.  
  3638.         mov    ah,2
  3639.         call    seg_reg_rm
  3640.         retn
  3641.  
  3642. code_8eh    endp
  3643.  
  3644. code_8fh    proc    near
  3645.  
  3646.         mov    ah,2
  3647.         call    pop_rm_oper
  3648.         retn
  3649.  
  3650. code_8fh    endp
  3651.  
  3652. code_91h    proc    near
  3653.  
  3654.         call    write_mnemo
  3655.         call    simple_record
  3656.         retn
  3657.  
  3658. code_91h    endp
  3659.  
  3660. code_98h    proc    near
  3661.  
  3662.         cmp    byte ptr ds:[cpu_mode_1], 0
  3663.         jz    no_32bit_cwde
  3664.         add    si,2bh
  3665.         inc    cx
  3666. no_32bit_cwde:
  3667.         call    write_mnemo
  3668.         retn
  3669.  
  3670. code_98h    endp
  3671.  
  3672. code_99h    proc    near
  3673.  
  3674.         cmp    byte ptr ds:[cpu_mode_1], 0
  3675.         jz    no_32bit_cdq
  3676.         sub    si,25h
  3677. no_32bit_cdq:
  3678.         call    write_mnemo
  3679.         retn
  3680.  
  3681. code_99h    endp
  3682.  
  3683. code_9ah    proc    near
  3684.  
  3685.         call    form_far_record
  3686.         call    write_mnemo
  3687.         retn
  3688.  
  3689. code_9ah    endp
  3690.  
  3691. code_9ch    proc    near
  3692.  
  3693.         cmp    byte ptr ds:[cpu_mode_1], 0
  3694.         jz    no_32bit_pushfd
  3695.         add    si,5
  3696.         inc    cx
  3697. no_32bit_pushfd:
  3698.         call    write_mnemo
  3699.         retn
  3700.  
  3701. code_9ch    endp
  3702.  
  3703. code_9dh    proc    near
  3704.  
  3705.         cmp    byte ptr ds:[cpu_mode_1], 0
  3706.         jz    no_32bit_popfd
  3707.         add    si,4
  3708.         inc    cx
  3709. no_32bit_popfd:
  3710.         call    write_mnemo
  3711.         retn
  3712.  
  3713. code_9dh    endp
  3714.  
  3715. code_a0h    proc    near
  3716.  
  3717.         mov    ah,1
  3718.         call    alx_mem8_16
  3719.         retn
  3720.  
  3721. code_a0h    endp
  3722.  
  3723. code_a1h    proc    near
  3724.  
  3725.         mov    ah,2
  3726.         call    alx_mem8_16
  3727.         retn
  3728.  
  3729. code_a1h    endp
  3730.  
  3731. code_a2h    proc    near
  3732.  
  3733.         mov    ah,1
  3734.         call    mem8_16_alx
  3735.         retn
  3736.  
  3737. code_a2h    endp
  3738.  
  3739. code_a3h    proc    near
  3740.  
  3741.         mov    ah,2
  3742.         call    mem8_16_alx
  3743.         retn
  3744.  
  3745. code_a3h    endp
  3746.  
  3747. code_a5h    proc    near
  3748.  
  3749.         cmp    byte ptr ds:[cpu_mode_1], 0
  3750.         jz    no_32bit_movsd
  3751.         add    si,5
  3752. no_32bit_movsd:
  3753.         call    write_mnemo
  3754.         retn
  3755.  
  3756. code_a5h    endp
  3757.  
  3758. code_b0h    proc    near
  3759.  
  3760.         mov    ah,1
  3761.         call    alax_bhdi_im8_16
  3762.         retn
  3763.  
  3764. code_b0h    endp
  3765.  
  3766. code_b8h    proc    near
  3767.  
  3768.         mov    ah,2
  3769.         call    alax_bhdi_im8_16
  3770.         retn
  3771.  
  3772. code_b8h    endp
  3773.  
  3774. code_c0h    proc    near
  3775.  
  3776.         mov    ah,1
  3777.         call    shift_oper_im
  3778.         retn
  3779.  
  3780. code_c0h    endp
  3781.  
  3782. code_c1h    proc    near
  3783.  
  3784.         mov    ah,2
  3785.         call    shift_oper_im
  3786.         retn
  3787.  
  3788. code_c1h    endp
  3789.  
  3790. code_c2h    proc    near
  3791.  
  3792.         mov    ah,3
  3793.         call    return_oper
  3794.         retn
  3795.  
  3796. code_c2h    endp
  3797.  
  3798. code_c3h    proc    near
  3799.  
  3800.         mov    ah,1
  3801.         call    return_oper
  3802.         retn
  3803.  
  3804. code_c3h    endp
  3805.  
  3806. code_c6h    proc    near
  3807.  
  3808.         mov    ah,1
  3809.         call    this_mem_im8_16
  3810.         retn
  3811.  
  3812. code_c6h    endp
  3813.  
  3814. code_c7h    proc    near
  3815.  
  3816.         mov    ah,2
  3817.         call    this_mem_im8_16
  3818.         retn
  3819.  
  3820. code_c7h    endp
  3821.  
  3822. code_c8h    proc    near
  3823.  
  3824.         call    count_detect
  3825.         inc    byte ptr ds:[h_add]
  3826.         call    write_mnemo
  3827.         mov    si, offset string
  3828.         add    si,27
  3829.         call    insert_number
  3830.         inc    si
  3831.         mov    byte ptr ds:[si], 2ch    ; ','
  3832.         inc    si
  3833.         push    bx
  3834.         add    bx,2
  3835.         cmp    byte ptr ds:[cpu_mode_1], 0
  3836.         jz    d32_@_enter
  3837.         add    bx,2
  3838. d32_@_enter:
  3839.         call    insert_byte_num
  3840.         pop    bx
  3841.         retn
  3842.  
  3843. code_c8h    endp
  3844.  
  3845. code_cah    proc    near
  3846.  
  3847.         mov    ah,4
  3848.         call    return_oper
  3849.         retn
  3850.  
  3851. code_cah    endp
  3852.  
  3853. code_cbh    proc    near
  3854.  
  3855.         mov    ah,2
  3856.         call    return_oper
  3857.         retn
  3858.  
  3859. code_cbh    endp
  3860.  
  3861. code_cdh    proc    near
  3862.  
  3863.         mov    al, byte ptr es:[bx]
  3864.         cmp    al,0cch            ; int 3 ?
  3865.         jz    one_byte_int
  3866.         inc    byte ptr ds:[h_add]    ; »½εß ¡«¼Ñα »αÑαδóá¡¿∩
  3867.         call    write_mnemo        ; óδó«ñ¿¼ ¼¡Ñ¼«¬«¼á¡ñπ
  3868.         xor    ax,ax
  3869.         mov    al,byte ptr es:[bx+1]    ; óδí¿αáѼ íá⌐Γ ¡«¼Ñαá
  3870. print_int:
  3871.         mov    si, offset string
  3872.         add    si,29            ; Σ«α¼¿απѼ ß¼ÑΘÑ¡¿Ñ
  3873.         mov    byte ptr ds:[si], 68h    ; ñ«»¿ßδóáѼ 'h'
  3874.         dec    si
  3875.         call    conv_to_hex        ; »αÑ«íαẫóδóáѼ ó ßΓ᫬π
  3876.         retn        
  3877. one_byte_int:
  3878.         call    write_mnemo        ; óδó«ñ¿¼ ¼¡Ñ¼«¬«¼á¡ñπ
  3879.         xor    ax,ax
  3880.         mov    al,3            ; debugger int 3
  3881.         jmp    short  print_int
  3882.  
  3883. code_cdh    endp
  3884.  
  3885. code_cfh    proc    near
  3886.  
  3887.         cmp    byte ptr ds:[cpu_mode_1], 0
  3888.         jz    no_32bit_iretd
  3889.         add    si,4
  3890.         inc    cx
  3891. no_32bit_iretd:
  3892.         call    write_mnemo
  3893.         retn
  3894.  
  3895. code_cfh    endp
  3896.  
  3897. code_d0h    proc    near
  3898.  
  3899.         mov    ah,1
  3900.         call    shift_oper_1
  3901.         retn
  3902.  
  3903. code_d0h    endp
  3904.  
  3905. code_d1h    proc    near
  3906.  
  3907.         mov    ah,2
  3908.         call    shift_oper_1
  3909.         retn
  3910.  
  3911. code_d1h    endp
  3912.  
  3913. code_d2h    proc    near
  3914.  
  3915.         mov    ah,1
  3916.         call    shift_oper_cl
  3917.         retn
  3918.  
  3919. code_d2h    endp
  3920.  
  3921. code_d3h    proc    near
  3922.  
  3923.         mov    ah,2
  3924.         call    shift_oper_cl
  3925.         retn
  3926.  
  3927. code_d3h    endp
  3928.  
  3929. code_d4h    proc    near
  3930.  
  3931.         inc    byte ptr ds:[h_add]
  3932.         call    write_mnemo
  3933.         retn
  3934.  
  3935. code_d4h    endp
  3936.  
  3937. code_d6h    proc    near
  3938.  
  3939.         call    this_db
  3940.         retn
  3941.  
  3942. code_d6h    endp
  3943.  
  3944. code_d8h    proc    near
  3945.  
  3946.         call    write_mnemo
  3947.         retn
  3948.  
  3949. code_d8h    endp
  3950.  
  3951. code_e4h    proc    near
  3952.  
  3953.         push    cx
  3954.         push    si
  3955.         inc    byte ptr ds:[h_add]
  3956.         mov    di, offset string
  3957.         add    di,27                ; »Ñαóδ⌐ íá⌐Γ ¬«¼á¡ñδ
  3958.         cmp    byte ptr ds:[cpu_mode_1], 1
  3959.         jz    d32_in_i8_oper
  3960.         mov    si, offset command_regist
  3961.         xor    ax,ax
  3962.         mov    al, byte ptr es:[bx]
  3963.         cmp    al,0e4h
  3964.         jz    no_@_in_corr
  3965.         add    si,16
  3966. no_@_in_corr:
  3967.         push    es
  3968.         push    ds
  3969.         pop    es
  3970.         cld
  3971.         movsw
  3972.         pop    es
  3973.         jmp    short    in_i8_continue
  3974. d32_in_i8_oper:
  3975.         mov    si, offset com_386_regist
  3976.         mov    cx,3
  3977.         push    es
  3978.         push    ds
  3979.         pop    es
  3980.         cld
  3981.         rep    movsb
  3982.         pop    es
  3983. in_i8_continue:
  3984.         mov    byte ptr ds:[di], 2ch    ; ','
  3985.         inc    di
  3986.         mov    si,di
  3987.         call    insert_byte_num
  3988.         pop    si
  3989.         pop    cx
  3990.         call    write_mnemo        ; óδó«ñ ¼¡Ñ¼«¬«¼á¡ñπ
  3991.         retn
  3992.  
  3993. code_e4h    endp
  3994.  
  3995. code_e6h    proc    near
  3996.  
  3997.         push    cx
  3998.         push    si
  3999.         inc    byte ptr ds:[h_add]
  4000.         mov    byte ptr ds:[byte_word], 1
  4001.         mov    di, offset string
  4002.         add    di,27            ; »Ñαóδ⌐ íá⌐Γ ¬«¼á¡ñδ
  4003.         mov    si,di
  4004.         call    insert_byte_num
  4005.         add    di,3
  4006.         mov    byte ptr ds:[di], 2ch    ; ','
  4007.         inc    di
  4008.         xor    ax,ax
  4009.         mov    al, byte ptr es:[bx]
  4010.         cmp    al,0e7h            ; ¬«ñ ¬«¼á¡ñδ 0e7h ?
  4011.         jnz    no_word_out
  4012.         mov    byte ptr ds:[byte_word], 2    ; ß½«ó«
  4013. no_word_out:
  4014.         call    mode_detect        ; óδó«ñ al (ax)
  4015.         pop    si
  4016.         pop    cx
  4017.         call    write_mnemo        ; óδó«ñ ¼¡Ñ¼«¬«¼á¡ñπ
  4018.         retn
  4019.  
  4020. code_e6h    endp
  4021.  
  4022. code_e8h    proc    near
  4023.  
  4024.         add    byte ptr ds:[h_add], 2    ; »½εß 2 íá⌐Γá ß¼ÑΘÑ¡¿∩
  4025.         call    write_mnemo        ; óδó«ñ ¼¡Ñ¼«¡¿¬¿ ¬«¼á¡ñδ
  4026.         call    form_curr_adr        ; Σ«α¼¿α«óá¡¿Ñ ΓѬπΘÑú« áñαÑßá
  4027.         xor    ax,ax
  4028.         mov    ax, word ptr es:[bx+1]    ; ß½«ó« ß¼ÑΘÑ¡¿∩
  4029.         mov    dx,2            ; ß½«ó« óδíαáΓ∞
  4030.         call    form_new_adr        ; úÑ¡Ñαᵿ∩ ¡«ó«ú« áñαÑßá
  4031.         call    write_adress        ; óδó«ñ ¡«ó«ú« áñαÑßá
  4032.         retn
  4033.  
  4034. code_e8h    endp
  4035.  
  4036. code_ech    proc    near
  4037.  
  4038.         mov    byte ptr ds:[byte_word], 1
  4039.         xor    ax,ax
  4040.         mov    al, byte ptr es:[bx]
  4041.         cmp    al,0ech
  4042.         jz    this_in_al_dx
  4043.         mov    byte ptr ds:[byte_word], 2
  4044. this_in_al_dx:
  4045.         call    write_mnemo        ; óδó«ñ¿¼ ¼¡Ñ¼«¬«¼á¡ñπ
  4046.         mov    di, offset string    ; Σ«α¼¿απѼ ß¼ÑΘÑ¡¿Ñ ñ½∩
  4047.         add    di,27            ; óδó«ñá
  4048.         call    write_al_ax        ; óδó«ñ al(ax)
  4049.         mov    word ptr ds:[di], 7864h    ; 'dx'
  4050.         retn
  4051.  
  4052. code_ech    endp
  4053.  
  4054. code_eeh    proc    near
  4055.  
  4056.         mov    di, offset string
  4057.         add    di,27            ; »Ñαóδ⌐ íá⌐Γ ¬«¼á¡ñδ
  4058.         mov    word ptr ds:[di], 7864h    ; 'dx'
  4059.         inc    di
  4060.         inc    di
  4061.         mov    byte ptr ds:[di], 2ch    ; ','
  4062.         inc    di
  4063.         cmp    byte ptr ds:[cpu_mode_1], 1
  4064.         jz    d32_out
  4065.         mov    word ptr ds:[di], 'la'    ; al
  4066.         xor    ax,ax
  4067.         mov    al, byte ptr es:[bx]
  4068.         cmp    al,0eeh
  4069.         jz    this_out_dx_al
  4070.         mov    word ptr ds:[di], 'xa'    ; ax
  4071.         jmp    short    this_out_dx_al
  4072. d32_out:
  4073.         mov    word ptr ds:[di], 'ae'    ; eax
  4074.         mov    byte ptr ds:[di+2], 'x'
  4075. this_out_dx_al:
  4076.         call    write_mnemo        ; óδó«ñ ¼¡Ñ¼«¬«¼á¡ñπ
  4077.         retn
  4078.  
  4079. code_eeh    endp
  4080.  
  4081. code_f2h    proc    near
  4082.  
  4083.         xor    ax,ax
  4084.         mov    al, byte ptr es:[bx+1]    ; al = íá⌐Γ ¬«ñá
  4085.         mov    di, offset system_table
  4086.         add    di,ax
  4087.         xor    dx,dx
  4088.         mov    dl, byte ptr ds:[di]
  4089.         and    dx,0010h
  4090.         cmp    dx,10h
  4091.         jz    repeat
  4092.         call    write_mnemo        ; óδó«ñ¿¼ ¼¡Ñ¼«¬«¼á¡ñπ
  4093.         retn
  4094. repeat:
  4095.         inc    byte ptr ds:[h_add]    ; ñ½¿¡á ¬«¼á¡ñδ = 2
  4096.         call    write_mnemo        ; óδó«ñ¿¼ ¼¡Ñ¼«¬«¼á¡ñπ
  4097.         xor    ax,ax
  4098.         mov    al, byte ptr es:[bx+1]    ; al = íá⌐Γ ¬«ñá
  4099.         push    ax            ; ==> ß«σαá¡¿¼ ß¼ÑΘÑ¡¿Ñ ¬«ñá
  4100.         shl    ax,1            ; ß¼ÑΘÑ¡¿Ñ ó Γáí½¿µÑ ß½«ó !
  4101.         mov    si, offset offset_table    ; »«½πτ¿¼ ß¼ÑΘÑ¡¿Ñ ó
  4102.         add    si,ax
  4103.         mov    ax, word ptr ds:[si]
  4104.         mov    si, offset command_symbol
  4105.         add    si,ax
  4106.         pop    ax            ; <== óδíÑαѼ ß¼ÑΘÑ¡¿Ñ
  4107.         push    si            ; ===> ß«σαá¡¿¼ ¡á ßΓѬÑ
  4108.         mov    si, offset length_table
  4109.         add    si,ax
  4110.         xor    cx,cx
  4111.         mov    cl, byte ptr ds:[si]
  4112.         pop    si            ; <=== óδí«α¬á ß¼ÑΘÑ¡¿∩
  4113.         mov    di, offset string
  4114.         add    di,27                ; óδτ¿ß½¿¼ ß¼ÑΘÑ¡¿Ñ
  4115.         cmp    byte ptr ds:[cpu_mode_1], 0
  4116.         jz    d32_rep
  4117.         xor    ax,ax
  4118.         mov    al, byte ptr es:[bx+1]
  4119.         push    ax
  4120.         push    di
  4121.         mov    di, offset system_table
  4122.         add    di,ax
  4123.         xor    dx,dx
  4124.         mov    dl, byte ptr ds:[di]
  4125.         pop    di
  4126.         pop    ax
  4127.         and    dx,0008h
  4128.         cmp    dx,8
  4129.         jnz    d32_rep
  4130.         cmp    al,6dh
  4131.         jnz    no_insw
  4132.         dec    si
  4133. no_insw:
  4134.         add    si,5
  4135. d32_rep:
  4136.         push    es
  4137.         push    cs
  4138.         pop    es
  4139.         cld                ; ßíα«ß¿¼ Σ½áú ¡á»αáó½Ñ¡¿∩
  4140.         rep    movsb            ; »ÑαÑΦ½Ñ¼ íá⌐Γδ
  4141.         pop    es
  4142.         retn
  4143.  
  4144. code_f2h    endp
  4145.  
  4146. code_f6h    proc    near
  4147.  
  4148.         mov    ah,1
  4149.         call    ariph_group_1
  4150.         retn
  4151.  
  4152. code_f6h    endp
  4153.  
  4154. code_f7h    proc    near
  4155.  
  4156.         mov    ah,2
  4157.         call    ariph_group_1
  4158.         retn
  4159.  
  4160. code_f7h    endp
  4161.  
  4162. code_feh    proc    near
  4163.  
  4164.         mov    ah,1
  4165.         call    ariph_group_2
  4166.         retn
  4167.  
  4168. code_feh    endp
  4169.  
  4170. code_ffh    proc    near
  4171.  
  4172.         mov    ah,2
  4173.         call    ariph_group_3
  4174.         retn
  4175.  
  4176. code_ffh    endp
  4177.