Почему курсор не перемещается вертикально на реальном оборудовании, а на виртуальной машине? - PullRequest
0 голосов
/ 02 января 2019

Я хочу реализовать перемещение курсора с помощью клавиш в моей ОС.Я попробовал этот код, чтобы сделать это:

mouse:
mov ah,0h
int 16h

    cmp al, 107
    je Down


    cmp al, 105
    je Up


    cmp al, 106
    je Left


    cmp al, 108
    je Right

    jmp mouse

    Right:
        add dl, 1
        call SetCursor
        jmp mouse
        ret

    Left:
      sub dl, 1
      call SetCursor
      jmp mouse
      ret

   Up:
     sub dh, 1
     call SetCursor
     jmp mouse
     ret

   Down:
      add dh, 1
      call SetCursor
      jmp mouse
      ret

   SetCursor:
       mov ah, 02h
       mov bh, 00
       int 10h
       ret

Bootloader (небольшая часть):

%include "stage2info.inc"

STAGE2_LOAD_SEG  equ STAGE2_ABS_ADDR>>4

.stage2_loaded:
    mov ax, STAGE2_RUN_SEG      
    mov ds, ax
    mov es, ax
    jmp STAGE2_RUN_SEG:STAGE2_RUN_OFS

TIMES 510-($-$$) db  0
dw 0xaa55

Почему курсор не перемещается вертикально на реальном оборудовании, а на виртуальноммашина?Я пытался изменить ключи, но ничего, то же самое.Почему код не работает на реальном оборудовании?Мой код неверен?

1 Ответ

0 голосов
/ 02 января 2019

Проблемы и комментарии:

  • Чтобы проверить наличие клавиш со стрелками, вам нужно взглянуть на коды сканирования в AH, а не на символы ASCII в AL. Коды сканирования: 0x50 для уменьшения, 0x48 для увеличения, 0x4b для левого и 0x4d для правого
  • Вы не инициализируете DH и DL до входа в цикл мыши. Получить текущие координаты с помощью Int 10h / AH = 3h перед входом в цикл
  • Вы не проверяете границы, выходящие за верхний, левый, правый и нижний края экрана, поэтому, если курсор выходит за границы, могут произойти непредвиденные ситуации
  • У вас есть ненужные ret инструкции после jmp mouse, которые никогда не могут быть достигнуты.
  • Вы можете использовать INC и DEC для добавления или вычитания единицы из регистра вместо использования ADD и SUB с значение 1.
  • Для людей, просматривающих вопрос, используемый загрузчик - это шаблон, который я собрал в этом ответе Stackoverflow .

Этот код должен работать:

%include "stage2info.inc"
ORG STAGE2_RUN_OFS

BITS 16

MAX_ROW equ 25                  ; 80x25 screen extents
MAX_COL equ 80

mouse:
    mov ah, 3                   ; Get cursor BIOS call
    mov bh, 0                   ; Page number is zero
    int 10h                     ; DH and DL will be set to current coordinates.

    mov ah,0h
    int 16h

    cmp ah, 0x50
    je Down

    cmp ah, 0x48
    je Up

    cmp ah, 0x4b
    je Left

    cmp ah, 0x4d
    je Right

    jmp mouse

    Right:
      inc dl
      cmp dl, MAX_COL           ; Test for right edge.
      jl right_bound_ok
      mov dl, MAX_COL-1
    right_bound_ok:
      call SetCursor
      jmp mouse

    Left:
      dec dl
      jge left_bound_ok         ; Test for left edge (<0?)

      mov dl, 0
    left_bound_ok:
      call SetCursor
      jmp mouse

    Up:
      dec dh
      jge up_bound_ok           ; Test for upper edge (<0?)

      mov dh, 0
    up_bound_ok:
      call SetCursor
      jmp mouse

    Down:
      inc dh
      cmp dh, MAX_ROW           ; Test for bottom edge
      jl down_bound_ok
      mov dh, MAX_ROW-1
    down_bound_ok:
      call SetCursor
      jmp mouse

    SetCursor:
      mov ah, 02h
      mov bh, 00
      int 10h
      ret
...