Keyboard Input in PM

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
jako3xb2
Posts: 3
Joined: Sat Jun 13, 2009 1:02 pm

Keyboard Input in PM

Post by jako3xb2 »

I wrote a little keyboard driver to not use interrupts.
Why does this only in Real Mode work? I didn't use interrupts.

Code: Select all

cli

mov bx, 0
mov ax, 0xb800
mov ds, ax
xor si, si 	;si = 0

anf:


	mov dx, 0x64
	in al, dx
	and al, 1
	cmp al, 0
	je anf
	mov dx, 0x60
	in al, dx

	xor bx, 1
	cmp bx, 0
	je anf


	cmp al, 0x1E 	;'A'
	je a
	cmp al, 0x30
	je b
	cmp al, 0x2E
	je c
	cmp al, 0x20
	je d
	cmp al, 0x12
	je e
	cmp al, 0x21
	je f
	cmp al, 0x22
	je g
	cmp al, 0x23
	je h
	cmp al, 0x17
	je i
	cmp al, 0x24
	je j
	cmp al, 0x25
	je k
	cmp al, 0x26
	je l
	cmp al, 0x32
	je m
	cmp al, 0x31
	je n
	cmp al, 0x18
	je o
	cmp al, 0x19
	je p
	cmp al, 0x10
	je q
	cmp al, 0x13
	je r
	cmp al, 0x1F
	je s
	cmp al, 0x14
	je t
	cmp al, 0x16
	je u
	cmp al, 0x2F
	je v
	cmp al, 0x11
	je w
	cmp al, 0x2D
	je x
	cmp al, 0x15
	je y
	cmp al, 0x2C
	je z
	mov cl,'-'

abc:
	mov [si], cl
	inc si
	inc si
	cmp si, 4000
	jne anf
	xor si, si
	jmp anf

a:
	mov cl, 'a'	
	jmp abc

b:
	mov cl, 'b'
	jmp abc

c:
	mov cl, 'c'
	jmp abc

d:
	mov cl, 'd'
	jmp abc

e:
	mov cl, 'e'
	jmp abc

f:
	mov cl, 'f'
	jmp abc

g:
	mov cl, 'g'
	jmp abc

h:
	mov cl, 'h'
	jmp abc

i:
	mov cl, 'i'
	jmp abc

j:
	mov cl, 'j'
	jmp abc

k:
	mov cl, 'k'
	jmp abc

l:
	mov cl, 'l'
	jmp abc

m:
	mov cl, 'm'
	jmp abc

n:
	mov cl, 'n'
	jmp abc

o:
	mov cl, 'o'
	jmp abc

p:
	mov cl, 'p'
	jmp abc

q:
	mov cl, 'q'
	jmp abc

r:
	mov cl, 'r'
	jmp abc

s:
	mov cl, 's'
	jmp abc

t:
	mov cl, 't'
	jmp abc

u:
	mov cl, 'u'
	jmp abc

v:
	mov cl, 'v'
	jmp abc

w:
	mov cl, 'w'
	jmp abc

x:
	mov cl, 'x'
	jmp abc

y:
	mov cl, 'y'
	jmp abc

z:
	mov cl, 'z'
	jmp abc

;times 510-($-$$) db 0   ;you can boot it!
;dw 0xAA55
User avatar
neon
Member
Member
Posts: 1567
Joined: Sun Feb 18, 2007 7:28 pm
Contact:

Re: Keyboard Input in PM

Post by neon »

Protected mode does not use segment:offset addressing that real mode uses. Your code uses [si] for an offset, so change:

Code: Select all

mov ax, 0xb800
mov ds, ax
xor esi, esi
to:

Code: Select all

mov esi, 0xb8000
Also, that code can be written much more cleaner ;)

*edit: also, you will need to use esi instead of si because 0xb8000 linear is to large for si.
OS Development Series | Wiki | os | ncc
char c[2]={"\x90\xC3"};int main(){void(*f)()=(void(__cdecl*)(void))(void*)&c;f();}
jako3xb2
Posts: 3
Joined: Sat Jun 13, 2009 1:02 pm

Re: Keyboard Input in PM

Post by jako3xb2 »

YES, thank you! :D

[EDIT:]
I have another question. Why does "out 60h, 0" not work?
User avatar
neon
Member
Member
Posts: 1567
Joined: Sun Feb 18, 2007 7:28 pm
Contact:

Re: Keyboard Input in PM

Post by neon »

jako3xb2 wrote:I have another question. Why does "out 60h, 0" not work?
Its not a valid format of the instruction. The instruction only has two general formats (defined by Intel anyways)...

Code: Select all

out imm8, al/ax/eax
out dl/dx/edx, al/ax/eax
OS Development Series | Wiki | os | ncc
char c[2]={"\x90\xC3"};int main(){void(*f)()=(void(__cdecl*)(void))(void*)&c;f();}
Post Reply