Курсор текстового режима исчезает после установки режима видео или очистки экрана - PullRequest
2 голосов
/ 04 мая 2019

Я пишу ядро ​​в сборке x86, и оно должно показывать приветственное сообщение, ждать нажатия клавиши, очищать экран и печатать ввод с клавиатуры. Пока это все работает, пока экран не очистится. В частности, после очистки экрана курсор удаляется.

Сначала я попытался использовать этот код для очистки экрана:

mov ah, 0x06
mov al, 0x00
mov cx, 0x00
mov dh, 0x19
mov dl, 0x50
int 0x10

Это очищает экран, однако курсор больше не отображается и ввод с клавиатуры не отображается. Я попытался переустановить режим видео вместо:

mov ah, 0x00
mov al, 0x03
int 0x10

Это также очищает экран, и отображается ввод с клавиатуры, но курсор все еще скрыт. Я попытался использовать этот код для отображения:

mov ah, 0x01
mov ch, 0x06
int 0x10

Это все еще не показывало бы курсор. Как бы я отобразил курсор или очистил экран так, чтобы он по-прежнему отображался?

ОБНОВЛЕНИЕ: Мой код:

kernel_main:
    mov ax, 0x07C0
    add ax, 288
    mov ss, ax
    mov sp, 4096

    mov ax, 0x07C0
    mov ds, ax

    mov si, kern_inst
    call print_str
    call pause_key
    call clear_screen

    call function

    mov si, kern_fin
    call print_str

.data:
    kern_inst db "Tap any key to begin the program.", 0
    kern_fin db "The program successfully finished.", 0

function:
    call solid_cursor
    call print_input
    call hide_cursor
    call print_input

    ret

print_str:
    pusha
    mov ah, 0x0E

.repeat:
    lodsb
    cmp al, 0
    je .ret
    int 0x10
    jmp .repeat

.ret:
    popa
    ret

print_input:
    pusha

.repeat:
    mov ah, 0x00
    int 0x16
    cmp al, 0x0D
    je .ret
    mov ah, 0x0E
    int 0x10
    jmp .repeat

.ret:
    popa
    ret

clear_screen:
    pusha
    mov ah, 0x06
    mov al, 0x00
    mov bh, 0x07
    mov cx, 0x00
    mov dh, 0x19
    mov dl, 0x50
    int 0x10
    mov ah, 0x02
    mov bh, 0x00
    mov dx, 0x00
    int 0x10
    popa
    ret

solid_cursor:
    pusha
    mov ah, 0x01
    mov ch, 0x06
    int 0x10
    popa
    ret

hide_cursor:
    pusha
    mov ah, 0x01
    mov ch, 0x26
    int 0x10
    popa
    ret

pause_key:
    push ax
    mov ah, 0x00
    int 0x16
    pop ax
    ret

Я обнаружил, что удаление процедуры solid_cursor сделает курсор видимым; однако, когда я намеренно делаю курсор невидимым с помощью hide_cursor, я не могу затем вернуться к видимому курсору.

1 Ответ

1 голос
/ 05 мая 2019

Вам не нужен BIOS для очистки экрана. Просто напишите нули в видеобуфере на B800: 0. Это намного быстрее:

xor di, di
mov bx, 0b800h
mov es, bx
mov cx, 2000
mov ax, 0720h ; black background 0 / grey foreground 7 / space character (0x20)
rep stosw
...