8086 qemu我自己的键盘中断处理程序

时间:2014-05-15 20:44:42

标签: keyboard qemu x86-16

我正在尝试编写一个bootloader,它只是一个设置自己的keybord中断处理程序并处理键盘按下的程序。 但是我迷路了。

这个没有通过写入视频RAM来响应键盘按下。

 org 7c00h ; BOOT PROGRAM

            mov ax,03h
            int 10h ; 80x25 video mode
            mov ax,1112h;
            int 10h ; 80x50 video mode



            cli ; Zakaz preruseni
            mov word[ds:20h],keyboard_handler ; nastaveni INT9 na moji funkci
            mov word[ds:22h],0h         
            sti

            jmp $

keyboard_handler:
            cli
            push ax
            push dx
            push bx

            in al,60h

            mov dx,0b800h
            mov es,dx
            mov dx,0000h
            mov ds,dx

            mov dl,10h
            div dl; al+ah
            add ax,3030h

            mov dl,ah

            cmp al,3ah
            jl not_add 
            add al,7h
not_add     cmp dl,3ah  
            jl not_add2
            add dl,7h

not_add2    mov ah,21h
            mov dh,21h

            mov bx,[ds:vidoff]

            mov word[es:bx],ax
            add bx,2h
            mov word[es:bx],dx
            add bx,2h

            mov word[ds:vidoff],bx


            ;finalizing code
            mov al,20h
            out 20h,al ;odhlaseni preruseni

            ;mov word ax,[ds:22h]
            ;mov cs,ax
            ;mov ds,ax
            ;mov ss,ax
            ;mov es,ax

            pop bx
            pop dx
            pop ax
            sti
            iret

 vidoff dw 0FF0h 

times 510-($-$$) db 0
dw 0AA55h

而且这个很乱,但是当没有按下任何按键时它仍然写入视频RAM。但是,如果按一个键,至少它会通过扫描码并相应地写入视频RAM来响应我的按键。然后它再次继续,好像连续按下某个键一样。

org 7c00h ; BOOT PROGRAM

            ;++++++ Nastaveni video mode 80x50 a INT9(co reaguje na klavesnici pomoci preruseni IRQ1)
            mov ax,03h
            int 10h ; 80x25 video mode
            mov ax,1112h;
            int 10h ; 80x50 video mode

            mov dx,0b800h
            mov es,dx
            mov dx,0h
            mov ds,dx   

            mov di,0FF0h

            mov bx,0h
            mov ds,bx
            cli ; Zakaz preruseni
            mov word[ds:20h],keyboard_handler ; nastaveni INT9 na moji funkci
            mov word[ds:22h],0h         
            sti
                    ; Povoleni preruseni
            jmp $

keyboard_handler:   
            push es
            push ax
            mov ax,0h
            in al,60h           

            mov ch,10h
            div ch
            mov byte[prvni_cislice],al
            mov byte[druha_cislice],ah

            mov ch,al
            mov cl,0dbh
            mov word[barva_cislice],cx

            mov bl,ah
            mov bh,0dbh
            cmp cx,bx
            jne normal 
            xor ch,0fh
            mov bh,ch
normal      mov word[barva_podkladu],bx

            mov word[es:di],bx
            add di,2h

            mov al,20h
            out 20h,al ;odhlaseni preruseni

            pop ax
            pop es
            iret


;hexacislice            
prvni_cislice db 0h
druha_cislice db 0h 

;hotove znaky
barva_podkladu dw 0h
barva_cislice dw 0h

offset_radku dw 0h

PRNGseed dw 0h

times 510-($-$$) db 0
dw 0AA55h

我做错了什么?我忘记了什么吗?在其他一些代码中我看到有人加了,61h或类似的东西,我不知道那是做什么的。

1 个答案:

答案 0 :(得分:0)

这些程序的最大问题是您没有设置键盘中断!相反,你正在搞乱系统定时器中断。

mov word[ds:20h],keyboard_handler ; nastaveni INT9 na moji funkci
mov word[ds:22h],0h

更好地利用这个:

mov word[ds:24h],keyboard_handler
mov word[ds:26h],0h

您编写的其他代码对不会说您的母语的人构成了真正的挑战。请使用仅英文名称作为标签和变量。 在代码中也有慷慨的评论。它们使阅读变得更加容易,从而增加了获得答案的机会。