?login_element?

Subversion Repositories NedoOS

Rev

Rev 1289 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; ----------------------------------------------------------------------
  2. ; Распарсить данные из (_param_ip) и вывести на экран
  3. ; ----------------------------------------------------------------------
  4.  
  5. decode_line:
  6.  
  7.             xor     a
  8.             ld      (_param_cnt), a
  9.             ld      (_param_segpfx), a
  10.             ld      ix, _start_ix_data
  11.  
  12.             ; Чтение опкода
  13. .read:      call    read
  14.             call    deb_setprefix   ; Вычисление префикса
  15.             jr      z, .read        ; Перечитать, если это префикс
  16.             ld      h, 0
  17.             ld      l, a
  18.             ld      (ix+0), a       ; _param_opcode
  19.             and     3               ; Убрать лишние биты
  20.             ld      (ix+1), a       ; _param_bitdir
  21.  
  22.             ; Получение кода мнемоники
  23.             ld      de, opcodes_table
  24.             add     hl, de
  25.             ld      a, (hl)
  26.             and     a
  27.             jr      z, .ntskip
  28.  
  29.             ; Вывести мнемонику
  30.             ld      de, name_table
  31.             call    print_nt
  32.  
  33.             ; Префиксы LOCK, REPZ, REPNZ; перечитать
  34.             ld      a, (_param_opcode)
  35.             cp      $f0
  36.             jr      z, .read
  37.             cp      $f2
  38.             jr      z, .read
  39.             cp      $f3
  40.             jr      z, .read
  41.  
  42.             ; Расширяет мнемонику до 7 символов
  43.             call    spacexpand
  44.  
  45.             ; Получение ID номер функции операнда
  46. .ntskip:    ld      hl, (_param_opcode)
  47.             ld      h, 0
  48.             ld      de, operand_table
  49.             add     hl, de
  50.             ld      a, (hl)
  51.             and     a
  52.             ret     z
  53.  
  54.             ; hl = 2*operand_proc[ opcode ]
  55.             ld      l, a
  56.             ld      h, 0
  57.             ld      de, operand_proc
  58.             add     hl, hl
  59.             add     hl, de
  60.             ld      a, (hl)
  61.             inc     hl
  62.             ld      h, (hl)
  63.             ld      l, a
  64.             ld      a, (ix)
  65.             jp      (hl)
  66.  
  67. ; ----------------------------------------------------------------------
  68. ; Декодирование инструкции
  69. ; ----------------------------------------------------------------------
  70.  
  71. ; Печать PUSH,POP,INC,DEC r16
  72. show_405f:  and     7
  73.             set     0, (ix+1)   ; Установит 16 бит
  74.             call    print_register
  75.             ret
  76.  
  77. ; Печать инструкции АЛУ с Immediate8/16
  78. show_aluim: xor     a
  79.             call    print_register  ; al/ax
  80.             ld      a, ','
  81.             call    print_char
  82.             call    read            ; 8/16 bit
  83.             ld      c, a
  84.             bit     0, (ix+1)       ; _param_bitdir[0]
  85.             jr      nz, .p16bit
  86.             call    print_uint8
  87.             ret
  88. .p16bit:    call    read
  89.             ld      b, a
  90.             call    print_uint16
  91.             ret
  92.  
  93. ; Относительный для переходов (8 бит)
  94. show_rel8:  call    read
  95.             call    signextend
  96.             ld      hl, (_param_ip)
  97.             add     hl, bc
  98.             ld      b, h
  99.             ld      c, l
  100.             call    print_uint16
  101.             ret
  102.  
  103. ; PUSH/POP seg
  104. show_pushpopseg:
  105.  
  106.             and     00011000b
  107.             rrca
  108.             rrca
  109.             rrca
  110.             ld      de, name_seg+2
  111.             call    print_nt
  112.             ret
  113.  
  114. ; 80h, 82h Групповая операция
  115. show_grp80: call    show_modrm_alu
  116.             jp      show_i8
  117.  
  118. ; 81h <GRP> r16, i16
  119. show_grp81: call    show_modrm_alu
  120.             jp      show_i16
  121.  
  122. ; 83h <GRP> r16, i8
  123. show_grp83: call    show_modrm_alu
  124.             jp      show_i8sgn
  125.  
  126. ; Загрузить и показать АЛУ-часть
  127. show_modrm_alu:
  128.  
  129.             call    load_modrm
  130.             ld      a, (_param_reg)
  131.             ld      de, name_table+2
  132.             call    print_nt            ; Мнемоника в modrm_reg
  133.             call    spacexpand
  134.             call    print_part_rm       ; Пишется modrm_rm
  135.             ld      a, ','
  136.             call    print_char
  137.             ret
  138.  
  139. ; MOV r8, i8
  140. show_mov8:  and     7
  141.             ld      de, name_r8
  142.             call    print_nt
  143.             ld      a, ','
  144.             call    print_char          ; r8
  145.             jp      show_i8
  146.  
  147. ; MOV r16, i16
  148. show_mov16: and     7
  149.             ld      de, name_r16
  150.             call    print_nt            ; r16,
  151.             ld      a, ','
  152.             call    print_char
  153.             jp      show_i16
  154.  
  155. ; XCHG ax, r16
  156. show_xchgw: xor     a
  157.             ld      de, name_r16
  158.             call    print_nt            ; ax,
  159.             ld      a, ','
  160.             call    print_char
  161.             ld      a, (ix)
  162.             and     7
  163.             call    print_nt            ; r16
  164.             ret
  165.  
  166. ; r16, rm BOUND
  167. show_r16rm: set     0,(ix+1)            ; 16-бит
  168.             set     1,(ix+1)            ; dir=1
  169.             call    show_modrm
  170.             ret
  171.  
  172. ; rm, r16 ARPL
  173. show_rmr16: set     0,(ix+1)            ; 16-бит
  174.             res     1,(ix+1)            ; dir=0
  175.             call    show_modrm
  176.             ret
  177.  
  178. ; i8 sign extend
  179. show_i8sgn: call    read
  180.             call    signextend
  181.             call    print_uint16
  182.             ret
  183. ; i8
  184. show_i8:    call    read
  185.             call    print_uint8
  186.             ret
  187. ; i16
  188. show_i16:   call    readword
  189.             call    print_uint16
  190.             ret
  191.  
  192. ; imul r16,rm,i16
  193. show_imulrm16:
  194.  
  195.             call    show_r16rm
  196.             ld      a, ','
  197.             call    print_char
  198.             jp      show_i16
  199.  
  200. ; imul r16,rm,i8
  201. show_imulrm8:
  202.  
  203.             call    show_r16rm
  204.             ld      a, ','
  205.             call    print_char
  206.             jp      show_i8sgn
  207.  
  208. ; call|jmp far
  209. show_segoff16:
  210.  
  211.             call    readword
  212.             push    bc
  213.             call    readword
  214.             call    print_uint16
  215.             ld      a, ':'
  216.             call    print_char
  217.             pop     bc
  218.             call    print_uint16
  219.             ret
  220.  
  221. ; Относительный 16 битный
  222. show_rel16: call    readword
  223.             ld      hl, (_param_ip)
  224.             add     hl, bc
  225.             ld      b, h
  226.             ld      c, l
  227.             call    print_uint16
  228.             ret
  229.  
  230. ; enter i16, i8
  231. show_enter: call    show_i16
  232.             ld      a, ','
  233.             call    print_char
  234.             jp      show_i8
  235.  
  236. ; mov al, [m16]
  237. ; -------------------------------------------
  238. show_alm8:  ld      de, name_r8         ; mov al, [hhhh]
  239. .m16:       xor     a
  240.             call    print_nt
  241.             ld      a, ','
  242.             call    print_char
  243.             jp      show_m16
  244. show_m8al:  ld      de, name_r8         ; mov [hhhh], al
  245. .m16:       call    show_m16
  246.             ld      a, ','
  247.             call    print_char
  248.             xor     a
  249.             call    print_nt
  250.             ret
  251. show_axm16: ld      de, name_r16        ; mov ax, [hhhh]
  252.             jr      show_alm8.m16
  253. show_m16ax: ld      de, name_r16        ; mov [hhhh], ax
  254.             jp      show_m8al.m16
  255. show_m16:   ld      a, '['
  256.             call    print_char
  257.             call    show_i16
  258.             ld      a, ']'
  259.             call    print_char
  260.             ret
  261. ; -------------------------------------------
  262.  
  263. ; mov rm, sreg
  264. show_rmsreg:set     0, (ix+1)
  265.             call    load_modrm
  266.             call    print_part_rm
  267.             ld      a, ','
  268.             call    print_char
  269.             ld      a, (_param_reg)
  270.             ld      de, name_seg+2
  271.             call    print_nt
  272.             ret
  273.  
  274. ; mov sreg, rm
  275. show_segrm: set     0, (ix+1)
  276.             call    load_modrm
  277.             ld      a, (_param_reg)
  278.             ld      de, name_seg+2
  279.             call    print_nt
  280.             ld      a, ','
  281.             call    print_char
  282.             call    print_part_rm
  283.             ret
  284. ; pop rm16
  285. show_rm16:  call    load_modrm
  286.             call    print_part_rm
  287.             ret
  288. ; rm8, i8
  289. show_rmi8:  call    show_rmxx
  290.             jp      show_i8
  291. show_rmi16: call    show_rmxx
  292.             jp      show_i16
  293. show_rmxx:  call    load_modrm
  294.             call    print_part_rm
  295.             ld      a, ','
  296.             call    print_char
  297.             ret
  298. ; acc,i8
  299. show_acimm: xor     a
  300.             call    print_register
  301.             ld      a, ','
  302.             call    print_char
  303.             jp      show_i8
  304. ; acc, dx
  305. show_acdx:  xor     a
  306.             call    print_register
  307.             ld      a, ','
  308.             call    print_char
  309.             xor     a
  310.             ld      de, name_r16+2*2
  311.             call    print_nt
  312.             ret
  313. ; imm, acc
  314. show_immac: call    read
  315.             call    print_uint8
  316.             ld      a, ','
  317.             call    print_char
  318.             xor     a
  319.             call    print_register
  320.             ret
  321. ; dx, acc
  322. show_dxac:  xor     a
  323.             ld      de, name_r16+2*2
  324.             call    print_nt
  325.             ld      a, ','
  326.             call    print_char
  327.             xor     a
  328.             call    print_register
  329.             ret
  330. ; C0h-C1h
  331. show_grpc0: call    show_grpsh
  332.             jp      show_i8
  333. ; D0h-D1h
  334. show_grpd0: call    show_grpsh
  335.             ld      a, '1'
  336.             call    print_char
  337.             ret
  338. ; D2h-D3h
  339. show_grpd2: call    show_grpsh
  340.             xor     a
  341.             ld      de, name_r8+2*1
  342.             call    print_nt
  343.             ret
  344.  
  345. ; Мнемоника группы сдвигов
  346. show_grpsh: call    load_modrm
  347.             ld      a, (_param_reg)
  348.             ld      de, name_shift
  349.             call    print_nt
  350.             call    spacexpand
  351.             call    print_part_rm
  352.             ld      a, ','
  353.             call    print_char
  354.             ret
  355.  
  356. ; F6h <modrm>
  357. show_grpf6: call    load_modrm
  358.             ld      a, (_param_reg)
  359.             push    af
  360.             ld      de, name_f6
  361.             call    print_nt
  362.             call    spacexpand
  363.             call    print_part_rm
  364.             pop     af
  365.             cp      2
  366.             ret     nc
  367.             ld      a, ','
  368.             call    print_char
  369.             bit     0, (ix+1)
  370.             jp      nz, show_i16
  371.             jp      show_i8
  372.  
  373. ; FEh <modrm>
  374. show_grpfe: call    load_modrm
  375.             ld      a, (_param_reg)
  376.             cp      2
  377.             jr      c, .ok
  378.             ld      a, 1                    ; DEC
  379. .ok:        ld      de, name_f7             ; INC
  380.             and     a
  381.             jr      z, .prt
  382.             inc     de                      ; DEC
  383.             inc     de
  384. .prt:       xor     a
  385.             call    print_nt
  386.             call    spacexpand
  387.             call    print_part_rm
  388.             ret
  389.  
  390. ; FFh <modrm>
  391. show_grpff: call    load_modrm
  392.             ld      a, (_param_reg)
  393.             ld      de, name_f7
  394.             push    af
  395.             call    print_nt
  396.             call    spacexpand
  397.             pop     af
  398.             call    print_part_rm
  399.             ret
  400.  
  401.             ; Задан A, показать мнемонику из `name_table_ext`
  402. show_0fmnem:
  403.             ld      de, name_table_ext
  404.             call    print_nt
  405.             call    spacexpand
  406.             ret
  407.  
  408. ; D8-DFh ESC/FPU: Все ESC-коды загружают modrm
  409. show_fpu:   call    load_modrm
  410.             ret
  411.  
  412. ; Расширенный опкод
  413. show_0fextend:
  414.  
  415.             call    read
  416.             ld      (_param_opcode), a
  417.             ld      h, 0
  418.             ld      l, a
  419.             ld      de, opcodes_0f_table
  420.             add     hl, hl
  421.             add     hl, de
  422.             ld      a, (hl)
  423.             inc     hl
  424.             ld      h, (hl)
  425.             ld      l, a
  426.             or      h
  427.             ret     z           ; Инструкция не реализована
  428.             jp      (hl)
  429.  
  430. ; 80h-8Fh J<ccc> near i16
  431. ie80h:      ld      a, (_param_opcode)
  432.             and     15
  433.             add     37          ; Здесь мнемоники j<cccc>
  434.             ld      de, name_table
  435.             call    print_nt
  436.             call    spacexpand
  437.             jp      show_rel16
  438.  
  439.             ; RDTSC
  440. ie31:       xor     a
  441.             jp      show_0fmnem
  442.  
  443.  
  444.             ; MOV<z|s>X r8/16, rm
  445. ieb6:       ld      a, 1        ; movzx
  446.             jr      ieb67
  447. iebe:       ld      a, 2        ; movsx
  448. ieb67:      call    show_0fmnem
  449.             call    load_modrm
  450.             ld      a, (ix+1)
  451.             push    af
  452.             set     0, (ix+1)
  453.             call    print_part_reg
  454.             ld      a, ','
  455.             call    print_char
  456.             pop     af
  457.             ld      (ix+1),a
  458.             call    print_part_rm
  459.             ret
  460.  
  461. ; 40-4F CMOV<ccc>
  462. ie40:       ld      a, 3
  463.             ld      de, name_table_ext
  464.             call    print_nt
  465.             ld      a, (_param_opcode)
  466.             and     15
  467.             ld      de, name_cmovccc
  468. .show16:    call    print_nt
  469.             call    spacexpand
  470.             set     0, (ix+1)
  471.             call    show_modrm
  472.             ret
  473.  
  474. ; IMUL r16, rm16
  475. ieaf:       ld      a, 24
  476.             ld      de, name_table
  477.             jr      ie40.show16
  478.  
  479. ; ----------------------------------------------------------------------
  480. ; Переменные
  481. ; ----------------------------------------------------------------------
  482.  
  483. video_cursor:   defw        0
  484.  
  485. ; IX parameters
  486. _start_ix_data:
  487.  
  488. ; Порядок не менять (!)
  489. _param_opcode:  defb        0   ; +0
  490. _param_bitdir:  defb        0   ; +1 Битность=0 / Направление=1
  491. _param_cnt:     defb        0   ; +2
  492. _param_segpfx:  defb        0   ; +3
  493. _param_mod:     defb        0   ; +4
  494. _param_reg:     defb        0   ; +5
  495. _param_r_m:     defb        0   ; +6
  496.