?login_element?

Subversion Repositories NedoOS

Rev

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

  1. ; ----------------------------------------------------------------------
  2. ; Печать строк из HL
  3. ; ----------------------------------------------------------------------
  4.  
  5. print:      ld      a, (hl)
  6.             and     a
  7.             ret     z
  8.             call    print_char
  9.             inc     hl
  10.             jr      print
  11.  
  12. ; ----------------------------------------------------------------------
  13. ; Задается некий NameTable = DE
  14. ; A = ID кода для пропечатки
  15. ; ----------------------------------------------------------------------
  16.  
  17. print_nt:   push    hl
  18.             ld      l, a
  19.             ld      h, 0
  20.             add     hl, hl
  21.             add     hl, de
  22.             ld      a, (hl)
  23.             inc     hl
  24.             ld      h, (hl)
  25.             ld      l, a
  26.             call    print
  27.             pop     hl
  28.             ret
  29.  
  30. ; ----------------------------------------------------------------------
  31. ; Вывод [unsigned] int hex 8 на-гора
  32. ; ----------------------------------------------------------------------
  33.  
  34. ; === Печать signed int 16
  35. print_int16:
  36.  
  37.             push    af
  38.             ld      a, b
  39.             cp      $80
  40.             jr      c, .plus
  41.             ld      a, '-'
  42.             call    print_char
  43.             ; BC = (BC ^ FFFF) + 1 = -BC
  44.             ld      a, b
  45.             xor     255
  46.             ld      b, a
  47.             ld      a, c
  48.             xor     255
  49.             add     1
  50.             ld      c, a
  51.             ld      a, b
  52.             adc     0
  53.             ld      b, a
  54.             jr      .prt
  55. .plus:      ld      a, '+'
  56.             call    print_char
  57. .prt:       call    print_sharp
  58.             call    print_uint16.nosharp
  59.             pop     af
  60.             ret
  61.  
  62. ; ==== Печать Signed A
  63. print_int8: push    af
  64.             cp      $80
  65.             jr      c, .plus
  66.             neg
  67.             push    af
  68.             ld      a, '-'
  69.             call    print_char
  70.             pop     af
  71.             jr      .minus
  72. .plus:      push    af
  73.             ld      a, '+'
  74.             call    print_char
  75.             pop     af
  76. .minus:     call    print_sharp
  77.             call    print_uint8.nosharp
  78.             pop     af
  79.             ret
  80.  
  81. ; ==== Печать BC
  82. print_uint16:
  83.             call    print_sharp
  84. .nosharp:   push    af
  85.             push    bc
  86.             ld      a, b
  87.             call    print_uint8.nosharp
  88.             ld      a, c
  89.             call    print_uint8.nosharp
  90.             pop     bc
  91.             pop     af
  92.             ret
  93.  
  94. ; ==== Печать A[7:0]
  95. print_uint8:
  96.             call    print_sharp
  97. .nosharp:   push    af
  98.             rlca
  99.             rlca
  100.             rlca
  101.             rlca
  102.             call    print_nibble
  103.             pop     af
  104.             call    print_nibble
  105.             ret
  106.  
  107. ; ==== Печать A[3:0]
  108. print_nibble:
  109.  
  110.             push    af
  111.             and     15              ; Получение только 3:0
  112.             or      a               ; Сброс AF=0
  113.             daa                     ; Коррекция если >9
  114.             add     0xf0            ; Если больше чем >9, то CF=1
  115.             adc     0x40            ; 0..9 => 30..39, а если CF=1, то с 41..46
  116.             call    print_char
  117.             pop     af
  118.             ret
  119.  
  120. print_sharp:                        ; Печатать решетку #
  121.             push    af
  122.             ld      a, '#'
  123.             call    print_char
  124.             pop     af
  125.             ret
  126.  
  127. ; Печать регистра A=0..7; 8/16
  128. print_register:
  129.  
  130.             push    af
  131.             ld      de, name_r8
  132.             ld      a, (_param_bitdir)      ; Получим параметры bit/dir
  133.             and     1
  134.             jr      z, .is8bit
  135.             ld      de, name_r16            ; Выбрать таблицу с 16 битными регистрами
  136. .is8bit:    pop     af
  137.             call    print_nt
  138.             ret
  139.  
  140. ; Расширение знака A -> BC
  141. signextend: ld      b, 0
  142.             ld      c, a
  143.             bit     7, a
  144.             ret     z
  145.             dec     b
  146.             ret
  147.  
  148. ; Дополнение мнемоники пробелами
  149. spacexpand: ld      a, (_param_cnt)
  150.             sub     7
  151.             jr      nc, .nopad
  152.             neg                 ; a = 7-<cnt>
  153.             ld      b, a
  154.             ld      a, ' '
  155. .sppad:     call    print_char
  156.             djnz    .sppad
  157.  
  158.             ; Всегда печатать пробел после мнемоники
  159. .nopad:     ld      a, ' '
  160.             call    print_char
  161.             ret
  162.  
  163. ; Чтение слова в BC
  164. readword:   call    read
  165.             ld      c, a
  166.             call    read
  167.             ld      b, a
  168.             ret
  169.  
  170. ; ----------------------------------------------------------------------
  171. ; Вывести modrm в поток
  172. ; ----------------------------------------------------------------------
  173.  
  174. show_modrm: ; Читаем байт modrm
  175.             call    load_modrm
  176.  
  177.             ; Проверяем направление
  178. .ready:     ld      a, (ix+1)
  179.             and     2
  180.             jr      nz, .dir2
  181.  
  182.             ; DIR=0
  183.             call    print_part_rm
  184.             ld      a, ','
  185.             call    print_char
  186.             call    print_part_reg
  187.             ret
  188.  
  189.             ; DIR=1
  190. .dir2:      call    print_part_reg
  191.             ld      a, ','
  192.             call    print_char
  193.             call    print_part_rm
  194.             ret
  195.  
  196. ; Печать r/m части modrm
  197. print_part_rm:
  198.  
  199.             ld      de, name_modrm_table
  200.             ld      a, (_param_mod)
  201.             and     a
  202.             jr      z, modrm_mod0
  203.             dec     a
  204.             jr      z, modrm_mod1
  205.             dec     a
  206.             jr      z, modrm_mod2
  207.             jr      modrm_mod3
  208.  
  209. ; ============ Нет Displacement
  210. modrm_mod0: call    modrm_leader
  211.             ld      a, (_param_r_m)
  212.             cp      6
  213.             jr      nz, .mm0s
  214.             call    read            ; Режим 6 => 16-битный адрес
  215.             ld      c, a
  216.             call    read
  217.             ld      b, a
  218.             call    print_uint16
  219.             jr      .mm1s
  220. .mm0s:      call    print_nt
  221. .mm1s:      ld      a, ']'
  222.             call    print_char
  223.             ret
  224.  
  225. ; ============= Displacement 8
  226. modrm_mod1: call    modrm_leader
  227.             ld      a, (_param_r_m)
  228.             call    print_nt
  229.             call    read
  230.             call    print_int8
  231.             jr      modrm_mod0.mm1s
  232.  
  233. ; ============= Displacement 16
  234. modrm_mod2: call    modrm_leader
  235.             ld      a, (_param_r_m)
  236.             call    print_nt
  237.             call    read            ; 16-битный адрес
  238.             ld      c, a
  239.             call    read
  240.             ld      b, a
  241.             call    print_int16
  242.             jr      modrm_mod0.mm1s
  243.  
  244. ; ============= Register
  245. modrm_mod3: ld      a, (_param_r_m)
  246.             call    print_register
  247.             ret
  248.  
  249. ; Печать сегментного префикса
  250. modrm_leader:
  251.             ld      de, name_modrm_table
  252.             bit     0, (ix+1) ; bitdir
  253.             ld      a, 8
  254.             jr      z, .bytep
  255.             ld      a, 9
  256. .bytep:     call    print_nt
  257.             ld      a, '['
  258.             call    print_char
  259.             ld      a, (_param_segpfx)
  260.             and     a
  261.             ret     z
  262.             push    de
  263.             ld      de, name_seg
  264.             call    print_nt
  265.             ld      a, ':'
  266.             call    print_char
  267.             pop     de
  268.             ret
  269.  
  270. ; ----------------------------------------------------------------------
  271. ; Загрузка modrm и разбор
  272. ; ----------------------------------------------------------------------
  273.  
  274. load_modrm:
  275.  
  276.             call    read
  277.             push    bc
  278.             ld      b, a
  279.             and     7
  280.             ld      (_param_r_m), a
  281.             ld      a, b
  282.             rrca
  283.             rrca
  284.             rrca
  285.             ld      b, a
  286.             and     7
  287.             ld      (_param_reg), a
  288.             ld      a, b
  289.             rrca
  290.             rrca
  291.             rrca
  292.             and     3
  293.             ld      (_param_mod), a
  294.             pop     bc
  295.             ret
  296.  
  297. ; Выдача регистра A в зависимости от DIR
  298. print_part_reg:
  299.  
  300.             ld      a, (_param_reg)
  301.             call    print_register
  302.             ret
  303.  
  304. ; ----------------------------------------------------------------------
  305. ; Вычисление сегментного префикса, если он есть
  306. ; ----------------------------------------------------------------------
  307. deb_setprefix:
  308.  
  309.             ld      b, 1
  310.             cp      $26
  311.             jr      z, .set     ; es=1
  312.             inc     b
  313.             cp      $2e
  314.             jr      z, .set     ; cs
  315.             inc     b
  316.             cp      $36
  317.             jr      z, .set     ; ss
  318.             inc     b
  319.             cp      $3e
  320.             jr      z, .set     ; ds
  321.             inc     b
  322.             cp      $64
  323.             jr      z, .set     ; fs
  324.             inc     b
  325.             cp      $65
  326.             jr      z, .set     ; gs
  327.             cp      $66
  328.             jr      z, .opsize
  329.             cp      $67
  330.             jr      z, .adsize
  331.             ret                 ; ZF=0
  332. .set:       ld      a, b
  333.             ld      (_param_segpfx), a
  334.             ret                 ; ZF=1
  335. .opsize:    ret                 ; Расширение до 32-х бит не реализовано
  336. .adsize:    ret                 ; Расширение до 32-х бит не реализовано
  337.