hallo,
ich habe mal wieder ein problem mit meinem OS. und zwar wird der keyboard interrupt (0x21) nicht ausgelöst. die idt selbst ist denke ich nicht fehlerhaft, weil die exceptions aufgerufen werden.
hier einmal ein paar ausschnitte aus dem source (bitte nicht an den kommentaren stören lassen):
meine IDT
macro idtEntry func ; <- Tight
{
dw (func and 0xFFFF)
dw codesel
db 0
db 0x8E
dw (func shr 16)
}
idt_pointer:
dw idt_end - idt_start - 1
dd idt_start
idt_start:
idtEntry u_isr ; 00. Interrupt (exception)
idtEntry u_isr ; 01. Interrupt (exception)
idtEntry u_isr ; 02. Interrupt (exception)
idtEntry u_isr ; 03. Interrupt (exception)
idtEntry u_isr ; 04. Interrupt (exception)
idtEntry u_isr ; 05. Interrupt (exception)
idtEntry u_isr ; 06. Interrupt (exception)
idtEntry u_isr ; 07. Interrupt (exception)
idtEntry u_isr ; 08. Interrupt (exception)
idtEntry u_isr ; 09. Interrupt (exception)
idtEntry u_isr ; 0A. Interrupt (exception)
idtEntry u_isr ; 0B. Interrupt (exception)
idtEntry u_isr ; 0C. Interrupt (exception)
idtEntry u_isr ; 0D. Interrupt (exception)
idtEntry u_isr ; 0E. Interrupt (exception)
idtEntry u_isr ; 0F. Interrupt (exception)
idtEntry u_isr ; 10. Interrupt (exception)
idtEntry u_isr ; 11. Interrupt (exception)
idtEntry u_isr ; 12. Interrupt (exception)
idtEntry u_isr ; 13. Interrupt (exception)
idtEntry u_isr ; 14. Interrupt (exception)
idtEntry u_isr ; 15. Interrupt (exception)
idtEntry u_isr ; 16. Interrupt (exception)
idtEntry u_isr ; 17. Interrupt (exception)
idtEntry u_isr ; 18. Interrupt (exception)
idtEntry u_isr ; 19. Interrupt (exception)
idtEntry u_isr ; 1A. Interrupt (no good)
idtEntry u_isr ; 1B. Interrupt (no good)
idtEntry u_isr ; 1C. Interrupt (no good)
idtEntry u_isr ; 1D. Interrupt (no good)
idtEntry u_isr ; 1E. Interrupt (no good)
idtEntry u_isr ; 1F. Interrupt (no good)
idtEntry isr20 ; 20. Interrupt (timer)
idtEntry isr21 ; 21. Interrupt (keyboard)
idtEntry donothing ; 22. stupid shit
idtEntry donothing ; 23. "
idtEntry donothing ; 24. "
idtEntry donothing ; 25. "
idtEntry donothing ; 26. "
idtEntry donothing ; 27. "
idtEntry donothing ; 28. "
idtEntry donothing ; 29. "
idtEntry donothing ; 2A. "
idtEntry donothing ; 2B. "
idtEntry donothing ; 2C. "
idtEntry donothing ; 2D. "
idtEntry donothing ; 2E. "
idtEntry donothing ; 2F. "
idtEntry donothing ; 30. "
idtEntry donothing ; 31. "
idtEntry isr32 ; 32. Interrupt (my own (roflrofl))
idt_end:
die keyboard-isr:
isr21:
push esi
push eax
push gs
push fs
push ds
push es
xor al, al
div al
xor eax, eax
in al, 0x60
mov esi, kit ; I love blood
mov al, 0x07 ; in grey
call print_text ; kill
mov al, 0x20
out 0x20, al
pop es
pop ds
pop fs
pop gs
pop eax
pop esi
iret
das remappen von den pics:
remap_pics:
push eax
push ebx
push ecx
; ICW 1
mov al, 0x11
out 0x20, al
out 0xA0, al
; ICW 2
mov al, 0x20 ; Pic1, isr0 - isr7 TO int0x20 - int0x27
out 0x21, al
mov al, 0x28 ; Pic2, isr8 - isr15 TO int0x28 - int0x30
out 0xA1, al
; ICW 3
mov al, 0x04
out 0x21, al
mov al, 0x02
out 0xA1, al
; ICW 4
mov al, 0x01
out 0x21, al
out 0xA1, al
pop ecx
pop ebx
pop eax
ret
edit:
hab doch glatt vergessen, das an-/ausschalten von den irqs mit zu senden
hier:
; Disable all Irqs
disable_irqs:
push eax
mov al, 0xFF
out 0x21, al
out 0xA1, al
pop eax
ret
; Enable all Irqs
enable_irqs:
push eax
mov al, 0x00
out 0x21, al
out 0xA1, al
pop eax
ret
so, das wars schon, ich hoffe ihr könnt mir helfen
mfg