Я пишу ядро в сборке 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
, я не могу затем вернуться к видимому курсору.